La programmazione orientata agli oggetti modella davvero il mondo reale? [chiuso]


52

L'ho visto più volte ripetere che la programmazione orientata agli oggetti si basa sulla modellizzazione del mondo reale, ma è vero?

Mi sembra che non sia vero per nulla al di fuori del livello aziendale. Le mie classi GUI / classi di accesso ai dati non modellano nulla nel mondo reale. Anche nel mio livello aziendale, ho classi come osservatori, manager, fabbriche, ecc. Che non sono oggetti del mondo reale. Cerco di progettare le mie lezioni per trarre vantaggio da cose come l'incapsulamento ma il mondo reale è incapsulato?

Mentre alcuni oggetti che creo modellano oggetti del mondo reale, il codice pre-OOP non farebbe lo stesso? Dubito che OO sia stata la prima persona a includere concetti come il Cliente nelle loro basi di codice. Ma OO riguarda davvero come modellare le cose e quel metodo di modellazione non mi sembra ispirato dal mondo reale.

Quindi: la programmazione orientata agli oggetti modella davvero il mondo reale?


85
L'idea di utilizzare l'analogia degli oggetti OOP che rappresentano gli oggetti del mondo reale è un primo esempio del concetto di "bugie per bambini". Diciamo alle persone che stanno appena iniziando a imparare OOP questa menzogna poiché è un modo intuitivo per ottenere le basi. Non appena hanno appreso queste basi, sono pronti ad assorbire il fatto che tutto ciò che sanno è sbagliato; le cose sono in realtà più complesse di così. È proprio come la fisica a scuola: le cose del pugno cadono, quindi le cose sono attratte da cose più grandi, quindi le cose grandi piegano lo spazio, quindi alla fine ci viene detto che in realtà non sappiamo nulla di come funzionano le cose.
evilcandybag

4
Qual è la vera contesa qui? È che ci sono alcune entità del mondo reale che non possono mai essere modellate adeguatamente dalle tecniche OO? o è che la modellazione, ovvero l'uso di una comprensione semplificata, non si adatta sufficientemente al mondo è una cattiva idea che non funziona?
Dipan Mehta,

1
@DipanMehta, la tesi è che la descrizione di OO come modello del mondo reale manca il cuore della programmazione orientata agli oggetti. Tutte le tecniche di programmazione modellano il mondo reale (in un modo o nell'altro), non è ciò che rende OO unico.
Winston Ewert,

@WinstonEwert Bene, modeling the real worldpotrebbe non essere ciò che distingue davvero OO. Può essere. Ma sicuramente non credo che non riuscirai nemmeno a farlo in OO. Quale paradigma o tecnica pensi che lo renda migliore di OO?
Dipan Mehta,

14
Tutta la programmazione tenta di modellare qualcosa nel mondo reale. Alcuni paradigmi modellano parti diverse meglio di altri. Flusso di lavoro dei modelli di codice procedurali, risoluzione dei problemi logica dei modelli di codice funzionali, relazioni gerarchiche dei modelli di codice orientati agli oggetti. I modelli di codice di Assembly Language sono fantastici .
Jesse C. Slicer,

Risposte:


50

No, per niente.

Tuttavia è una metodologia che consente di creare una bella astrazione per contenere strutture di dati complessi insieme ad alcuni metodi che agiscono sulle strutture di dati.


Grande risposta concisa. Per definizione, perdi alcuni dettagli nel modello.
MathAttack

Scusa, non mi piace questa risposta. Con OOP puoi modellare molto (alcuni aspetti del) mondo reale.
Clime

33

I modelli, di qualsiasi tipo, non modellano il mondo reale, non del tutto.

Modellano selezionate porzioni, quelli che sono rilevanti per l'applicazione in questione.

Quello di cui stai parlando (osservatori, manager, fabbriche ecc ...) è un'infrastruttura che ti aiuta a ottenere l'astrazione giusta e supporta le funzioni richieste come la persistenza.


15
Direi che "modellare" significa già imitare alcuni aspetti (tralasciandone altri). In tal senso, OO consente di modellare il mondo reale.
Tamás Szelei

Quali parti del tuo problema sono modellate bene da OO? Alcuni problemi non si associano bene a un modello OO, vengono in mente i modelli climatici. Molti problemi aziendali si associano bene a OO, motivo per cui il modello è ampiamente utilizzato.
Michael Shopsin

@MichaelShopsin - Intendevi forse che il tuo commento era sulla domanda piuttosto che sulla mia risposta?
Oded,

@Oded Mi piace la tua risposta; il mio commento è un'espansione di "parti selezionate del modello". I modelli OO modellano molti problemi, è una questione di assicurarsi che corrispondano al problema attuale.
Michael Shopsin

31

Che cos'è un modello, comunque:
un modello è una rappresentazione semplificata utilizzata per spiegare il funzionamento di un sistema o evento del mondo reale

La programmazione orientata agli oggetti ti consente di modellare il mondo reale?

Decisamente sì

È quasi impossibile modellare il sistema in modo che corrisponda esattamente al mondo reale.

Devo sempre modellare il software esattamente dopo il mondo reale?

NO

Detto questo si può modellare tutto ciò non significa che devi modello di tutto. In effetti, l'essenza della modellistica utile è presentare una rappresentazione semplificata. Quanta semplificazione è sufficiente per esprimere l'attuale esigenza aziendale, e ciò che deve essere omesso, è un buon equilibrio tra l'uso della tecnica con successo rispetto al perdersi con essa o non usarla affatto.

Naturalmente ci sono entità che non esistono davvero, ma solo attraverso la modellazione possiamo effettivamente concettualizzare bene.


9
" Che cos'è un modello? " Un miserabile mucchio di privati. Ma abbastanza codice, hai con te!
Ben Brocka

Penso che il tuo ultimo punto catturi relazioni immateriali. A volte gli oggetti esistono nel mondo reale, semplicemente non li vediamo.
MathAttack

19

Penso che insegnare che esista una relazione tra nomi e classi provochi fastidiose cattive abitudini che devono essere annientate da un architetto impaziente o da un ingegnere senior.

Ciò che dovrebbe essere insegnato è che le classi modellano oggetti astratti, proprio come fa il tuo cervello. Hai un concetto astratto di "auto" nella tua testa che non si associa a nessuna particolare macchina fisica, è riutilizzabile, implementazioni specifiche di auto possono ereditare da esso. Il tuo cervello ha anche meta-modelli concetti per te. Hai un modello mentale di ciò che il pensiero è, che cos'è un concetto.

Se insegnassimo alle persone a identificare i modelli che stanno già generando nella tua testa, sarebbero molto più preparati a costruire software reali.


+1 Un punto di vista così straordinario e straordinario. Grazie per averlo condiviso! Mi chiedo se lo hai preso da un libro o no? Mi piacerebbe sicuramente leggere quel libro.
Mahdi

8

... Il mondo è più ricco di ciò che può essere espresso con la sintassi orientata agli oggetti.

Considera alcuni concetti comuni che le persone usano universalmente per comprendere e descrivere tutti i sistemi, concetti che non si adattano allo stampo oggetto. Il paradigma "prima / dopo", così come quello di "causa / effetto", e la nozione di "stato del sistema" sono tra gli esempi più vividi. In effetti, il processo di "preparazione del caffè", "assemblaggio di un veicolo" o "atterraggio di un rover su Marte" non può essere scomposto in semplici oggetti. Sì, vengono trattati in questo modo nelle lingue OO, ma questo è inventato e controintuitivo. La sequenza della routine stessa - ciò che viene prima di cosa in quali condizioni in base a quale causalità - semplicemente non ha una rappresentazione significativa in OO , perché OO non ha un concetto di sequenziamento, stato o causa.

I processi sono estremamente comuni nel mondo reale e nella programmazione. Nel corso degli anni sono stati elaborati meccanismi elaborati per gestire transazioni, flusso di lavoro, orchestrazione, thread, protocolli e altri concetti intrinsecamente "procedurali". Tali meccanismi generano complessità nel tentativo di compensare la carenza inerente al tempo invariante nella programmazione OO. Invece, il problema dovrebbe essere affrontato alla radice consentendo costrutti specifici del processo, come "prima / dopo", "causa / effetto" e, forse, "stato del sistema" come parte fondamentale del linguaggio ...

fonte di citazione: Victoria Livschitz, The Next Move in Programming


2
È una sensazione strana quando vedi un caso così convincente fatto per qualcosa con cui non sei ancora d'accordo. Ottengo la motivazione per la citazione, e sarebbe difficile esprimerla meglio. Semplicemente non so che è un errore modellare i nostri problemi allo stesso modo dei nostri processi di pensiero simbolici e orientati alle relazioni.
minacciosamente il

Interessante immagino ... ma non ho mai voluto scrivere un programma che produca caffè. Il problema stesso è vagamente definito. Il programma ha accesso agli attuatori hardware o è una pura simulazione? In entrambi i casi, sembra che l'approccio oggettivo fornirebbe un buon punto di partenza, sia modellando gli attuatori coinvolti sia modellando lo stato interno degli attori e degli strumenti coinvolti.
Mark E. Haase,

13
this.MoveTo(Environment.Find<Bathroom>().OrderBy(b=>b.Distance(this)).First()); this.SitOn(Environment.Find<Toilet>().Where(t=>!t.IsOccupied).OrderBy(t=>t.Distance(this)).First().Component<Seat>()); this.DiscardWaste(HumanWasteType.All);
Adam Robinson,

1
Difficile credere che sia una sostenitrice di Java quando formula così tanti punti critici nei confronti del suo paradigma OO troppo stretto. E in qualche modo ridicola non menziona nessuno dei linguaggi che lo rendono migliore (tranne "È un enorme miglioramento rispetto al suo predecessore, C ++." ...).
lasciato circa il

1
OO non ha alcun concetto di sequenziamento o stato . Che assurdità. Non esiste un concetto di sequenziamento e stato in OOP? OO
clime

5

Sì, OO può spesso essere utilizzato per modellare entità del mondo reale.

Anche nel mio livello aziendale ho classi come osservatori, manager, fabbriche, ecc. Che non sono oggetti del mondo reale.

Non confondere lo sviluppo orientato agli oggetti con i modelli di progettazione. L'analisi e la progettazione OO sono un mezzo per avvicinarsi alla programmazione di codice gestibile. Insieme a un linguaggio OO, i programmatori hanno il potere di creare codice riutilizzabile attraverso i pilastri di OO: incapsulamento, polimorfismo ed eredità.

Per incapsulare un'entità possiamo modellarla dopo la sua controparte nel mondo reale. Ad esempio, se abbiamo una chitarra, una classe di chitarra incapsula i comportamenti e le proprietà di una chitarra del mondo reale. Possiamo astrarre ulteriormente la chitarra come, diciamo, IInventoryItemper sfruttare il potenziale di riutilizzo del codice attraverso il polimorfismo e l'ereditarietà.

D'altra parte, potremmo scoprire che una fabbrica di chitarre potrebbe aiutarci a mantenere una serie di diversi tipi di chitarre. Questo non è a causa di OO. Piuttosto, una fabbrica è un modello di progettazione che ha superato la prova del tempo come mezzo collaudato per creare con successo codice manutenibile a tale scopo. In altre parole, noi programmatori spesso risolviamo problemi simili. Quindi abbiamo trovato una soluzione comune per risolverli (non reinventare la ruota).

Ciò non significa che OO debba modellare il mondo reale, né che sia sempre la soluzione ottimale per farlo. Semplicemente, che come regola empirica “OO modella il mondo reale” ha perfettamente senso.


5

Dipende da quale mondo reale stai parlando.

Jorge Luis Borges ha scritto una storia "Tlön, Uqbar, Orbis Tertius", in cui uno dei popoli abitanti sembra percepire il loro mondo reale in modo diverso:

[...] le persone dell'immaginario Tlön [...] detengono una forma estrema di idealismo berkeleiano, negando la realtà del mondo. Il loro mondo è inteso "non come una concomitanza di oggetti nello spazio, ma come una serie eterogenea di atti indipendenti". Una delle lingue immaginate di Tlön manca di nomi. Le sue unità centrali sono "verbi impersonali qualificati da suffissi monosillabici o prefissi che hanno la forza di avverbi". Borges elenca un equivalente di Tlönic di "La luna è sorta sopra l'acqua": hlör u fang axaxaxas mlö, che significa letteralmente "Verso l'alto dietro il torrente lunare". [...] In un'altra lingua di Tlön, "l'unità di base non è il verbo, ma l'aggettivo monosillabico", che, in combinazioni di due o più, formano un sostantivo: "luna" diventa "rotonda ariosa-luce su scuro "o"

(copiato dall'articolo di Wikipedia sul libro)

Per me, il punto non è tanto che il mondo può essere percepito in modo diverso da noi, il che è un po 'cliché, ma che la percezione della struttura della realtà stessa dipende dal linguaggio che parliamo, sia esso un linguaggio naturale o un linguaggio di programmazione. Il Tlönese potrebbe essere molto contento di Lisp e potrebbe vedere Java (AKA The Kingdom Of Nouns ) come molto innaturale, mentre la maggior parte dei programmatori terran tende a preferire gli oggetti orientati rispetto ai linguaggi funzionali. Mi piacciono entrambi gli stili, poiché penso che sia principalmente una questione di prospettiva. Alcuni problemi vengono affrontati al meglio con funzioni funzionali, altri con tecniche di programmazione orientate agli oggetti. Un buon programmatore osserva sempre un problema difficile da diverse angolazioni, prima di tentare una soluzione. Oppure, come diceva Alan Kay: il punto di vista vale 80 punti QI .

Quindi, la mia risposta alla tua domanda è: di quale mondo reale stai parlando? E come?


"che la percezione della struttura della realtà stessa dipende dal linguaggio che parliamo, sia esso un linguaggio naturale o un linguaggio di programmazione". È così vero!
Clime

4

Mentre alcuni oggetti che creo modellano oggetti del mondo reale, il codice pre-OOP non farebbe lo stesso?

Direi di no. OOP limita la relazione tra le cose (proprietà / oggetti) e ciò che possono fare / può essere fatto a loro (metodi), mentre la programmazione procedurale non lo fa (a parte, in piccola parte, quando si usa la tipizzazione rigorosa). Un modello non riguarda solo la definizione di parti e processi discreti, ma anche la definizione di come si adattano insieme e OOP è particolarmente bravo in questo.


Penso che intendi procedurale non funzionale.
Winston Ewert,

sì, corretto. Lo cambierò
whereesrhys

3

L'ho visto più volte ripetere che la programmazione orientata agli oggetti si basa sulla modellizzazione del mondo reale, ma è vero?

Sì. L'enfasi qui è basata . OOP non modella il mondo reale (se lo fa, per inciso) e non dovrebbe. Ciò che OOP fa è consentirci di modellare i problemi di programmazione nel modo in cui modelliamo il mondo reale: come un sistema di entità che sono definite attraverso la nostra astrazione del loro comportamento.


3
Sì, quindi non si basa sulla modellazione del mondo reale, giusto?
lasciato circa il

3

Il codice OO di solito non modella il mondo reale - almeno questo non è l'obiettivo, ti permette semplicemente di pensare al tuo codice in un modo più naturale, più simile al modo in cui pensi alle cose nel mondo reale-- questo è ciò che la citazione sta cercando di dire.


3

Non modella il nostro mondo, ma modella l'interpretazione umana del nostro mondo. Gli esseri umani separano naturalmente le cose come oggetti. OO è efficace perché consente agli umani di programmare il modo in cui pensano.


2

OOP potrebbe non essere un modello perfetto del mondo reale e degli oggetti in esso contenuti, ma è una metodologia che aiuta a gestire la crescente complessità del software della vita reale. Aiuta anche a scrivere meglio il codice, suddividendolo in blocchi logicamente correlati.

Mentre i vecchi metodi orientati alle procedure forniranno sicuramente risultati, OOP ti aiuta ad arrivarci più velocemente e con relativa facilità, anche quando si tratta di progetti grandi e complessi.

L'astrazione e l'incapsulamento aiutano a concentrarsi sul nocciolo del problema, nascondendo al contempo tutte le tubature che effettivamente fanno accadere le cose. Ereditarietà e consente di stabilire una relazione significativa e logica tra i vari aspetti del codice. Il polimorfismo promuove il riutilizzo del codice e consente di gestire facilmente le variazioni (quelle categorie di problemi " quasi lo stesso comportamento di un oggetto esistente" che si verificano così frequentemente) ed estendere il codice estendendo la semantica associata a un oggetto.

Sento che OOP è più simile a un aiuto provato che ti consente di affrontare tutte le complessità di un sistema di vita reale in modo efficace. Quindi, anche se potrebbe non essere un modello molto approfondito del mondo reale, è abbastanza vicino e ti aiuta a fare cose, che IMHO è tutto ciò che conta alla fine.


2

L'ho visto più volte ripetere che la programmazione orientata agli oggetti si basa sulla modellizzazione del mondo reale, ma è vero?

Mi sembra che non sia vero per nulla al di fuori del livello aziendale.

No. Come hai sottolineato, molte delle cose "modellate" in un linguaggio OOP sono concetti astratti come code di messaggi, controller e stack.

Anche nel tuo livello aziendale, non stai ancora modellando "il mondo reale". Supponi di avere una classe di dipendenti. I dipendenti sono anche persone, che sono anche mammiferi, che sono anche animali, che sono anche ... (sbadiglio) I dipendenti hanno i colori preferiti e indossano alcuni vestiti e credono in certe cose. In breve, nel mondo reale esiste una vasta gamma di complessità che non tentiamo nemmeno di acquisire nella maggior parte dei programmi.

Nella modellazione, ci concentriamo solo sugli aspetti del modello che sono significativi per l'attività in corso. Se stiamo progettando un sistema di inserimento orario, probabilmente desideriamo una sorta di classe Employee, ma quella classe non ha bisogno di una proprietà per esprimere il colore preferito dell'impiegato.

Pertanto, i modelli non dovrebbero tentare (o fingere) di rappresentare completamente il "mondo reale".

Mentre alcuni oggetti che creo modellano oggetti del mondo reale, il codice pre-OOP non farebbe lo stesso? Dubito che OO sia stata la prima persona a includere concetti come il Cliente nelle loro basi di codice.

Hai ragione. Se si guardano programmi di grandi dimensioni che non sono OOP, spesso sono ancora organizzati attorno a strutture di dati. Una struttura di dati e tutte le funzioni che manipolano sono definite l'una vicino all'altra, per motivi di chiarezza. (Il progetto di sovversione ne è un buon esempio. Le strutture e le funzioni dei dati hanno il prefisso con i nomi dei moduli in modo che sia chiaro quali strutture e funzioni sono intese per essere usate l'una con l'altra.)

Non sono un esperto della storia dei linguaggi di programmazione, ma immagino che OOP sia nato dall'osservazione casuale che il codice era più chiaro e più facile da capire quando era organizzato in questo modo, quindi i progettisti di linguaggi hanno iniziato a progettare linguaggi in cui quel tipo di organizzazione era più rigorosamente applicato.

La più grande differenza tra OOP e non-OOP è che OOP lega il codice ai dati. Quindi, anziché chiamare il codice in questo modo:

verb(noun);

facciamo invece questo:

noun->verb();

Sebbene ciò possa sembrare una differenza grammaticale, la differenza è in realtà nella mentalità. Diciamo agli oggetti cosa fare e in genere non importa quale sia lo stato interno o il funzionamento dell'oggetto. Nel descrivere un oggetto, dobbiamo solo descriverne l' interfaccia pubblica per poter lavorare con esso.


2

La programmazione orientata agli oggetti modella davvero il mondo reale?

Non completamente.

Bene, nel mondo reale, affrontiamo problemi reali. Vogliamo risolvere questo problema usando un paradigma che replica il sistema che vogliamo costruire che diventa il modello.

Ad esempio, se un'applicazione del carrello era il problema a portata di mano, abbiamo entità diverse come

  1. Prodotto che è un termine astratto che può avere più membri come Libri, Gadget, Automobili che possono essere nuovamente suddivisi.

  2. Criteri fiscali come (imposta sulle vendite) dipendono dalla posizione in cui il software è implementato in quanto soggetto a modifiche in base alle politiche governative.

  3. L'imposta è considerata in base al fatto che il prodotto sia stato importato insieme a criteri fiscali.

  4. L'utente potrebbe avere un carrello della spesa con un elenco di prodotti ecc.

Come puoi vedere, ci sono problemi reali che stiamo cercando di risolvere ma modularizzati al paradigma OOP per renderlo il più vicino possibile al sistema reale.


1
Mi piace questa risposta. OO dovrebbe modellare il tuo dominio problematico, quindi mentre ci sono molti concetti del mondo reale alcuni di essi non si relazioneranno al problema che stai cercando di risolvere e avrai costrutti OO che non mappano esattamente a qualcosa in il mondo reale, ma soddisfa un bisogno nel dominio del problema.
Andy,

2

Penso che stai leggendo troppo in ciò che è destinato a essere un'affermazione molto prosaica, storica. Molte delle idee di programmazione OO, classi, polimorfismo, funzioni virtuali, ecc. Furono introdotte nel linguaggio Simula, negli anni '60 (http://en.wikipedia.org/wiki/Simula). Come suggerisce il nome, Simula è stata progettata per essere una lingua per la scrittura di simulazioni. Quindi, storicamente, sì, le idee OO sono state introdotte nel tentativo di modellare il "mondo reale". Se riescono più degli altri stili è una questione di dibattito.


2

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.turnOnverificherò 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)


1

Penso che "Sì" sia la parte importante di questa domanda. Penso che la programmazione orientata agli oggetti possa certamente modellare "oggetti" del mondo reale, ma questa è programmazione . Non esiste una metodologia che non possa essere abusata, quindi non credo sia giusto dire "OOP non modella il mondo reale" solo perché puoi fare cose stupide con gli oggetti. Non è più giusto che dire che i puntatori non sono sicuri perché puoi fare cose stupide con i puntatori.

L'articolo di Wikipedia sull'argomento riassume bene:

Modellazione e relazioni del mondo reale
OOP può essere utilizzato per associare oggetti e processi del mondo reale a controparti digitali. Tuttavia, non tutti concordano sul fatto che OOP faciliti la mappatura diretta del mondo reale (vedere la sezione Critica negativa) o che la mappatura del mondo reale sia persino un obiettivo meritevole; Bertrand Meyer sostiene in Object-Oriented Software Construction [21] che un programma non è un modello del mondo ma un modello di alcune parti del mondo; "La realtà è una cugina rimossa due volte".

Il fatto è che a meno che il tuo programma non sia una simulazione dell'universo, ti preoccupi solo di parti del mondo reale, quindi del "modello". Ecco a cosa servono i modelli, ti danno la struttura e le funzionalità che devi visualizzare.

Nel mondo reale abbiamo cose (oggetti) e le cose possono compiere azioni (metodi). Possiamo quantificare aspetti delle cose (Proprietà). OOP ha tutte le potenzialità per modellare le cose del mondo reale se usato in modo riduzionista; ogni cosa complessa ha sottoclassi più piccole o più specifiche e tutte queste cose hanno interazioni naturali tramite metodi.

OOP è un metodo di astrazione, per cui la cosa pratica è se OOP davvero logicamente modelli oggetti nel mondo reale, è meno importante che non si sta modellando ogni singola cosa tutto il possibile potrebbe mai fare . Se devi fare ogni singola cosa possibile, non stai davvero modellando .


1

Per pensare all'orientamento agli oggetti nel suo giusto contesto, saliamo di un livello di astrazione e parliamo di programmazione in generale, ok?

Indipendentemente dal fatto che tu prenda OO o approcci funzionali, il tuo programma deve fare qualcosa, no? Il punto centrale del programma è esibire determinati comportamenti, dato un certo insieme di stimoli. Quindi la ragione per cui i programmi esistono è perché fanno qualcosa. La parola chiave qui è comportamento .

Oltre a considerare quali comportamenti deve attuare un programma, il tuo programma generalmente deve mostrare determinate qualità. Ad esempio, non è sufficiente che un programma per cardiofrequenzimetro abbia i comportamenti richiesti, di solito ha anche bisogno di prestazioni abbastanza veloci per operare in tempo quasi reale. Altre "qualità" che un programma potrebbe dover esibire sono: sicurezza, flessibilità, modularità, estensibilità, leggibilità e così via. Chiamiamo questi attributi di qualità dell'architettura . Quindi possiamo dire che il nostro programma deve soddisfare determinati obiettivi comportamentali (funzionali) oltre a mostrare determinate qualità (non funzionali).

Finora, nulla di tutto ciò ha parlato di OO, vero? Facciamolo adesso.

Una volta che un ingegnere comprende i requisiti (comportamentali, AQA, vincoli, ecc.), Sorge la domanda: come devo organizzare il mio codice in modo che faccia tutto ciò che deve fare esibendo anche le qualità necessarie per essere un programma utile? La programmazione orientata agli oggetti è una strategia per organizzare la funzionalità del programma in moduli coesivi di oggetti cooperanti. La programmazione funzionale è solo un'altra strategia per organizzare la funzionalità del tuo programma, e lo fa in modo diverso. Entrambe le strategie hanno i loro punti di forza e di debolezza.

Abbiamo assistito a una recente rinascita di concetti funzionali perché ha punti di forza molto interessanti per l'elaborazione altamente distribuita, tra le altre ragioni.

Ma tornando a OO, puoi vedere ora che non modella necessariamente il "mondo reale"; ciò che fa è organizzare il comportamento del tuo programma in modo che il tuo programma possa mostrare le qualità necessarie per raggiungere qualsiasi numero di obiettivi aziendali. Tecniche come TDD, DDD e BDD sono i modi in cui scopriamo come organizzare al meglio i nostri oggetti. Libri come Principi, schemi e pratiche , software orientato agli oggetti in crescita guidato da test , specifiche per esempio e progettazione guidata dal dominio illustrano la teoria e la pratica dell'orientamento agli oggetti con un focus sulla progettazione basata sul comportamento.

Quando leggi cose come "osservatori, manager, fabbriche, ecc.", Stai applicando modelli OO che aiutano il tuo programma a mostrare alcune qualità che potrebbero essere necessarie per essere utile. Sono "ricette comprovate" che "tendono a funzionare", dato che le tue esigenze corrispondono al problema risolto dal modello.

Spero che ciò ti aiuti a capire di cosa si occupa OO senza apparire troppo distorti tra OO e paradigmi funzionali.


1

OOP crea un bel modello dal punto di vista della programmazione, non riflette il mondo reale.

Tuttavia, ci sono approssimazioni molto migliori del mondo reale, che sono conosciute dal termine domain specific language ( DSL ). Ad esempio Boo ti offre la possibilità di scrivere codice leggibile dall'uomo in un inglese quasi normale (esempio dall'articolo ).

apply_discount_of 5.percent:
         when order.Total > 1000 and customer.IsPreferred
         when order.Total > 10000

suggest_registered_to_preferred:
         when order.Total  > 100 and not customer.IsPreferred

Un altro esempio potrebbe essere rappresentato dai framework di test di accettazione degli utenti automatizzati basati sul linguaggio Gherkin .

Feature: Some terse yet descriptive text of what is desired
    In order to realize a named business value
    As an explicit system actor
    I want to gain some beneficial outcome which furthers the goal

Scenario: Some determinable business situation
    Given some precondition
        And some other precondition
    When some action by the actor
        And some other action
        And yet another action
    Then some testable outcome is achieved
        And something else we can check happens too

0

Dipende da te, finalmente. OOP è un modo preciso di farlo rispetto ad altre metodologie come la programmazione strutturata o orientata alle procedure. Il tatto procedurale potrebbe eventualmente risolvere i tuoi problemi, ma seguire OOP può semplificarti la vita.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.