A menudo se puede escuchar que OOP corresponde naturalmente a la forma en que las personas piensan sobre el mundo. Pero estaría totalmente en desacuerdo con esta afirmación: nosotros (o al menos yo) conceptualizamos el mundo en términos de relaciones entre las cosas que encontramos, pero el enfoque de OOP es diseñar clases individuales y sus jerarquías.
Tenga en cuenta que, en la vida cotidiana, las relaciones y acciones existen principalmente entre objetos que habrían sido instancias de clases no relacionadas en OOP. Ejemplos de tales relaciones son: "mi pantalla está encima de la mesa"; "Yo (un ser humano) estoy sentado en una silla"; "un auto está en el camino"; "Estoy escribiendo en el teclado"; "la cafetera hierve agua", "el texto se muestra en la ventana del terminal".
Pensamos en términos de verbos bivalentes (a veces trivalentes, como, por ejemplo, en "Te di flores") donde el verbo es la acción (relación) que opera en dos objetos para producir algún resultado / acción. El foco está en la acción, y los dos (o tres) objetos [gramaticales] tienen la misma importancia.
Compare eso con OOP donde primero tiene que encontrar un objeto (sustantivo) y dígale que realice alguna acción sobre otro objeto. La forma de pensar cambia de acciones / verbos que operan con sustantivos a sustantivos que operan con sustantivos: es como si todo se dijera en voz pasiva o reflexiva, por ejemplo, "la ventana de terminal muestra el texto". O tal vez "el texto se dibuja en la ventana del terminal".
No solo el foco se desplaza a los sustantivos, sino que a uno de los sustantivos (llamémoslo sujeto gramatical) se le da mayor "importancia" que al otro (objeto gramatical). Por lo tanto, uno debe decidir si dirá terminalWindow.show (someText) o someText.show (terminalWindow). Pero, ¿por qué cargar a las personas con decisiones tan triviales sin consecuencias operativas cuando uno realmente quiere decir show (terminalWindow, someText)? [Las consecuencias son operacionalmente insignificantes, en ambos casos el texto se muestra en la ventana del terminal, pero puede ser muy serio en el diseño de jerarquías de clases y una elección "incorrecta" puede conducir a un código complicado y difícil de mantener.]
Por lo tanto, diría que la forma principal de hacer POO (basada en clases, despacho único) es difícil porque ES INNATURAL y no corresponde a cómo piensan los humanos sobre el mundo. Los métodos genéricos de CLOS están más cerca de mi forma de pensar, pero, por desgracia, este no es un enfoque generalizado.
Dados estos problemas, ¿cómo / por qué sucedió que la forma actual de hacer OOP se hizo tan popular? ¿Y qué, si hay algo, se puede hacer para destronarlo?