While some objects I create are modelling real world objects, would not pre-OOP code do the same?
La più grande differenza tra OOP e codice pre-OOP è che il primo modella una situazione del mondo reale come un gruppo di entità distinte che interagiscono l'una con l'altra, ciascuna con un "potere" limitato riguardo a ciò che può fare, e anche capace di " reagendo "a eventi esterni con azioni proprie. Quest'ultima modella tutto come una grossa fetta di dati che non fa nulla da solo, mentre il calcolo rappresenta "le cose che accadono" e può influenzarne alcune o tutte.
Che sia meglio modellare il mondo reale o meno, ciò dipende in realtà da quali sfaccettature del mondo stai modellando. Una simulazione fisica, ad esempio, in cui si desidera descrivere gli effetti che, ad esempio, un incendio che si accenderebbe avrebbe negli oggetti che circondano, sarebbe meglio rappresentata da un approccio "tradizionale", poiché sia la luce che il calore sono ben processi definiti che influenzano sia lo stato esterno che quello interno di altri oggetti, e non variano in base al comportamento di ogni particolare oggetto, ma sono influenzati dalle loro proprietà.
D'altra parte, se stai modellando diversi componenti che interagiscono per produrre il comportamento desiderato, trattarli come agenti anziché come cose passive può rendere più facile farlo correttamente senza perdere nulla. Se voglio accendere la TV, premo semplicemente il pulsante, se il cavo di alimentazione è scollegato, TV.turnOn
lo controllerà per me. Quindi, non c'è il rischio di trasformare un ingranaggio e dimenticare di trasformare quell'altro che lo sta toccando, dal momento che il pignone stesso (se programmato correttamente) si prenderà cura delle interazioni secondarie che vengono come conseguenza di quella primaria.
But OO is really about how to model things, and that method of modelling doesn't seem inspired by the real world to me.
Credo che abbia più a che fare con il modo in cui noi percepiamo il mondo rispetto a come il mondo sia effettivamente. Si potrebbe obiettare che tutto è solo un mucchio di atomi (o energia, o onde, qualunque cosa), ma questo non ci aiuta a gestire il compito di affrontare i problemi che affrontiamo, con la comprensione dell'ambiente che ci circonda e la previsione di eventi futuri ( o descrivere quelli passati). Quindi creiamo "modelli mentali" del mondo, e spesso questi modelli mentali trovano una corrispondenza migliore con OO rispetto ai dati + processi uno - che probabilmente modellizza "meglio" come funziona realmente il mondo reale.
È anche interessante notare che la maggior parte delle persone pensa a OOP come sinonimo di "OOP classico", in cui tassonomicamente creiamo insiemi e sottoinsiemi di cose e inseriamo senza ambiguità gli oggetti in un insieme molto specifico. È molto utile per creare nuovi tipi riutilizzabili, ma non così grandiosi quando l'entità che stai modellando è praticamente autosufficiente, e mentre avvia le interazioni con altri oggetti raramente, se non mai, è il obiettivo di un'interazione. O peggio, quando ci sono poche (forse solo una) istanza di quell'entità, o le istanze variano selvaggiamente nella composizione, nel comportamento o in entrambi.
Tuttavia, c'è anche "OOP prototipico", in cui un oggetto è descritto selezionando uno simile e elencando gli aspetti in cui differiscono. Suggerirei questo saggio per una buona e non troppo spiegazione tecnica del processo di pensiero (l'intero post è troppo grande, anche per gli standard di Steve Yegge, quindi sto indicando la sezione pertinente: P). Ancora una volta, questa è una buona corrispondenza per i nostri modelli mentali quando immaginiamo istanze sconosciute rispetto a una nota, ma non necessariamente per come il mondo reale "funziona" ... (due mucche sono entità completamente distinte, anche se le percepiamo come "uguali" in molti modi)