Criteri per una lingua da considerare "orientata agli oggetti"

3

Ho avuto una discussione sulla programmazione OO oggi e navigando su Internet ho trovato molte specifiche differenti per i linguaggi orientati agli oggetti.

  • Quali sono i requisiti per un linguaggio orientato agli oggetti? Per me un linguaggio orientato agli oggetti deve avere classi, ereditarietà e incapsulamento.
  • C è un linguaggio orientato agli oggetti solo perché puoi usare le strutture e il programma con un design orientato agli oggetti? Perché / perché no?

Ci sono dei buoni siti / articoli su questo? E per favore, nessun link di Wikipedia perché sono già stato lì.

    
posta nist 19.03.2012 - 18:36
fonte

6 risposte

5

OO è solitamente "definito" in termini di quattro requisiti di base:

  • Abstraction significa che sei in grado di separare un comportamento esternamente visibile dagli oggetti dalla sua implementazione.

  • Incapsulamento significa essere in grado di nascondere i dettagli dell'implementazione di un oggetto (così strettamente correlato all'astrazione che alcuni autori li trattano come uno solo, lasciando solo tre requisiti principali).

  • Modularità significa poter impacchettare le astrazioni in unità discrete.

  • Gerarchia è una classifica o ordinamento di astrazioni: una capacità di definire la relazione tra un'astrazione e l'altra.

Io, per esempio, considererei un oggetto orientato alla lingua se supporta questi quattro requisiti principali. I supporti, tuttavia, vanno un po 'oltre "consente" o "tollerano".

C, ad esempio, offre una flessibilità sufficiente per poter simulare ciascuno di questi abbastanza bene. C, tuttavia, fornisce solo un piccolo supporto per l'astrazione o la modularità, e nessuna per l'incapsulamento o la gerarchia - puoi fare queste cose se vuoi abbastanza male, ma il linguaggio non fornisce alcun supporto diretto per loro.

C ++, per un confronto ovvio fornisce supporto diretto per ciascuno di questi requisiti. Ad esempio, l'incapsulamento è direttamente supportato rendendo i membri della classe privati e / o protetti e le gerarchie sono supportate tramite l'ereditarietà delle classi.

Questo non è ancora quello che normalmente si chiamerebbe un linguaggio "puro" orientato agli oggetti. In un linguaggio OO puro (ad esempio Smalltalk), non si ottiene solo il supporto per la gerarchia, ma si ottiene una gerarchia predefinita di tipi e si deve definire la relazione di qualsiasi nuovo tipo con un tipo esistente in tale gerarchia (ad es. , tutto il tuo codice si trova nelle classi e ogni classe deve derivare da una esistente).

Sebbene le classi e l'ereditarietà siano comuni a molte implementazioni dell'orientamento agli oggetti, non è nemmeno necessario. Ad esempio, Self e JavaScript utilizzano entrambi gerarchie basate su esempi. Invece di una gerarchia di classi, con ogni oggetto un'istanza di una classe, questi usano solo una gerarchia di oggetti, ciascuno basato su qualche altro oggetto, ma modificato in qualche grado arbitrario.

    
risposta data 19.03.2012 - 19:09
fonte
5

Secondo Rumbaugh et al., "Object-Oriented Modeling and Design", oggetti sono caratterizzati dalle seguenti caratteristiche:

  • Identità : i dati vengono quantizzati in entità distinte e distinguibili, denominati oggetti .
  • Classificazione : gli oggetti con la stessa struttura e il medesimo comportamento sono raggruppati per formare classi .
  • Polymorphism : la stessa operazione (un'operazione con lo stesso nome) può comportarsi in modo diverso su classi diverse.
  • Ereditarietà : condivisione di attributi e operazioni tra classi sulla base di una relazione gerarchica.

Secondo questa definizione, un linguaggio OO dovrebbe supportare questi concetti in modo nativo. In C puoi definire struct quale struttura condivisa, ma non comportamento ( classificazione struttura senza classificazione comportamento ). Puoi definire identità per mezzo di handle per gli oggetti dati (puntatori). Il polimorfismo e l'ereditarietà mancano del tutto e devono essere implementati attraverso tecniche ad-hoc.

Quindi, secondo questi criteri, C non è un linguaggio orientato agli oggetti. Utilizzando alcune tecniche ad-hoc che è possibile implementare e la progettazione orientata agli oggetti in C, ma C non ha concetti sufficienti per supportarlo direttamente.

    
risposta data 19.03.2012 - 19:13
fonte
1

L'unico requisito realistico che un linguaggio deve essere OOP è che è possibile impiegare almeno una buona parte del tempo che effettivamente gestisce OOP invece di aggirare le sue carenze. Qualcosa come per es. C è appena eccezionale, ma è utilizzabile. Se sei disperato.

Quali linguaggi di programmazione sono l'OOP più puro? Quali denominazioni sono i cristiani più puri? Non c'è modo di ottenere una risposta corretta o obiettiva a questa domanda - non c'è nemmeno una definizione utile di "puro". E in secondo luogo, anche se potrebbe scegliere il linguaggio che non aveva altre caratteristiche non OOP ed era "puro" nella definizione scientifica, cioè, solo una cosa, allora sarebbe un terribile lingua. OOP non è un bambino prodigio, non è buono per tutto per miglia, e solo offrendo OOP manda una lingua proprio nel mucchio di cose orribili.

    
risposta data 19.03.2012 - 18:41
fonte
1

Il principio di sostituzione di Liskov è praticamente la definizione di Object Orientated.

Sebbene in pratica l'incapsulamento e l'occultamento dei dati siano probabilmente più utili

    
risposta data 19.03.2012 - 19:08
fonte
1

È difficile dire cosa significhi per un linguaggio essere orientato agli oggetti. In realtà, è difficile dire cosa significhi che una lingua sia X , dove X può essere OO, FP, qualsiasi cosa.

La definizione ufficiale di Orientamento agli oggetti è

  • Messaggi,
  • conservazione locale e protezione e occultamento del processo dello stato e
  • estrema rilegatura in ritardo di tutte le cose

Ma nota che questo descrive le proprietà di un programma , non una lingua .

Personalmente, direi che una lingua è orientata agli oggetti se facilita e incoraggia la costruzione di programmi che soddisfano la definizione di cui sopra. Dire che una lingua è OO se permette che è inutile: ogni lingua completa di Turing consente tutto. La domanda è: come facile è da usare?

C certamente consente la programmazione funzionale. E programmazione orientata agli oggetti. E programmazione logica. Ma nessuno di questi è facile in C, né C facilita o incoraggia la programmazione in quegli stili.

Inoltre, si noti che la definizione di cui sopra non menziona nulla sulle classi. Perché dovrebbe? Dopotutto, si chiama OOP, non COP. Infatti, non menziona nemmeno objects ! Alan Kay stesso afferma di rimpiangere di chiamarlo orientato agli oggetti, e invece di chiamarlo orientato ai messaggi , dato che la cosa importante sono i messaggi , non gli oggetti ( e certamente non classi).

    
risposta data 20.03.2012 - 00:02
fonte
1

Molti anni fa ho letto di questo argomento in un libro JavaScript, non riesco a ricordare quale sia. Ma posso ancora ricordare la discussione sul fatto che JavaScript debba essere considerato come un linguaggio OOP, la risposta dell'autore è sì, perché soddisfa i quattro criteri per un linguaggio orientato agli oggetti:

  1. Incapsulamento , che ti consente di combinare dati e procedure gestisce i dati insieme.
  2. Ereditarietà (piuttosto semplice, qualcuno ha spiegato sopra)
  3. Polymorphism (qualcuno ha spiegato sopra)
  4. Composizione , che consente di definire un oggetto di una classe come un altro dati dei membri della classe.
risposta data 16.06.2016 - 13:19
fonte

Leggi altre domande sui tag