Quali sono le funzionalità richieste per l'Orientamento degli oggetti?

9

Mi sto solo chiedendo quali siano esattamente le caratteristiche che una lingua o una libreria devono fornire per essere definite come "Object Oriented". L'Orientamento agli oggetti è qualcosa che può, più o meno, essere raggiunto in qualsiasi linguaggio di programmazione generico con funzioni decenti? O è qualcosa che può essere raggiunto solo in lingue che pubblicizzano specificamente che supportano la programmazione orientata agli oggetti?

Ad esempio, guarda il seguente codice C:

SDL_Surface* screen = SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE);
SDL_FreeSurface( screen );

o il codice discusso qui .

Ora il codice sopra non usa l'ereditarietà, il polimorfismo di runtime (?), le funzioni virtuali, ecc. Ma mi sembra piuttosto OOP.

L'Object-Orientation sta semplicemente scrivendo un codice che si basa su strutture di dati creabili e distruttibili come oggetti, classi, strutture ecc. che non richiede alcun modello speciale o caratteristiche fornite dal linguaggio di programmazione o un library ?

    
posta ApprenticeHacker 31.01.2012 - 10:43
fonte

7 risposte

11

Secondo Alan Kay, che ha inventato il termine "object oriented",

OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things. It can be done in Smalltalk and in LISP. There are possibly other systems in which this is possible, but I'm not aware of them.

Messaggi (come implementato in Smalltalk) è un concetto paragonabile al polimorfismo, ma piuttosto più potente (almeno rispetto al tipo di polimorfismo supportato da C ++ o Java). Può essere fatto in tutte le lingue, ma è piuttosto doloroso se non supportato direttamente dalla lingua. Fondamentalmente significa che gli oggetti possono inviarsi reciprocamente messaggi contenenti qualcosa, e amd può reagire come vogliono i messaggi che ricevono. Per supportare completamente la messaggistica, deve esserci un modo per gli oggetti di reagire in modo flessibile ai messaggi senza enumerarli nel codice sorgente (che è fondamentalmente ciò che fanno le definizioni metodo / funzione).

conservazione locale e protezione e occultamento del processo statale - l'incapsulamento AKA - può essere fatto per convenzione in tutte le lingue, ma questo è un inganno. La conservazione locale a livello di lingua sembra essere l'unica caratteristica di tutte le lingue che sostengono di essere OO (e molte altre no): c'è generalmente un modo per creare tipi di dati composti con più istanze. La protezione e il nascondimento, d'altra parte, spesso viene fatta solo per convenzione.

late-binding of all things - una scala mobile su cui C è veramente molto lontano dalla visione di Kay (As is C ++, mentre Java è molto più vicino). Può essere falsificato (vedi COM), ma sarà un problema da usare.

Nota come Kay non menziona ereditarietà . Nella stessa email ha scritto

I didn't like the way Simula I or Simula 67 did inheritance (though I thought Nygaard and Dahl were just tremendous thinkers and designers). So I decided to leave out inheritance as a built-in feature until I understood it better

    
risposta data 31.01.2012 - 11:40
fonte
5

La programmazione orientata agli oggetti non riguarda le caratteristiche di sintassi, è una filosofia di programmazione e progettazione. Al suo interno sta il concetto di un oggetto , che è un costrutto che raggruppa lo stato con le routine per agire su di esso (o, a seconda del punto di vista, le risposte ai messaggi). L'altro aspetto importante di OOP è encapsulation : il wrapping dei dettagli di implementazione in strutture opache e il loro collegamento attraverso interfacce ben definite. Praticamente tutto il resto della teoria OOP risale a questi due fondamenti.

Quindi, qualsiasi linguaggio che può in qualche modo modellare oggetti (entità che contengono sia dati che codice) e incapsulamento può essere usato per fare OOP. Ad esempio, in C è possibile utilizzare i puntatori di funzione per memorizzare le funzioni nelle strutture e utilizzare il file system di intestazione / origine per realizzare l'incapsulamento. Non è conveniente, ma è sufficiente per fare OOP. Probabilmente puoi persino piegare qualcosa come Haskell o ML nel fare OOP, e non sarei sorpreso se qualcuno potesse inventare un modo di fare OOP in assemblea.

In pratica, tuttavia, un linguaggio può essere chiamato 'orientato agli oggetti' se fornisce un set completo di funzioni di sintassi per la programmazione orientata agli oggetti esplicita. In genere, ciò significa che una lingua del genere dovrebbe avere: * una nozione di un oggetto * una nozione di metodo di chiamata o passaggio di messaggi * un modo comodo e diretto per controllare l'accesso ai membri degli oggetti * un modo comodo e diretto per definire le interfacce

Di conseguenza, chiamerei un pezzo di codice orientato agli oggetti se si aderisce ai principi OOP e utilizza la sintassi OOP disponibile.

BTW., il tuo esempio di codice probabilmente fa usa il polimorfismo e le funzioni virtuali, sebbene la sintassi C non lo renda ovvio. Non sono un esperto di SDL, ma mi aspetterei che un SDL_surface sia in grado di rappresentare vari tipi di superfici, ognuna con un proprio specifico insieme di implementazioni - blittare qualcosa su una bitmap di memoria e passare a una superficie dello schermo richiede un codice radicalmente diverso, ma l'interfaccia (le funzioni che accettano un SDL_surface* come argomento) rimane la stessa. Proprio così, implementa anche l'incapsulamento: non è possibile accedere direttamente alla rappresentazione sottostante di una superficie, devi passare attraverso funzioni che sanno come gestire un SDL_surface , perché è tutto ciò che hai. È un bell'esempio di come potresti fare OOP in C.

    
risposta data 31.01.2012 - 12:17
fonte
4

La mia comprensione di OO è che OO è un modo di pensare e un'implementazione che si basa sull'idea che un compito computazionale può essere raggiunto da un lavoratore (oggetto) o dalla collaborazione di singoli lavoratori (oggetti) tramite il messaggio che passa tra quei lavoratori (oggetti) in fase di esecuzione. Questo comportamento in fase di esecuzione richiede costrutti statici solidi e dinamici per attivarlo.

La sintassi specifica per implementare OO non è la chiave che determina se una lingua è OO o no. Ad esempio, Smalltalk e C # hanno differenti sintassi, ma entrambi sono linguaggi OO (a vari livelli). La chiave è se la lingua data conserva la filosofia (sopra) e fornisce i mezzi di impianto richiesti.

    
risposta data 31.01.2012 - 11:26
fonte
2

Quando ero studente mi è stato insegnato che la programmazione orientata agli oggetti poggia su tre pilastri:

  • incapsulamento ,
  • polimorfismo e
  • eredità .

Una lingua dovrà supportare tali funzioni per essere considerata un linguaggio orientato agli oggetti.

Tieni presente che questo descrive un insieme di funzioni , piuttosto che sintassi . Quindi, se devi scrivere

type obj; // or type obj = new type;
obj.func(arg);

o

type* ptr = create_type();
func(ptr, arg); 

non importa.

Quindi puoi effettivamente programmare secondo il paradigma orientato agli oggetti in C. Ma il linguaggio non offre alcun supporto per questo, il che lo rende un esercizio piuttosto doloroso. Questo è il motivo per cui C non è considerato un linguaggio orientato agli oggetti.

    
risposta data 31.01.2012 - 10:58
fonte
2

puoi fare OO in qualsiasi linguaggio decente per tutti gli usi.

È più semplice farlo in un linguaggio "OO", perché hai costrutti idiomatici disponibili e non devi ricorrere a qualcosa come OO in C - che è possibile, ma orribile.

Se i costrutti OO sono forniti dal linguaggio stesso, dalla sua libreria standard, o da qualche altra libreria, non importa molto, in quanto alcune lingue (es. Scala) permettono alle librerie di aggiungere costrutti linguistici in modo che dal punto di vista del programmatore è quasi impossibile distinguere quali sono le cose fornite dal linguaggio principale e quali da una libreria.

    
risposta data 31.01.2012 - 11:00
fonte
2

Se osservi la gamma di lingue che sono state ampiamente accettate come OO e quelle che non lo hanno fatto, il test sembra essere il supporto per polymorphism di inclusione (noto anche come polimorfismo di sottotipo, ma il polimorfismo di inclusione è il termine usato da Cardelli nel articolo che mi ha introdotto, e penso un bel po 'di altri, a una classificazione dei tipi di polimorfismo). OSSIA la possibilità per alcune variabili di avere valori di diversi tipi e la possibilità per alcune chiamate di inviare a routine diverse a seconda del tipo di uno o più valori. Tutto il resto è stato presente in lingue non accettate come OO o mancanti nelle lingue accettate come OO.

Le due principali altre caratteristiche associate alle lingue OO sono state fornite da lingue non OO:

  • L'incapsulamento è abbastanza ben fornito da Ada83;
  • L'ereditarietà è offerta da Oberon (Oberon è interessante, Wirth voleva fornire un linguaggio OO con meno cruft possibile, ma ha dovuto rivisitare il suo concetto per averne uno - Oberon-2 è OO).
risposta data 31.01.2012 - 14:32
fonte
1

L'orientamento dell'oggetto è definito come

controlla anche le voci di wikipedia. quelle sono le caratteristiche che un linguaggio deve fornire per essere definite come orientate agli oggetti.

considera il tuo codice orientato agli oggetti se si trova in un linguaggio di programmazione orientato agli oggetti. anche se scrivi qualcosa che sembra essere procedurale, agirà sui metodi degli oggetti delle classi che usano il polimorfismo tramite l'incapsulamento [forse]:)

riguardo alla tua ultima domanda la risposta è probabilmente. sì. orientato agli oggetti è fondamentalmente solo agendo su metodi sugli oggetti e passando attorno a tali oggetti come parametri.

    
risposta data 31.01.2012 - 10:56
fonte