Ho trovato questa citazione in " La gioia di Clojure "a p. 32, ma qualcuno mi ha detto la stessa cosa a cena la scorsa settimana e l'ho sentito anche in altri posti:
[A] downside to object-oriented programming is the tight coupling between function and data.
Capisco perché l'accoppiamento non necessario è cattivo in un'applicazione. Inoltre, mi sento a mio agio nel dire che lo stato mutevole e l'ereditarietà dovrebbero essere evitati, anche nella programmazione orientata agli oggetti. Ma non riesco a capire perché attaccare le funzioni sulle classi sia intrinsecamente sbagliato.
Voglio dire, aggiungere una funzione a una classe sembra taggare una mail in Gmail o incollare un file in una cartella. È una tecnica organizzativa che ti aiuta a ritrovarla. Scegli alcuni criteri, poi metti insieme le cose. Prima di OOP, i nostri programmi erano praticamente dei grandi pacchetti di metodi nei file. Voglio dire, devi mettere le funzioni da qualche parte. Perché non organizzarli?
Se questo è un attacco velato sui tipi, perché non dicono semplicemente che limitare il tipo di input e output a una funzione è sbagliato? Non sono sicuro di poter essere d'accordo, ma almeno ho familiarità con argomenti pro e con type safety. Mi sembra una preoccupazione per lo più separata.
Certo, a volte le persone sbagliano e mettono la funzionalità nella classe sbagliata. Ma rispetto ad altri errori, questo sembra un inconveniente molto piccolo.
Quindi, Clojure ha spazi dei nomi. In che modo si configura una funzione in una classe in OOP diversa dall'appiccare una funzione in uno spazio dei nomi in Clojure e perché è così brutto? Ricorda, le funzioni in una classe non operano necessariamente solo sui membri di quella classe. Guarda java.lang.StringBuilder: funziona su qualsiasi tipo di riferimento, o tramite auto-boxing, su qualsiasi tipo.
P.S. Questa citazione fa riferimento a un libro che non ho letto: Programmazione multiparadigm a Leda: Timothy Budd, 1995 .