Encontrei essa citação em " A alegria de Clojure " na p. 32, mas alguém me disse a mesma coisa durante o jantar na semana passada e também ouvi outros lugares:
[A] desvantagem da programação orientada a objetos é o forte acoplamento entre função e dados.
Entendo por que o acoplamento desnecessário é ruim em um aplicativo. Também me sinto confortável em dizer que o estado mutável e a herança devem ser evitados, mesmo na Programação Orientada a Objetos. Mas não vejo por que manter funções em classes é inerentemente ruim.
Quero dizer, adicionar uma função a uma classe parece marcar um email no Gmail ou colar um arquivo em uma pasta. É uma técnica organizacional que ajuda a encontrá-lo novamente. Você escolhe alguns critérios e depois junta as coisas. Antes da OOP, nossos programas eram praticamente grandes pacotes de métodos em arquivos. Quero dizer, você tem que colocar funções em algum lugar. Por que não organizá-los?
Se este é um ataque velado aos tipos, por que eles simplesmente não dizem que restringir o tipo de entrada e saída a uma função está errado? Não tenho certeza se posso concordar com isso, mas pelo menos estou familiarizado com os argumentos a favor e contra o tipo segurança. Isso me parece uma preocupação principalmente separada.
Claro, às vezes as pessoas entendem errado e colocam a funcionalidade na classe errada. Mas comparado a outros erros, isso parece um inconveniente muito pequeno.
Portanto, Clojure tem namespaces. Como a colocação de uma função em uma classe no OOP é diferente da colocação de uma função em um espaço para nome no Clojure e por que é tão ruim? Lembre-se de que funções em uma classe não necessariamente operam apenas nos membros dessa classe. Veja java.lang.StringBuilder - ele opera em qualquer tipo de referência, ou através de boxing automático, em qualquer tipo.
PS Esta citação faz referência a um livro que eu não li: Programação Multiparadigmática em Leda: Timothy Budd, 1995 .