Encontré esta cita en " La alegría de Clojure " en la pág. 32, pero alguien me dijo lo mismo durante la cena la semana pasada y también lo he escuchado en otros lugares:
[A] La desventaja de la programación orientada a objetos es el acoplamiento estrecho entre la función y los datos.
Entiendo por qué un acoplamiento innecesario es malo en una aplicación. También me siento cómodo diciendo que el estado mutable y la herencia deben evitarse, incluso en la programación orientada a objetos. Pero no veo por qué pegar funciones en las clases es inherentemente malo.
Quiero decir, agregar una función a una clase parece etiquetar un correo en Gmail o pegar un archivo en una carpeta. Es una técnica organizativa que te ayuda a encontrarla nuevamente. Eliges algunos criterios y luego juntas cosas similares. Antes de OOP, nuestros programas eran prácticamente bolsas de métodos en archivos. Quiero decir, tienes que poner funciones en alguna parte. ¿Por qué no organizarlos?
Si se trata de un ataque velado a los tipos, ¿por qué no dicen que restringir el tipo de entrada y salida a una función es incorrecto? No estoy seguro de si podría estar de acuerdo con eso, pero al menos estoy familiarizado con los argumentos pro y con seguridad de tipo. Esto me parece una preocupación mayoritariamente separada.
Claro, a veces las personas se equivocan y ponen la funcionalidad en la clase incorrecta. Pero en comparación con otros errores, esto parece un inconveniente muy menor.
Entonces, Clojure tiene espacios de nombres. ¿Cómo es diferente pegar una función en una clase en OOP de pegar una función en un espacio de nombres en Clojure y por qué es tan malo? Recuerde, las funciones en una clase no necesariamente operan solo en miembros de esa clase. Mire java.lang.StringBuilder: funciona en cualquier tipo de referencia, o mediante el auto-boxing, en cualquier tipo.
PD: Esta cita hace referencia a un libro que no he leído: Programación multiparadigm en Leda: Timothy Budd, 1995 .