Mentre alcuni oggetti che creo modellano oggetti del mondo reale, il codice pre-OOP non farebbe lo stesso?
La più grande differenza tra il codice OOP e il codice pre-OOP è che il primo modella una situazione del mondo reale come un gruppo di entità distinte che interagiscono tra loro, ognuna con un "potere" limitato rispetto a ciò che può fare e anche in grado di "reagire" a eventi esterni con azioni proprie. Quest'ultimo modella tutto come un grosso blocco di dati che non fa nulla da solo, mentre il calcolo rappresenta "cose che accadono" e può influenzarne una o tutte.
Che modifichi meglio il mondo reale o meno, ciò dipende davvero da quali aspetti del mondo stai modellando. Una simulazione fisica, ad esempio, in cui si desidera descrivere gli effetti che, ad esempio, un fuoco che si accenderebbe sugli oggetti circostanti, sarebbe meglio rappresentato 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 ciascun oggetto particolare, essendo interessati solo dalle loro proprietà.
D'altra parte, se stai modellando componenti diversi che interagiscono per produrre il comportamento desiderato, trattarli come agenti invece di cose passive può rendere più semplice farlo correttamente senza perdere nulla. Se voglio accendere la mia TV, premo semplicemente il pulsante, se il cavo di alimentazione è scollegato, lo TV.turnOn
verificherò per me. Quindi, non c'è rischio di girare un ingranaggio e dimenticare di girare l'altro che lo tocca, dal momento che lo stesso ingranaggio (se programmato correttamente) si prenderà cura delle interazioni secondarie che derivano da quella primaria.
Ma OO riguarda davvero come modellare le cose e quel metodo di modellazione non mi sembra ispirato dal mondo reale.
Credo che abbia più a che fare con il modo in cui percepiamo il mondo rispetto a come il mondo è realmente. Si potrebbe sostenere che tutto è solo un mucchio di atomi (o energia, o onde, qualunque cosa), ma ciò non ci aiuta a gestire il compito di affrontare i problemi che affrontiamo, comprendere l'ambiente che ci circonda e prevedere eventi futuri ( o descrivendo quelli passati). Quindi creiamo "modelli mentali" del mondo, e spesso quei modelli mentali trovano una migliore corrispondenza con OO rispetto a quella di dati + processi - che probabilmente modella "meglio" il modo in cui il mondo reale opera effettivamente.
È anche interessante notare che la maggior parte delle persone pensa a OOP come sinonimo di "OOP classico", in cui creiamo tassonomicamente insiemi e sottoinsiemi di cose e inseriamo inequivocabilmente oggetti in un insieme molto specifico. È molto utile per creare nuovi tipi riutilizzabili , ma non eccezionale quando l'entità che stai modellando è praticamente autonoma, e mentre avvia interazioni con altri oggetti raramente, se mai, è il bersaglio 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, esiste anche "OOP prototipico", in cui un oggetto viene descritto selezionandone uno simile ed elencando gli aspetti in cui differiscono. Suggerirei questo saggio per una spiegazione valida e non troppo 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 conosciuta, ma non necessariamente per come "funziona" il mondo reale ... (due mucche sono in realtà entità completamente distinte, anche se le percepiamo come "simile" in molti modi)