Vantaggi dell'OOP classico rispetto al linguaggio Go-like

11

Ho riflettuto molto sulla progettazione linguistica e su quali elementi sarebbero necessari per un linguaggio di programmazione "ideale", e studiare Google's Go 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 alcuna struttura di un linguaggio orientato agli oggetti. Non ci sono classi, solo strutture; non esiste un'eredità di classe / struttura - solo l'incorporamento della struttura. Non ci sono gerarchie, né classi genitore, né implementazioni esplicite dell'interfaccia. Invece, le regole di cast di tipo si basano su un sistema allentato simile alla digitazione anatra, tale che se una struct implementa gli elementi necessari di un "Reader" o di una "Request" o di una "Encoding", allora puoi lanciarlo e usarlo come uno.

C'è qualcosa di OOP implementato in C ++ e in Java e C # che è intrinsecamente più capace, più manutenibile, in qualche modo più potente che devi rinunciare quando ti trasferisci in una lingua come Go? Quale beneficio hai da rinunciare per ottenere la semplicità che questo nuovo paradigma rappresenta?

EDIT
Rimosso la domanda "obsoleto" che i lettori sembravano eccessivamente attaccati e infuriati da

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

    
posta tylerl 19.06.2012 - 09:50
fonte

5 risposte

16

Non esiste un nuovo paradigma. L'orientamento degli oggetti è uno schema 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 riuscire a fornire altri. In questi casi è compito dei programmatori di 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 Java-like (basati su classi, con ereditarietà singola, interfacce, dispacciamento basato su tipi) è solo una delle possibilità, e non necessariamente la migliore.

    
risposta data 19.06.2012 - 10:48
fonte
4

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

I invented the term 'Object Oriented Programming' and this {Java and C++} is not what I had in mind.
- Alan Kay.

La scelta della tipizzazione (sottotipizzazione nominativa, sottotipizzazione strutturale o tipizzazione anatra - o una combinazione di questi) è in gran parte ortogonale a OOP. L'ereditarietà e le 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 tipi sono "migliori" e quali sono il riutilizzo del codice e la combinazione. E prova a determinare i vantaggi e gli svantaggi tra le scelte fatte in Simula (e successivamente proseguite in C ++, Java e C #) e quelle fatte in Go. Ma queste sono tutte domande diverse e distinte.

In definitiva, l'OOP è un concetto molto vago e tutti i tentativi di implementarlo arrivano in un'enorme varietà di sapori. Ma per semplificare davvero le cose, direi che l'idea principale di OOP è di comporre sistemi di SOLID sottosistemi. Ora questo sfuma assolutamente la linea rispetto ad altri paradigmi, ma supponevo che questo fosse il motivo per cui i linguaggi multi-paradigma sono aumentati di popolarità in tempi recenti e perché Google ha preso il proprio tiro con Go.

    
risposta data 19.06.2012 - 15:43
fonte
4

What benefit do you have to give up to gain the simplicity that this new paradigm represents?

Il controllo del tipo per un sistema di tipo strutturale è molto più complesso del semplice controllo della presenza della classe di base nell'elenco di eredità. Il dispatch virtuale diventa un po 'più complicato e probabilmente meno performante.

Does such a system obsolete the concept of OOP?

No. Finché è possibile rendere il programma in termini di "oggetti che fanno le cose" piuttosto che un elenco di istruzioni, o 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. È ancora possibile estendere i tipi senza modificarli. Puoi ancora fare un tipo di fare solo una cosa. È ancora possibile fornire interfacce a grana fine. Puoi ancora fornire astrazioni ai tuoi tipi.

In che modo un linguaggio consente che ciò non sia veramente importante.

    
risposta data 19.06.2012 - 14:44
fonte
1

OOP non è obsoleto.

Come ha detto Andrea ci sono stati molti concetti proposti come alternativa alle classi (per esempio: typeclass haskell). L'OOP ha un grande vantaggio: viene insegnato in molti posti e la cultura dell'OOP è ampiamente condivisa tra gli sviluppatori.

Ciò consente una comunicazione più ricca all'interno di una squadra. Si può parlare di fabbriche più facilmente di circa Preomorfismi zygohistomorphic . OOP struttura il modo in cui organizzerai e comunicherai sul tuo programma con diagrammi comunemente usati. Questa è una risorsa potente.

    
risposta data 19.06.2012 - 12:17
fonte
1

No, non c'è nulla di nuovo qui, né OOP è obsoleto. Anche il C ++ ha interfacce implicite sotto forma di template, ma le persone usano ancora le funzioni virtuali. Hai bisogno di interfacce esplicite per far fronte, ad es., A interfacce binarie o interfacce in cui l'altro codice semplicemente non è noto in fase di compilazione.

Potresti sostenere che questo è semplicemente un caso di inferenza contro affermazione esplicita, che non è affatto come un "nuovo paradigma" e in realtà solo più conveniente.

    
risposta data 19.06.2012 - 13:30
fonte