Spesso si sente che OOP corrisponde naturalmente al modo in cui le persone pensano al mondo. Ma sarei fortemente in disaccordo con questa affermazione: noi (o almeno io) concettualizziamo il mondo in termini di relazioni tra le cose che incontriamo, ma l'obiettivo di OOP è progettare le singole classi e le loro gerarchie.
Si noti che, nella vita di tutti i giorni, le relazioni e le azioni esistono principalmente tra oggetti che sarebbero stati casi di classi non correlate in OOP. Esempi di tali relazioni sono: "il mio schermo è in cima al tavolo"; "Io (un essere umano) sono seduto su una sedia"; "un'auto è sulla strada"; "Sto scrivendo sulla tastiera"; "la macchina da caffè bolle acqua", "il testo è mostrato nella finestra del terminale".
Pensiamo in termini di verbi bivalenti (a volte trivalenti, come, ad esempio, in "Ti ho dato dei fiori") in cui il verbo è l'azione (relazione) che opera su due oggetti per produrre un risultato / azione. L' attenzione si concentra sull'azione e i due (o tre) oggetti [grammaticali] hanno uguale importanza.
In contrasto con OOP, dove devi prima trovare un oggetto (sostantivo) e dirgli di eseguire un'azione su un altro oggetto. Il modo di pensare viene spostato dalle azioni / dai verbi che operano sui sostantivi ai sostantivi che operano sui sostantivi - è come se tutto fosse detto con voce passiva o riflessiva, ad esempio "il testo viene mostrato dalla finestra del terminale". O forse "il testo si disegna sulla finestra del terminale".
Non solo il focus è spostato sui nomi, ma uno dei nomi (chiamiamolo soggetto grammaticale) ha una "importanza" maggiore dell'altro (oggetto grammaticale). Quindi si deve decidere se dirà terminalWindow.show (someText) o someText.show (terminalWindow). Ma perché caricare le persone con decisioni così banali senza conseguenze operative quando si intende davvero show (terminalWindow, someText)? [Le conseguenze sono operativamente insignificanti - in entrambi i casi il testo è mostrato nella finestra del terminale - ma può essere molto serio nella progettazione delle gerarchie di classi e una scelta "sbagliata" può portare a un codice contorto e difficile da mantenere.]
Direi quindi che il modo tradizionale di fare OOP (basato sulla classe, single-dispatch) è difficile perché NON È NATURALE e non corrisponde a come gli umani pensano del mondo. I metodi generici di CLOS sono più vicini al mio modo di pensare, ma purtroppo questo non è un approccio diffuso.
Dati questi problemi, come / perché è accaduto che l'attuale modo tradizionale di fare OOP è diventato così popolare? E cosa si può fare per detronizzarlo?