Concetti di programmazione orientata agli oggetti

5

Specifically, programming without inheritance is distinctly not object-oriented; we call it programming with abstract data types.

Ho trovato questa grande linea dal libro "Analisi orientata agli oggetti e progettazione con applicazioni" di Grady Booch . Quindi, affinché un programma sia OO, l'ereditarietà, l'astrazione, l'incapsulamento e il polimorfismo (?) Devono essere le cose da fare?

Qualcuno potrebbe spiegarmi?

    
posta Prakash Bala 10.01.2012 - 11:49
fonte

5 risposte

2

L'astrazione e l'incapsulamento sono davvero le uniche cose necessarie affinché qualcosa sia orientato agli oggetti.

L'ereditarietà e il polimorfismo sono strategie per trarre vantaggio dal NON "reinventare la ruota", il che è un vantaggio nell'uso di progetti OO.

L'idea alla base del design OO è far sì che una grande quantità di programmatori lavorino insieme sul progetto X senza incorrere in ingenti costi di comunicazione e la rottura di un progetto in oggetti con una comunicazione definita tra loro è una soluzione elegante.

    
risposta data 10.01.2012 - 20:42
fonte
1

Risposta rapida breve

La risposta è molto soggettiva per l'analista del software o il modellista del software.

Risposta di alesaggio estesa

Esistono diversi concetti correlati o parte del paradigma Object Oriented. Ne hai già menzionato la maggior parte.

Ad esempio, un concetto che non hai menzionato, è il passaggio di messaggi, che manca nella maggior parte degli O.O. linguaggi di programmazione, ed era disponibile, insieme con l'incapsulamento e l'ereditarietà dei primi O.O. linguaggi di programmazione ("Simula").

Ho lavorato a volte con diverse varianti o "idiomi" di Object Oriented Pascal, che aveva molte di quelle funzionalità, e c'era una variante che permetteva di usare "messaggi", come parte del linguaggio di programmazione (parola chiave "messaggio"), simile alle eccezioni "try catch", ma, senza interrompere l'esecuzione.

Mentre, altre varianti e altri linguaggi di programmazione sono forniti come librerie opzionali (funzioni non parole chiave).

Riepilogo

Potresti scoprire che a volte un linguaggio di programmazione potrebbe saltare alcuni di essi e essere ancora considerato da alcune persone O.O., mentre altri no. È molto soggettivo.

Stai chiedendo pura curiosità intellettuale?

Ti chiedi se il linguaggio di programmazione che stai utilizzando sia completamente O.O. ?

Stai lavorando con un lavoro di collega / università personalizzato O.O. linguaggio di programmazione?

Lavori con un hobby, un progetto per animali domestici, un O.O. personalizzato linguaggio di programmazione?

Queste domande, è la mia curiosità personale, ma, anche per sapere come rendere la mia risposta più chiara; -)

Ci sono alcuni linguaggi di programmazione e amp; programmi di confronto di paradigmi di programmazione presso università e università, che trattano questo argomento.

Saluti.

    
risposta data 10.01.2012 - 18:52
fonte
0

Frasi utili da C ++ Faq Lite (non essere infastidito dalla sua relazione con C ++, i concetti sono gli stessi in qualsiasi linguaggio OOP):

" L'ereditarietà è ciò che separa la programmazione del tipo di dati astratti (ADT) da Programmazione OO. "

" La programmazione con le classi ma senza il collegamento dinamico è chiamata object based, ma non orientato agli oggetti. " Si noti che il legame dinamico è un altro termine per il polimorfismo. Anche l'ereditarietà AFAIK è necessaria per implementare le classi polimorfiche.

Quindi per rispondere alla tua domanda principale, sì, tutte le cose che stai citando sono "indispensabili" per scrivere un buon codice OOP.

    
risposta data 10.01.2012 - 20:56
fonte
0

È possibile modellare qualsiasi dominio senza ereditarietà. L'ereditarietà aiuta a volte a essere più chiari sulle classi, ma non è una cosa obbligatoria nell'orientamento agli oggetti, nonostante la citazione di Booch.

    
risposta data 10.01.2012 - 19:44
fonte
0

Programmare con tipi di dati astratti significa che quando scrivi:

struct A { int i; float k; };

Puoi usare A a; come astrazione di alcuni bit come [00000000] [00000000] (con il numero corretto di bit).

L'ereditarietà aggiunge la seguente funzione:

class A { public: virtual void f()=0; };
class B1 : public A { public: void f() { ... } int a; int b; };
class B2 : public A { public: void f() { ... } int i; float k; };
void algo(A &a) { a.f(); a.f(); }
int main() { B1 b; algo(b); B2 b2; algo(b2); }

vale a dire. Quando ci sono diverse classi come B1,B2,B3 gli algoritmi come algo() possono funzionare con tutti loro, anche se il formato dei bit cambia tra B1 e B2 , come { int a; int b; } è diverso da { int i; float k; } . È necessario riscrivere solo f() , non l'intero algo() .

    
risposta data 10.01.2012 - 23:38
fonte

Leggi altre domande sui tag