Я нашел эту цитату в « Радости Clojure » на с. 32, но кто-то сказал мне то же самое за ужином на прошлой неделе, и я слышал это и в других местах:
Недостатком объектно-ориентированного программирования является тесная связь между функцией и данными.
Я понимаю, почему ненужное соединение плохо в приложении. Также я могу с уверенностью сказать, что изменяемого состояния и наследования следует избегать даже в объектно-ориентированном программировании. Но я не понимаю, почему прикрепление функций к классам изначально плохо.
Я имею в виду, добавление функции к классу похоже на пометку почты в Gmail или наложение файла в папке. Это организационная техника, которая помогает вам снова ее найти. Вы выбираете некоторые критерии, а затем складываете все вместе. До ООП наши программы были довольно большими пакетами методов в файлах. Я имею в виду, вы должны поместить функции где-то. Почему бы не организовать их?
Если это скрытая атака на типы, почему бы им просто не сказать, что ограничение типа ввода и вывода функцией является неправильным? Я не уверен, смогу ли я согласиться с этим, но по крайней мере я знаком с аргументами за и против безопасности типа. Это звучит для меня как отдельная проблема.
Конечно, иногда люди ошибаются и ставят функциональность не на тот класс. Но по сравнению с другими ошибками это кажется очень незначительным неудобством.
Итак, у Clojure есть пространства имен. Чем наложение функции на класс в ООП отличается от наложения функции на пространство имен в Clojure и почему это так плохо? Помните, что функции в классе не обязательно работают только с членами этого класса. Посмотрите на java.lang.StringBuilder - он работает с любым ссылочным типом или через автобокс с любым типом вообще.
PS Эта цитата ссылается на книгу, которую я не читал: Программирование мультипарадигмы в Леде: Тимоти Бадд, 1995 .