Pode-se ouvir com frequência que o POO corresponde naturalmente à maneira como as pessoas pensam sobre o mundo. Mas eu discordo totalmente dessa afirmação: nós (ou pelo menos eu) conceituamos o mundo em termos de relacionamentos entre as coisas que encontramos, mas o foco da OOP é projetar classes individuais e suas hierarquias.
Observe que, na vida cotidiana, existem relacionamentos e ações principalmente entre objetos que seriam instâncias de classes não relacionadas no POO. Exemplos de tais relacionamentos são: "minha tela está em cima da mesa"; "Eu (um ser humano) estou sentado em uma cadeira"; "um carro está na estrada"; "Estou digitando no teclado"; "a máquina de café ferve a água", "o texto é mostrado na janela do terminal."
Pensamos em termos de verbos bivalentes (às vezes trivalentes, como, por exemplo, "eu lhe dei flores"), onde o verbo é a ação (relação) que opera em dois objetos para produzir algum resultado / ação. O foco está na ação, e os dois (ou três) objetos [gramaticais] têm igual importância.
Compare isso com OOP, onde primeiro você precisa encontrar um objeto (substantivo) e dizer para ele executar alguma ação em outro objeto. O modo de pensar é deslocado de ações / verbos operando em substantivos para substantivos operando em substantivos - é como se tudo estivesse sendo dito em voz passiva ou reflexiva, por exemplo, "o texto está sendo mostrado pela janela do terminal". Ou talvez "o texto se desenhe na janela do terminal".
Não apenas o foco é deslocado para os substantivos, mas um dos substantivos (vamos chamá-lo de sujeito gramatical) recebe uma "importância" maior do que o outro (objeto gramatical). Portanto, é preciso decidir se alguém dirá terminalWindow.show (someText) ou someText.show (terminalWindow). Mas por que sobrecarregar as pessoas com decisões tão triviais, sem consequências operacionais, quando realmente significa mostrar (terminalWindow, someText)? [As consequências são operacionalmente insignificantes - em ambos os casos, o texto é mostrado na janela do terminal -, mas podem ser muito sérias no design das hierarquias de classes e uma escolha "errada" pode levar a um código complicado e difícil de manter.]
Eu diria, portanto, que a maneira principal de fazer OOP (despacho único e baseado em classe) é difícil, porque NÃO É NATURAL e não corresponde à maneira como os humanos pensam sobre o mundo. Os métodos genéricos do CLOS estão mais próximos do meu modo de pensar, mas, infelizmente, essa não é uma abordagem generalizada.
Diante desses problemas, como / por que aconteceu que a maneira atual de fazer POO se tornou tão popular? E o que, se alguma coisa, pode ser feito para destroná-lo?