Cosa ha reso efficace la programmazione orientata agli oggetti? [chiuso]


17

Qual è la tua caratteristica secondo te che ha reso tanto efficace la programmazione orientata agli oggetti?

  1. Passaggio dei messaggi
  2. Eredità
  3. Polimorfismo
  4. incapsulamento

O qualche altra caratteristica che potresti voler introdurre.

Inoltre vorrei sapere che qual è la connessione tra il tipo di dati astratti e la programmazione orientata agli oggetti?


popolare e di successo non sono sinonimi
Kevin Cline il

Risposte:


76

Suggerirei che la caratteristica più importante della programmazione orientata agli oggetti è quella della gestione della complessità .

Il cervello umano può contenere così tanti concetti alla volta - mi viene in mente il limite spesso citato di ricordare 7 +/- 2 oggetti indipendenti.

Quando lavoro su un sistema 600kloc al lavoro, non riesco a tenere tutto in testa in una volta. Se dovessi farlo, mi limiterei a lavorare su sistemi molto più piccoli.

Fortunatamente, non devo. I vari modelli di progettazione e altre strutture che abbiamo utilizzato in quel progetto significano che non devo occuparmi di tutto il sistema in una volta - posso raccogliere singoli pezzi e lavorarci su, sapendo che si adattano all'applicazione più ampia in modi ben definiti.

Tutti i concetti OO importanti forniscono modi per gestire la complessità.

Incapsulamento : permettimi di gestire un'API esterna che mi fornisce vari servizi, senza preoccuparmi di come vengono implementati.

Astrazione : lasciami concentrare sulle caratteristiche essenziali e ignora ciò che non è rilevante.

Composizione : permettimi di riutilizzare i componenti che sono già stati creati in nuove combinazioni

Polimorfismo : lasciami chiedere un servizio senza preoccuparmi di come oggetti diversi potrebbero fornirlo in modi diversi.

Ereditarietà : consentitemi di riutilizzare un'interfaccia o un'implementazione, fornendo solo i pezzi che sono diversi da ciò che è accaduto prima.

Principio unico di responsabilità : consente di mantenere chiaro e conciso lo scopo di ciascun oggetto, quindi è facile ragionare

Principio della sostituzione di Liskov - non gettiamo trappole l'una con l'altra introducendo strane dipendenze

Principio aperto / chiuso : consentiamo l'estensione e la modifica in modi che non ci richiedono di rischiare di violare il codice esistente

Iniezione delle dipendenze : portiamo la composizione al livello successivo e assembliamo i componenti molto più tardi.

Sviluppo orientato all'interfaccia : portiamo l'astrazione al livello successivo e dipendiamo solo dall'astrazione, mai da un'implementazione concreta.


6
+1. Posso votare una sola volta, peccato che merita di più.
Richard,

1
C'è un corollario in questo, è un peccato che non riesca a trovare il riferimento in questo momento ma cercherò di ricordarmi di cercarlo e modificare il commento. Quindi uno studio sulle pratiche di revisione del codice ha scoperto che le revisioni del codice tendevano a impiegare più tempo a trovare bug nel codice OO rispetto al codice procedurale, perché il flusso salta di più nel codice OO. Pratiche come il TDD e la programmazione di coppie lo mitigano, ma è ancora un risultato interessante (e per me inaspettato).

5
Questa potrebbe essere la risposta perfetta: informazioni complete, ma abbastanza brevi da impedire al lettore di leggere un romanzo. Bravo
Tim Claason,

@Graham Lee: sarei interessato a leggere quello studio.
Frank Shearar,


13

Interfacce utente grafiche. Alla fine degli anni Ottanta, all'inizio degli anni Novanta, quando Mac, Amiga, Atari ST, Windows e GEM iniziarono a sostituire le interfacce utente basate sui caratteri, divenne ovvio che linguaggi come il C non erano adatti per scrivere programmi GUI. Mentre l'elaborazione tradizionale dei dati è considerata come uno schema di "dati di input -> elaborazione -> dati di output", che potrebbe essere eseguito anche in un linguaggio procedurale, le funzionalità di OO sono state utili per gestire la complessità intrinseca di una GUI.


1
+1 per menzionare le applicazioni della GUI. L'orientamento agli oggetti era lo strumento che consentiva di implementare le GUI, che altrimenti sarebbero state piuttosto difficili da gestire (con codice procedurale).
Giorgio,

7

Il nascondimento dei dati fornito da Encapsulation.


Questa è una risposta? Gli ADT forniscono nascondigli di dati (motivo per cui vengono chiamati "astrazioni di dati")
Frank Shearar,

@Frank, mi ha chiesto caratteristiche specifiche e quando ho scritto questa risposta, ce n'era solo un'altra e stavo cercando di non duplicare.

Abbastanza giusto, ma l'incapsulamento non è esattamente specifico di OO. Dovrei verificarlo da solo, ma sono abbastanza sicuro che stessimo facendo incapsulamenti molto prima di OO.
Frank Shearar,

1
@Frank, sono d'accordo che non è specifico per OO, è solo una delle sue caratteristiche principali.

Questo è vero per la maggior parte delle OOPL, ma non per tutte. CLOS è un'eccezione notevole.
Frank Shearar,

7

Una funzionalità che non è stata ancora menzionata da nessuna delle altre risposte: la modellazione del dominio . Poiché le persone tendono a pensare di fare cose con o verso oggetti e di oggetti con proprietà intrinseche, è molto facile modellare un problema o un flusso di lavoro utilizzando un software orientato agli oggetti. In sostanza, ci consente di utilizzare la nostra capacità esistente di trattare nomi, verbi e aggettivi nel codice.


6

Penso che l'ereditarietà sia il punto più importante di OOP.

[dallo sviluppo del gioco] Puoi creare qualcosa come una classe Drawable, con metodi e attributi di rendering, e creare una classe Spaceship and Planet, che eredita da Drawable. Prendi tutti gli oggetti da quelli [e dagli altri Sprite child], lancia un drawableObjArray e chiama semplicemente il metodo draw per ogni oggetto. Devi solo sapere che è un Drawable.


2
Veramente?? Il polimorfismo è MODO più importante e non richiede ereditarietà (dal punto di vista teorico).
Thomas Eding,

Non richiede nemmeno funzioni virtuali, basta usare i puntatori a funzione.
Calmarius,

1
Il concetto originale di OO di Alan Kay non includeva neppure l'eredità perché non gli piaceva come fosse implementato nei sistemi precedenti.
Michael Borgwardt,

3

Astrazione

Fornire i servizi necessari nascondendo le cose inutili. Vedi la mia spiegazione qui- Cos'è l'astrazione?


Errore di battitura: "Absraction" dovrebbe essere "Abstraction"
Vetle

2

Ha un certo successo perché incoraggia l'uso dell'organizzazione delle cose della mente umana negli oggetti. Le persone sono generalmente brave a vedere relazioni di cose - cose come differenze, somiglianze e comportamenti. OO incoraggia lo sviluppo di software per imitare la concettualizzazione umana del mondo.

Rendere lo sviluppo del software simile a come vediamo il mondo rende più semplice per la nostra mente gestire la complessità.


Forse è a causa di una maggiore esperienza procedurale, ma dopo aver usato entrambi i metodi, trovo ancora procedurale più intuitivo rispetto a OOP. Mi piacciono comunque le parti buone di entrambi gli stili.
Juha Untinen,

1

" ADT vs objects " è stato chiesto un numero di volte qui. La risposta di una riga è "Gli ADT e gli oggetti sono l'inverso l'uno dell'altro - ciò che uno si sottrae ordinatamente l'altro non può; ciascuno consente flessibilità in modi diversi".

Per una risposta più lunga, vedi L'intesa sull'introduzione dei dati di William Cook , rivisitata . In breve, gli oggetti consentono di utilizzare facilmente più implementazioni / rappresentazioni di alcuni dati (qualcosa che assomiglia a un elenco potrebbe essere un array, un albero auto-bilanciante o ...) ma rendere difficile l'aggiunta di nuove operazioni (perché devi aggiungere quella nuova operazione a ciascuna delle tue rappresentazioni), mentre gli ADT rendono facile aggiungere nuove operazioni al tuo tipo di dati, ma rendono difficile avere più implementazioni.

Modifica: avevo detto che il passaggio di messaggi era ciò che rendeva OO di successo. Sulla base del commento di Jonas, non è corretto, perché la maggior parte delle lingue che la gente considera OO non usa il passaggio di messaggi. Dal momento che non è giusto, l'ho eliminato dalla mia risposta.


1
Il passaggio dei messaggi non può essere la risposta poiché nessuno dei linguaggi OOP riusciti lo utilizza.
Jonas,

Il tuo OO non è necessariamente il mio OO. E la maggior parte delle lingue chiamate OO non lo sono, secondo la definizione di Alan Kay. Dimentico la citazione esatta, ma Kay ha detto che gli oggetti non erano ciò che era importante in Smalltalk, ma il passaggio di messaggi (e che la maggior parte ha mancato questo punto).
Frank Shearar,

@Jonas Immagino, dopo aver riletto la domanda e la mia risposta, che sto dicendo a metà "OO non ha successo, poiché così poche lingue lo fanno bene." Ma dico cose del genere solo quando indosso la mia tuta ignifuga.
Frank Shearar,

0

Le mie tre caratteristiche principali. Composizione dell'oggetto: consentire agli oggetti di collaborare. Polimorfismo: supporta comportamenti dinamici in fase di esecuzione. Ereditarietà: riutilizzando il codice e modificando il comportamento mediante la sostituzione dei metodi.

ADT - puoi averlo anche in linguaggi non orientati agli oggetti come Pascal. Uno stack o una coda sono esempi di ADT.


"ADT - puoi averlo anche in linguaggi non orientati agli oggetti come Pascal. Uno stack o una coda sono esempi di ADT.": True. OOP semplifica la definizione dell'interfaccia di un ADT e fornisce un'implementazione diversa e intercambiabile (interfaccia / classe astratta <---> sottoclassi / classi concrete). Per quanto ne so, non è così facile in Pascal.
Giorgio,

0

in parole semplici OOP è la chiave per la riutilizzabilità e l'incapsulamento che si traduce nella produzione di grandi framework che rendono la vita facile per i programmatori in questa era in quanto possono semplicemente chiamare le API e fare ciò che il giorno vogliono più spesso.

come la tua domanda riguarda le 4 funzionalità di OOP, quindi puoi dire

  1. Ereditarietà e 4. L'incapsulamento sono le caratteristiche più importanti e gli altri due sono molto necessari per raggiungere i primi due

quindi 1. Il passaggio dei messaggi e 3. Il polimorfismo in realtà supporta 2. Eredità e 4. Incapsulamento.

  1. Ereditarietà e 4. L'incapsulamento è la chiave del successo di OOP

l'ereditarietà non è richiesta, una componente determinante o addirittura una parte molto desiderabile di OOP per la maggior parte del tempo. l'incapsulamento è un buon principio per la programmazione in generale. non è stato inventato da OOP e non è utilizzato esclusivamente in OOP.
Sara

-1

A mio avviso, le ultime tre funzionalità sono le più importanti una volta che hanno influito sull'uso diffuso di OOP:

2. Inheritance
3. Polymorphism
4. Encapsulation

Modifica: un altro punto sarebbe IDE e ambienti di sviluppo dell'interfaccia grafica come Visual Studio ed Eclipse. Mentre abbracciano le lingue OOP, così sempre più progetti tendevano verso OOP.

E ovviamente i principi solidi sono quelli che rendono i prodotti software ROCK solidi realizzabili :)

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.