Vantaggi del linguaggio OOP classico rispetto a quello Go-like


13

Ho riflettuto molto sul design del linguaggio e su quali elementi sarebbero necessari per un linguaggio di programmazione "ideale", e studiare Go di Google mi ha portato a mettere in discussione molte conoscenze altrimenti comuni.

In particolare, Go sembra avere tutti i vantaggi interessanti della programmazione orientata agli oggetti senza avere effettivamente la struttura di un linguaggio orientato agli oggetti. Non ci sono classi, solo strutture; non esiste eredità di classe / struttura, ma solo incorporamento della struttura. Non ci sono gerarchie, nessuna classe genitore, nessuna implementazione esplicita dell'interfaccia. Invece, le regole di cast del tipo si basano su un sistema libero simile alla "duck-typing", in modo tale che se una struttura implementa gli elementi necessari di un "Reader" o una "Richiesta" o una "Codifica", allora puoi lanciarla e usarla come una.

C'è qualcosa in OOP implementato in C ++ e Java e C # che è intrinsecamente più capace, più gestibile, in qualche modo più potente che devi rinunciare quando ti sposti in un linguaggio come Go? Che vantaggio hai a rinunciare per ottenere la semplicità che questo nuovo paradigma rappresenta?

EDIT
Rimossa la domanda "obsoleta" su cui i lettori sembravano eccessivamente aggrappati e infuriati.

La domanda è: che cosa offre il tradizionale paradigma orientato agli oggetti (con gerarchie e simili) come spesso visto nelle implementazioni del linguaggio comune che non può essere fatto così facilmente in questo modello più semplice? O, in altre parole, se dovessi progettare una lingua oggi, c'è un motivo per cui vorresti includere il concetto di gerarchie di classi?


1
OOP ha reso obsoleta la programmazione procedurale? Odio sembrare pedante o che ti sto parlando, ma quella è stata la prima frase che mi è venuta in mente. Go fornisce un nuovo paradigma (ish). Con la sperimentazione, gli utenti scopriranno in cosa è bravo e in cosa non è bravo (come in tutti i paradigmi e in tutte le lingue) e finiremo con centinaia di ottimi prodotti (insieme a una buona dose di prodotti cattivi) scritti in Go . Almeno, questa è la mia opinione
Jamie Taylor,

1
Ci sono alcune letture interessanti quando Google per OOP è morto . Consiglio che il Web morirà quando OOP muore
Andomar il

C'è un valore così piccolo in OOP che non vale la pena sprecare il tuo tempo.
SK-logic,

1
Concordo con il commento precedente non concentrarmi troppo su OOP. Inoltre OOP non significa C ++ o Java. Prova a leggere abit su ltu.org
AndreasScheinert il

C ++, Java e C # non sono linguaggi OOP "classici". Se esiste un linguaggio OOP classico, penso che sia Smalltalk.
Kevin Cline,

Risposte:


16

Non esiste un nuovo paradigma. L'orientamento agli oggetti è un modello che usi per scrivere programmi, che non è nemmeno chiaramente definito. Vari linguaggi forniscono vari tratti tipici dell'orientamento agli oggetti (definizione di nuovi tipi, incapsulamento, gerarchie di tipi, polimorfismo, passaggio di messaggi e altro) ma potrebbero non fornire altri. In questi casi spetta ai programmatori emularli in caso di necessità.

Molti dei linguaggi che forniscono queste funzionalità non hanno un analogo del concetto di classe, ad esempio Javascript e Common Lisp. L'implementazione fornita da linguaggi simili a Java (basati su classi, con singola eredità, interfacce, invio basato sui tipi) è solo una delle possibilità e non necessariamente la migliore.


11
+1 per "non necessariamente il migliore". Citando Alan Kay: "Ho inventato il termine orientato agli oggetti e posso dirti che non avevo in mente C ++." (né aveva C # e / o Java, direi umilmente)
Herby,

1
@herby Ho visto che ha suggerito che i sistemi agente (simili a come funziona Erlang) sono più vicini all'eventuale intenzione di Alan Kay per OOP.
CodexArcanum,

2
Ehm, Common Lisp ha sicuramente delle lezioni. Ma, in genere, una classe CL contiene dati e metodi definiti su "funzioni generiche". Come effetto collaterale, ciò ti offre un modo conveniente per eseguire spedizioni multiple, poiché i metodi non sono più strettamente associati a "una singola classe di implementazione".
Vatine,

Sì, intendevo dire che non ha lezioni in senso Java
Andrea,

5

Che vantaggio hai a rinunciare per ottenere la semplicità che questo nuovo paradigma rappresenta?

Il controllo del tipo per un sistema di tipo strutturale è molto più complesso del semplice controllo se la baseclass si trova nell'elenco di ereditarietà. L'invio virtuale diventa un po 'più complicato e probabilmente meno performante.

Un sistema del genere obsoleta il concetto di OOP?

No. Fintanto che puoi creare il programma in termini di "oggetti che fanno cose" piuttosto che un elenco di istruzioni, un insieme dichiarato di regole o una serie di funzioni a cascata ... l'implementazione non ha importanza. Allo stesso modo, la modifica del sistema di tipi non invalida nessuno dei principi OO comuni.

Puoi ancora lavorare su un tipo di base e non preoccuparti del suo tipo effettivo. Puoi comunque estendere i tipi senza modificarli. Puoi ancora fare in modo che un tipo faccia solo una cosa. È ancora possibile fornire interfacce a grana fine. Puoi ancora fornire astrazioni ai tuoi tipi.

Come una lingua lo consenta, non ha importanza.


In effetti, Go semplifica tutte queste operazioni OOP e aggiunge alcune possibilità extra come l'estensione di un tipo per fornire una nuova interfaccia che si applica alle istanze esistenti (purché non siano necessari nuovi membri dei dati, ovviamente).
Jan Hudec,

4

Penso che la tua idea di OOP sia un po 'spenta:

Ho inventato il termine "programmazione orientata agli oggetti" e questo {Java e C ++} non è quello che avevo in mente.
- Alan Kay .

La scelta del tipo (sottotipo nominativo, sottotipo strutturale o tipizzazione anatra - o una combinazione di questi) è in gran parte ortogonale a OOP. Ereditarietà e classi sono interamente ortogonali a OOP. Se ti prendi del tempo per giocare con io , verrai a vederlo.

Ora puoi chiedere che tipo di sistemi di tipo sono "migliori" e quali mezzi di riutilizzo e combinazione di codice sono. E prova a determinare i vantaggi e gli svantaggi tra le scelte fatte in Simula (e successivamente portate avanti in C ++, Java e C #) e quelle fatte in Go. Ma queste sono tutte domande diverse e distinte.

In definitiva, OOP è un concetto molto vago e tutti i tentativi di implementarlo arrivano in una grande varietà di sapori. Ma per semplificare davvero le cose, direi che l'idea di base di OOP è comporre sistemi di sottosistemi SOLID . Ora questo rende assolutamente confusa la linea con altri paradigmi, ma speculerei sul fatto che questo è il motivo per cui le lingue multi-paradigma sono aumentate di popolarità di recente e perché Google ha preso il suo colpo con Go.


2
La domanda riguarda i concetti, non è necessario il termine. Se riesci a trovare un nome migliore di "OOP" per fare riferimento al concetto di gerarchie di classi e a tutte le rifiniture che ne derivano, allora possiamo usarlo.
tylerl

@tylerl: stai confondendo almeno due domande in una. Uno è, se il sottotipo strutturale è migliore del sottotipo nominativo. L'altro è fondamentalmente, se la composizione è migliore dell'eredità. Queste domande sono reciprocamente ortogonali. Penso che alla fine la lingua "migliore" non faccia questa scelta per te. Vorrei ipotizzare che Go abbia semplicemente una serie diversa di problemi, ma vedremo se Google aggiunge queste funzionalità "indietro" o no.
back2dos,

Vorrei solo un linguaggio che abbia la maggior parte delle funzionalità del C ++ ma fosse più piccolo e più semplice. C ++ è l'unico linguaggio tranne C realistico per i kernel e ti offre strumenti estremamente utili come i distruttori e l'STL. E il principio importante "se non lo usi, non lo paghi". OO, usato correttamente, è estremamente potente. Ma anche i generici e altri concetti non OO sono di vitale importanza. C non ti dà quasi nulla e Go butta via il vero OO per alcune strane idee nuove.
Erik Alapää,

1

OOP non è obsoleto.

Come ha detto Andrea, ci sono stati molti concetti proposti come alternativa alle classi (per esempio: la tabella dei tipi di haskell). OOP ha un grande vantaggio: viene insegnato in molti luoghi e la cultura di OOP è ampiamente condivisa tra gli sviluppatori.

Ciò consente una comunicazione più ricca all'interno di un team. Si può parlare più facilmente di fabbriche che di prepromorfismi zygoistomorfi . OOP struttura il modo in cui organizzerai e comunicherai il tuo programma con diagrammi di uso comune. Questa è una risorsa potente.


1
Penso: accaduto in molti posti. Non è un vantaggio, in realtà.
AndreasScheinert,

@AndreasScheinert perché non dovrebbe essere un vantaggio?
Simon Bergot,

Perché per esprimere un giudizio dovresti sapere almeno 1 alternativa altrettanto valida. È un problema di abitudine, alle persone piace stare nella loro zona di comfort e questo porta alla stagnazione.
AndreasScheinert,

@AndreasScheinert usa lo strumento giusto per il lavoro. Oop non funziona per tutti gli scenari .... non ha nulla a che fare con la loro zona di comfort
pqsk

1

No, non c'è nulla di nuovo qui, né OOP è obsoleto. Il C ++ ha anche interfacce implicite sotto forma di modelli, ma le persone usano ancora funzioni virtuali. Sono necessarie interfacce esplicite per far fronte, ad esempio, interfacce binarie o interfacce in cui l'altro codice semplicemente non è noto al momento della compilazione.

Si potrebbe sostenere che questo è semplicemente un caso di inferenza rispetto a dichiararlo esplicitamente, che non assomiglia a un "nuovo paradigma" e in realtà è solo più conveniente.

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.