Si bien algunos objetos que creo están modelando objetos del mundo real, ¿no haría lo mismo el código pre-OOP?
La mayor diferencia entre el código OOP y el código pre-OOP es que el primero modela una situación del mundo real como un grupo de entidades distintas que interactúan entre sí, cada una con un "poder" limitado con respecto a lo que puede hacer, y también capaz de "reaccionar" a eventos externos con acciones propias. Este último modela todo como una gran porción de datos que no hace nada por sí mismo, mientras que el cómputo representa "cosas que suceden" y puede afectar a una o todas ellas.
Si modela mejor el mundo real o no, eso realmente depende de qué facetas del mundo estés modelando. Una simulación física, por ejemplo, en la que desea describir los efectos que, por ejemplo, tendría un fuego encendido en los objetos circundantes, estaría mejor representada por un enfoque "tradicional", ya que tanto la luz como el calor están bien. procesos definidos que afectan tanto el estado externo como interno de otros objetos, y no varían de acuerdo con el comportamiento de cada objeto en particular, solo se ven afectados por sus propiedades.
Por otro lado, si está modelando diferentes componentes que interactúan para producir el comportamiento deseado, tratarlos como agentes en lugar de cosas pasivas puede hacer que sea más fácil hacerlo correctamente sin perder nada. Si quiero encender mi televisor, solo presiono el botón, si el cable de alimentación está desconectado, TV.turnOnlo comprobaré por mí. Por lo tanto, no hay riesgo de girar un engranaje y olvidarse de encender otro que lo está tocando, ya que el engranaje mismo (si está programado correctamente) se encargará de las interacciones secundarias que surjan como consecuencia de la primaria.
Pero OO realmente trata sobre cómo modelar cosas, y ese método de modelado no me parece inspirado por el mundo real.
Creo que tiene más que ver con la forma en que percibimos el mundo que con cómo es realmente el mundo. Se podría argumentar que todo es solo un montón de átomos (o energía, u ondas, lo que sea), pero eso no nos ayuda a manejar la tarea de enfrentar los problemas que enfrentamos, comprender el entorno que nos rodea y predecir eventos futuros ( o describiendo los pasados). Por lo tanto, hacemos "modelos mentales" del mundo, y a menudo esos modelos mentales encuentran una mejor correspondencia con OO que los procesos de datos +, lo que posiblemente modela "mejor" cómo funciona realmente el mundo real.
También es interesante notar que la mayoría de la gente piensa en OOP como sinónimo de "OOP clásica", donde creamos taxonómicamente conjuntos y subconjuntos de cosas, y colocamos objetos sin ambigüedad en un conjunto muy específico. Eso es muy útil para crear nuevos tipos reutilizables , pero no es tan bueno cuando la entidad que estás modelando es bastante autónoma y, aunque inicia interacciones con otros objetos, rara vez, si alguna vez, es el objetivo de una interacción. O peor, cuando hay pocas (tal vez una sola) instancia de esa entidad, o las instancias varían enormemente en composición, comportamiento o ambas.
Sin embargo, también hay una "POO prototípica", donde se describe un objeto eligiendo uno similar y enumerando los aspectos en los que difieren. Sugeriría este ensayo para una explicación buena y no demasiado técnica del proceso de pensamiento (toda la publicación es demasiado grande, incluso para los estándares de Steve Yegge, por lo que estoy señalando la sección relevante: P). Nuevamente, esta es una buena combinación para nuestros modelos mentales cuando imaginamos instancias desconocidas en comparación con una conocida, pero no necesariamente para cómo "funciona" el mundo real ... (dos vacas son en realidad entidades completamente distintas, incluso si las percibimos como ser "similar" en muchos sentidos)