Ho trovato questa citazione in " La gioia del 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] L'aspetto negativo della programmazione orientata agli oggetti è lo stretto accoppiamento tra funzione e dati.
Capisco perché l'accoppiamento non necessario è negativo 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 alle classi sia intrinsecamente negativo.
Voglio dire, aggiungere una funzione a una classe sembra taggare un messaggio in Gmail o incollare un file in una cartella. È una tecnica organizzativa che ti aiuta a ritrovarla. Scegli alcuni criteri, quindi metti insieme cose simili. Prima di OOP, i nostri programmi erano praticamente grandi quantità di metodi nei file. Voglio dire, devi mettere le funzioni da qualche parte. Perché non organizzarli?
Se si tratta di un attacco velato ai tipi, perché non dicono semplicemente che limitare il tipo di input e output a una funzione è sbagliato? Non sono sicuro che potrei essere d'accordo con questo, ma almeno ho familiarità con argomenti di sicurezza pro e contro. Questo 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 piccolo inconveniente.
Quindi, Clojure ha spazi dei nomi. In che modo attaccare una funzione su una classe in OOP è diverso dall'attaccare una funzione in uno spazio dei nomi in Clojure e perché è così male? Ricorda, le funzioni di una classe non operano necessariamente solo sui membri di quella classe. Guarda java.lang.StringBuilder: funziona su qualsiasi tipo di riferimento, o tramite l'auto-boxing, su qualsiasi tipo.
PS Questa citazione fa riferimento a un libro che non ho letto: Programmazione multiparadigm in Leda: Timothy Budd, 1995 .