Enquanto alguns objetos que eu crio estão modelando objetos do mundo real, o código pré-OOP não faria o mesmo?
A maior diferença entre o OOP e o código pré-OOP é que o primeiro modela uma situação do mundo real como um grupo de entidades distintas interagindo entre si, cada uma com um "poder" limitado em relação ao que pode fazer e também capaz de "reagir" a eventos externos com ações próprias. O último modela tudo como uma grande quantidade de dados que não faz nada por si só, enquanto o cálculo representa "coisas que acontecem" e pode afetar um ou todos eles.
Quer modele melhor o mundo real ou não, isso realmente depende de quais facetas do mundo você está modelando. Uma simulação de física, por exemplo, na qual você deseja descrever os efeitos que, digamos, um incêndio aceso teria sobre os objetos que sobraram, seria melhor representada por uma abordagem "tradicional", pois a luz e o calor são bem-vindos. processos definidos que afetam o estado externo e interno de outros objetos e não variam de acordo com o comportamento de cada objeto em particular, sendo afetados apenas por suas propriedades.
Por outro lado, se você estiver modelando diferentes componentes que interagem para produzir o comportamento desejado, tratá-los como agentes em vez de coisas passivas pode facilitar a execução correta sem perder nada. Se eu quiser ligar a TV, basta pressionar o botão, se o cabo de alimentação estiver desconectado, a TV.turnOnverificação será feita para mim. Portanto, não há risco de girar uma engrenagem e esquecer de girar a outra que está tocando nela, já que a própria engrenagem (se programada corretamente) cuidará das interações secundárias resultantes da principal.
Mas OO é realmente sobre como modelar as coisas, e esse método de modelagem não parece inspirado no mundo real para mim.
Acredito que tenha mais a ver com a maneira como percebemos o mundo do que como o mundo realmente é. Alguém poderia argumentar que tudo é apenas um monte de átomos (ou energia, ou ondas, qualquer que seja), mas isso não nos ajuda a lidar com a tarefa de lidar com os problemas que enfrentamos, com a compreensão do ambiente ao nosso redor e a previsão de eventos futuros ( ou descrevendo os passados). Assim, criamos "modelos mentais" do mundo, e freqüentemente esses modelos mentais encontram uma correspondência melhor com o OO do que os dados + processos - o que sem dúvida modela o "melhor" como o mundo real realmente opera.
Também é interessante notar que a maioria das pessoas pensa em POO como sinônimo de "POO clássico", onde criamos taxonomicamente conjuntos e subconjuntos de coisas e colocamos objetos de forma inequívoca em um conjunto muito específico. Isso é muito útil para criar novos tipos reutilizáveis , mas não tão bom quando a entidade que você está modelando é praticamente independente e, embora inicie interações com outros objetos, raramente é o alvo de uma interação. Ou pior, quando há poucas (talvez apenas uma) instância dessa entidade, ou as instâncias variam muito em composição, comportamento ou ambas.
No entanto, também há "OOP prototípico", em que um objeto é descrito escolhendo um similar e enumerando os aspectos em que eles diferem. Eu sugeriria este ensaio para uma explicação boa e não muito técnica do processo de pensamento (todo o post é grande demais, mesmo para os padrões de Steve Yegge, por isso estou apontando para a seção relevante: P). Novamente, essa é uma boa combinação para nossos modelos mentais ao imaginar casos desconhecidos em comparação com um conhecido, mas não necessariamente como o mundo real "funciona" ... (duas vacas são na verdade entidades completamente distintas, mesmo se as percebemos) como sendo "parecidos" de várias maneiras)