Com frequência, pode-se ouvir que a OOP corresponde naturalmente à forma como as pessoas pensam sobre o mundo. Mas eu discordo strongmente desta afirmação: Nós (ou pelo menos eu) conceitualizamos o mundo em termos de relacionamentos entre as coisas que encontramos, mas o foco da OOP é projetar classes individuais e suas hierarquias.
Observe que, no dia a dia, relacionamentos e ações existem principalmente entre objetos que seriam instâncias de classes não relacionadas em OOP. Exemplos de tais relacionamentos são: "minha tela está no topo da tabela"; "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, em "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á em ação, e os dois (ou três) objetos [gramaticais] têm igual importância.
Contraste com o OOP onde você primeiro tem que encontrar um objeto (substantivo) e diga para 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 desenha na janela do terminal".
O foco não é apenas mudado para substantivos, mas um dos substantivos (vamos chamá-lo de assunto gramatical) recebe maior "importância" do que o outro (objeto gramatical). Assim, deve-se 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 uma delas realmente significa mostrar (terminalWindow, someText)? [As consequências são operacionalmente insignificantes - em ambos os casos, o texto é mostrado na janela do terminal - mas pode ser muito sério no design das hierarquias de classes e uma escolha "errada" pode levar a dificuldades para manter o código.]
Eu diria, portanto, que o modo tradicional de se fazer OOP (baseado em classe, despacho único) é difícil porque NÃO É NATURAL e não corresponde à maneira como os humanos pensam sobre o mundo. Métodos genéricos do CLOS estão mais próximos do meu modo de pensar, mas, infelizmente, isso não é uma abordagem generalizada.Considerando esses problemas, como / por que aconteceu que a maneira atual de fazer OOP se tornou tão popular? E o que, se alguma coisa, pode ser feito para destronar isso?