Che cosa ha reso la programmazione orientata agli oggetti riuscita? [chiuso]

17

Cos'è questa funzionalità secondo te che ha reso la programmazione orientata agli oggetti così tanto efficace?

  1. Passaggio del messaggio
  2. Inheritance
  3. Il polimorfismo
  4. incapsulamento

O qualche altra funzione che potresti voler introdurre.

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

    
posta Tony 02.11.2010 - 06:58
fonte

11 risposte

76

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

Il cervello umano può contenere così tanti concetti contemporaneamente: mi viene in mente il limite spesso quotato di ricordare 7 +/- 2 elementi indipendenti.

Quando lavoro su un sistema da 600kloc al lavoro, non riesco a tenere tutto in mente in una volta. Se dovessi farlo, sarei limitato a lavorare su molto sistemi più piccoli.

Fortunatamente, non è necessario. I vari modelli di design e altre strutture che abbiamo utilizzato in quel progetto significano che non devo occuparmi dell'intero sistema in una sola volta: posso raccogliere singoli pezzi e lavorarci sopra, sapendo che si adattano all'applicazione più ampia in modi ben definiti.

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

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

Abstraction - lascia che mi concentri sulle caratteristiche essenziali e ignori ciò che non è rilevante.

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

Polymorphism : permettimi di chiedere un servizio senza preoccuparti di come diversi oggetti potrebbero fornirlo in modi diversi.

Ereditarietà : lascia che riutilizzi un'interfaccia o un'implementazione, fornendo solo i pezzi che sono diversi da quelli precedenti.

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

Principio di sostituzione di Liskov - non poniamo trappole l'una per l'altra introducendo dipendenze dispari

Principio Aperto / Chiuso - consentiamo l'estensione e la modifica in modi che non ci impongono di rischiare di rompere il codice esistente

Iniezione di dipendenza : prendiamo la composizione al livello successivo e assembliamo i componenti molto più tardi.

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

    
risposta data 02.11.2010 - 07:38
fonte
13

Interfacce utente grafiche. Verso la fine degli anni Ottanta, primi anni Novanta, quando Mac, Amiga, Atari ST, Windows e GEM iniziarono a sostituire le interfacce utente basate su caratteri, divenne ovvio che linguaggi come C non sono adatto per scrivere programmi GUI. Mentre l'elaborazione tradizionale dei dati è considerata come uno schema "input data - > processing - > output data", che potrebbe essere eseguito in un linguaggio procedurale altrettanto bene, le funzionalità di OO sono state utili per gestire la complessità intrinseca di una GUI. / p>     

risposta data 02.11.2010 - 22:20
fonte
7

Nascondersi dei dati fornito da Encapsulation.

    
risposta data 02.11.2010 - 07:10
fonte
7

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

    
risposta data 02.11.2010 - 10:25
fonte
6

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

[dallo sviluppo del gioco] È possibile creare qualcosa come una classe Drawable, con metodi e attributi di rendering e creare una classe Spaceship e Planet, che eredita da Drawable. Prendi tutti gli oggetti da quelli [e altri figli dello Sprite], lancia in un oggetto DrawableObjArray e chiama il metodo draw per ogni oggetto. Devi solo sapere che è un Drawable.

    
risposta data 02.11.2010 - 07:10
fonte
3

Astrazione

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

    
risposta data 02.11.2010 - 10:56
fonte
2

È un po 'di successo perché incoraggia l'uso dell'organizzazione delle cose della mente umana in oggetti. Le persone sono generalmente brave a vedere i rapporti delle 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ù facile per la nostra mente gestire la complessità.

    
risposta data 02.11.2010 - 15:39
fonte
1

" ADT vs objects " è stato chiesto più volte qui. La risposta su una riga è "ADT e oggetti sono l'inverso l'uno dell'altro - ciò che si astrae in modo ordinato l'altro non può, ognuno consente flessibilità in modi diversi."

Per una risposta più lunga, vedi Informazioni sull'astrazione dei dati, rivisitato di William Cook. . In breve, gli oggetti ti permettono di usare facilmente più implementazioni / rappresentazioni di alcuni dati (qualcosa che assomiglia a una lista potrebbe essere una matrice, o un albero di auto-bilanciamento, o ...) ma rendono difficile aggiungere nuove operazioni (perché tu devi aggiungere questa nuova operazione a ciascuna delle tue rappresentazioni), mentre gli ADT semplificano l'aggiunta di nuove operazioni sul tuo tipo di dati, ma rendono difficile avere più implementazioni.

Modifica: avevo detto che il passaggio dei messaggi era ciò che rendeva OO un successo. Basato sul commento di Jonas, non è giusto, perché la maggior parte delle lingue che le persone considerano OO non usa il passaggio dei messaggi. Dal momento che non è giusto, l'ho estratto dalla mia risposta.

    
risposta data 02.11.2010 - 15:40
fonte
0

Le mie tre funzioni principali. Composizione oggetto: consente agli oggetti di collaborare. Polymorphism: supporta i comportamenti dinamici in fase di runtime. Ereditarietà: riutilizzando il codice e modificando il comportamento tramite metodi che eseguono l'override.

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

    
risposta data 02.11.2010 - 07:06
fonte
0

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

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

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

quindi 1. Passaggio dei messaggi e 3. Il polimorfismo supporta effettivamente 2. Ereditarietà e 4. Incapsulamento.

  1. Ereditarietà e 4. L'incapsulamento è la chiave del successo per OOP
risposta data 02.11.2010 - 07:31
fonte
-1

Secondo me, 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, quindi sempre più disegni tendevano verso OOP.

Ovviamente Principi SOLID sono gli strumenti che rendono i prodotti software ROCK deliverable solido:)

    
risposta data 12.12.2012 - 15:45
fonte

Leggi altre domande sui tag