Il paradigma della programmazione orientata agli oggetti è obsoleto poiché è anti-modulare e anti-parallelo? [chiuso]


23

Ho letto l'articolo controverso Insegnare FP alle matricole pubblicato da Robert Harper, professore di CMU. Sosteneva che la CMU non avrebbe più insegnato la programmazione orientata agli oggetti nel seno introduttivo, poiché "non è adatto per un curriculum CS moderno".

E ha affermato che:

La programmazione orientata agli oggetti viene eliminata del tutto dal curriculum introduttivo, poiché è sia antimodulare che antir parallelico per sua stessa natura.

Perché considerare OOP come anti-modulare e anti-parallelo?



14
Buhwaaaah ?! OO rende la modularità e il parallelismo più facili rispetto a quelli procedurali e non si escludono a vicenda con FP. Colorami confuso.
Matt Ellen,

4
Hanno riprogettato il loro curriculum, quindi deve vendere il nuovo programma e sta facendo affermazioni audaci sostenute senza assolutamente dati. Non ci sono prove che programmi funzionali complessi siano più paralleli o modulari delle loro controparti OOP.
davidk01,

4
@Matt Ellen: OOP è decisamente reciprocamente esclusivo con FP. FP si basa su diversi concetti chiave di cui uno è l'assenza di stato mutabile. OOP è basato sull'esistenza di uno stato mutabile il cui accesso è controllato avvolgendolo in "oggetti". Lo stato mutevole e lo stato immutabile si escludono a vicenda praticamente per definizione. Sì, è vero che puoi programmare in uno stile funzionale con molti linguaggi OOP, ma non è la stessa cosa che usare un linguaggio FP. E sì, è vero che non tutte le lingue FP sono pure. Ciò non significa che FP sia compatibile con OOP, tuttavia.
SOLO IL MIO OPINIONE corretta il

2
@JUST: ho un'idea diversa di mutua esclusività per te. Vedo FP puro e impuro come sottoinsiemi di FP, e quindi OOP non si esclude a vicenda da FP se si assume che la mutabilità sia essenziale per OOP. Inoltre, non sono d'accordo sul fatto che la mutabilità sia essenziale per OOP. Potresti ottenere un sistema OO completo usando il passaggio di messaggi e non mutare mai nulla.
Matt Ellen,

Risposte:


30

Si prega di considerare che le esigenze di Harper per l'insegnamento di un corso introduttivo sul curriculum CS sono molto diverse dalle esigenze di un progetto di vita reale . Il suo compito è insegnare concetti fondamentali (ad es. Modularità, parallelismo, induzione) alle matricole. Pertanto è molto importante che la lingua (e il paradigma) scelti possano esprimere questi concetti con il minor numero di cerimonie (sintattiche e concettuali) possibile. Familiarità, supporto degli strumenti, librerie disponibili, prestazioni di esecuzione ecc. Sono completamente irrilevanti in questo contesto. Quindi tienilo a mente quando consideri quanto segue ...

L'opinione che OO sia un risultato anti-modulare dal grande numero di dipendenze verso altre classi, anche gli oggetti di classi ben progettate tendono a finire. Che questo sia un problema - anche agli occhi dei sostenitori di OO - diventa chiaro quando si osserva la proliferazione di quadri di iniezione di dipendenza , articoli, libri e post di blog negli ultimi anni (anche l'ascesa di beffe e mozziconi è interessante).

Un altro suggerimento è l' importanza dei modelli di progettazione e la complessità della loro implementazione - rispetto ad alcuni altri paradigmi di programmazione - ad es. Fabbriche, Costruttore, Adattatore, Ponte, Decoratore, Facciata, Comando, Iteratore, Mediatore, Osservatore, Strategia e metodo del modello e forse i Compositi sono tutti in qualche modo legati al miglioramento della modularità del codice OO.

L'ereditarietà è anche problematica (ad es. Problema di classe di base fragile ) e il polimorfismo (sottotipo) seduce a rovesciare l'implementazione di un algoritmo tra più classi, in cui i cambiamenti possono incresparsi attraverso l'intera catena ereditaria (su e giù!).

L'accusa di essere anti-parallelo è legata all'enfasi dello stato rispetto al calcolo (ovvero mutabilità vs. immutabilità). Il primo rende più coinvolto l' espressione delle dipendenze delle sottocomputer (che è la tesi di Harper sul parallelismo!) Poiché di solito non si può dedurre dalla posizione in cui è gestito lo stato (ovvero il file, dove viene dichiarata la variabile di istanza) quali attori esterni lo cambierà in quel momento.

Un'enfasi sull'immutabilità e sul calcolo rende l'espressione delle dipendenze delle sottocomputer molto più semplice, poiché non esiste una gestione dello stato, ma solo funzioni / calcoli che sono combinati nel luogo in cui si desidera esprimere le dipendenze delle sottocomputer.


10
Le affermazioni del parallelismo dal campo funzionale sono spesso esagerate. I compilatori per linguaggi funzionali funzionano con una teoria di base più pulita, quindi gli implementatori hanno più modi di riorganizzare il codice prima che venga trasformato in codice macchina, ma ciò non significa che se si danno ai programmatori OO le astrazioni appropriate per il parallelismo, non saranno in grado per scrivere codice parallelo pulito. Finora i programmatori procedurali hanno ottenuto solo blocchi e thread e hanno fatto abbastanza bene, penso con quegli strumenti.
davidk01,

2
Sebbene in generale sia d'accordo con tutto ciò che dici qui, vorrei sottolineare che i modelli di progettazione rientrano in tutti i paradigmi di programmazione. Per la programmazione funzionale, vorrei sottolineare cose come monadi e mappa / riduzione.
Anm,

@ davidk01 Take Go per esempio. Supporta la programmazione orientata agli oggetti e ha grandi primitive di concorrenza. Ancora più importante, sta davvero decollando per la programmazione concorrente senza essere puramente funzionale.
weberc2,

19

Questa è probabilmente un'affermazione audace da fare, ma in qualche modo sospetto che questo Robert Harper non abbia mai scritto software reale in vita sua. Tutto ciò che sembra interessarsi è ML e sistemi di tipo statico. Un contributo così grande come potrebbe essere, non vedo come le sue affermazioni su OOP abbiano rilevanza.

Questo articolo non è controverso. La controversia implica esame, discussione e discussione. Quello che hai qui è un accademico ignorante che formula due accuse piuttosto fondamentali in una sola affermazione, senza preoccuparsi di fornire alcun argomento.

  1. L'affermazione sul fatto che OOP sia anti-modulare è assolutamente una sciocchezza. Non so nemmeno come rispondere, non solo non sono stati forniti argomenti, ma anche OOP di progettazione è un approccio per stabilire la modularità con un accoppiamento molto basso tra i singoli moduli attraverso l'incapsulamento e l'astrazione.

  2. Affermare che OOP è anti-parallelo dimostra solo una mancanza di comprensione. OOP non blocca alcuna decisione sulla concorrenza. OOP impone solo di nasconderli: se costruito correttamente, non si può dire se l'implementazione di un oggetto sia parallela o meno.
    Quindi in definitiva OOP e la programmazione parallela sono ortogonali. Il modello dell'attore è un modello elegante per la concorrenza che può essere riflesso direttamente in un sistema a oggetti (ma non è necessario), producendo una formidabile combinazione di entrambi.

Il problema con OOP è che poche persone lo capiscono davvero nel senso in cui Alan Kay lo ha definito.

  1. OOP è un approccio. In alcune lingue è implementato usando modelli, in altri è possibile utilizzare direttamente i linguaggi linguistici incorporati (ad es. Ruby, Objective-C, Smalltalk, Io ).
  2. Contrariamente alla credenza comune, OOP non riguarda le classi. Riguarda gli oggetti e gli oggetti riguardano il passaggio di messaggi o un modo altrettanto incondizionato di incapsulamento e astrazione.

Questo è il motivo per cui Java deve OOP quali bastoni appuntiti sono per il combattimento navale. Questo è vero anche per molti altri cosiddetti "linguaggi OOP", ma la cosa su Java è che sembra essere una credenza comune nelle università, che Java dovrebbe essere usato per insegnare OOP.

Concordo con tutti coloro che ritengono che le introduzioni a OOP con Java debbano essere rimosse dai curricula CS. Penso anche che le persone che chiaramente non hanno una conoscenza fondamentale di OOP non dovrebbero insegnarlo. Quindi è probabilmente meglio se Bob si attiene alla ML per i suoi corsi e semplicemente insegna ciò di cui ha una ferma comprensione.
In questo momento OOP è più un'etichetta alla moda, che alla gente piace attenersi a tutto. Questo danneggia OOP e ha detto la gente. OOP non è obsoleto. Età d'oro di OOP deve ancora venire, quando la gente finalmente capire di cosa si tratta di cosa si tratta , non su (ad esempio risolvere ogni possibile problema utilizzando la parola chiave class500 volte).


1
+1 per il passaggio dei messaggi e +1 per "con Java". Sfortunatamente se avessero rimosso Java, lo avrebbero semplicemente sostituito con C # e avrebbero continuato la sua eredità.
gbjbaanb,

@ back2dos +1 per i critici, -1 per Java. Sicuramente, Smalltalk è "molto più OO" di Java, ma chi lo usa? Objective-C è difficile per i principianti proprio come lo è C.
maaartinus,

@maaartinus: troverai che Squeak sarà ampiamente usato nell'area educativa e accademica, se questo risponde alla tua domanda. Anche per quanto riguarda Java: potrebbe piacerti, forse no. Proprio come il caffè, è una questione di preferenze personali e non ha senso discuterne. Tuttavia, poiché Java non è adatto per un'introduzione a OOP, IMHO è un'innegabile implicazione della natura di Java e del concetto di OOP ed è esattamente quello che ho detto. La popolarità di Java non lo farà sparire. Per quanto riguarda C, ti suggerisco di leggere joelonsoftware.com/articles/ThePerilsofJavaSchools.html .
back2dos,

@ back2dos Squeak può essere usato in queste aree, ma all'università ho imparato ML. Entrambi sono ugualmente inutilizzabili nel settore ed entrambi vale la pena imparare, a causa dei loro concetti. L'articolo a punta è l'articolo peggiore di Joel che abbia mai letto, è troppo lungo e a prima vista il messaggio sembra essere l'importanza di affrontare i segfault. : D Suggerirei ancora Java per insegnare OOP.
maaartinus,

@maaartinus: Ciò che hai imparato all'università è poco rilevante nella domanda su cosa dovrebbe essere insegnato . Non hai ancora dato motivi per cui uno dovrebbe usare Java per insegnare OOP, mentre io ho dato quello che considero un motivo abbastanza solido per non farlo. Inoltre, ovviamente, non sei riuscito a capire l'essenza dell'articolo: le persone che non sono in grado di affrontare problemi altrettanto difficili come C non dovrebbero studiare CS in primo luogo. Penso che CS non dovrebbe essere stupito di ciò che ogni bambino a cui piacciono i computer può capire. Se non possiamo essere d'accordo su questo, allora ulteriori discussioni sono una perdita del tuo tempo e del mio.
back2dos,

12

Ottieni zeloti di ogni striscia.

La programmazione orientata agli oggetti non è un proiettile d'argento. Non lo è mai stato. Di cosa si tratta, è una vittima di hype. Inevitabilmente, le persone si ammalano dell'hype e inizia a svilupparsi un contraccolpo (indipendentemente dall'utilità effettiva del paradigma).

Tra vent'anni, senza dubbio, avremo altri contraccolpi contro la programmazione funzionale.


1
C'è già!
quant_dev

1
++ "Ottieni zeloti di ogni striscia." Ero un accademico e la mia esperienza è stata questa . Gli accademici adorano esprimere opinioni provocatorie, impressionando forse i loro studenti.
Mike Dunlavey,

5

Non posso rispondere a questa domanda per intero perché si può solo indovinare i vaghi pensieri del suo autore. Sospetto fortemente che questo articolo stia per causare imbarazzo al suo autore. Non c'è nulla in OOP che suggerisca che non è né modulare né parallelo:

Modularità : un aspetto importante di OOP è che è effettivamente modulare (ma modularità significa cose diverse in contesti diversi). Quindi, indipendentemente dal fatto che l'autore stia parlando di generalizzazione o programmazione statica, non è corretto.

Parallelizzazione : per quanto riguarda la programmazione parallela, la maggior parte dei framework ha supportato le interruzioni, quindi il threading e ora una corretta parallelizzazione, come ciò che vediamo in .Net framework 4.0 e i linguaggi OOP che si fondono su di esso.

Ho il sospetto che l'autore sia diventato una vittima della moda in quanto esiste un'idea sbagliata secondo cui la programmazione funzionale e OOP si escludono a vicenda nell'uso. Esistono stili funzionali nei linguaggi OOP che sono ben documentati, ad esempio Oliver Sturm ha pubblicato in quest'area.


4

L'autore sostiene che OOP è troppo difficile da capire per i programmatori di matricole, il che può essere vero - anche se ne dubito, dati i requisiti di ingresso per la CMU! Le affermazioni anti-modulari e anti-parallele possono essere vere in un contesto ristretto rispetto ai linguaggi puramente funzionali, ma difficilmente sono una condanna dell'intero paradigma (che sembra funzionare bene per coloro che sanno come usarlo).

Il curriculum proposto insegnerebbe la programmazione funzionale in una classe, la programmazione imperativa (procedurale) in un'altra classe e le strutture di dati in un'altra classe. Una volta che una matricola ha imparato queste 3 cose, dovrebbe essere pronto per imparare OOP.

Personalmente penso che sia eccessivo, ma agli accademici piace provare cose nuove ed estreme. Come contrappeso, il MIT era solito (e potrebbe ancora) insegnare tutti i principali paradigmi di programmazione in una classe di matricole.

Stranamente, entrambe le scuole hanno prodotto dei programmatori davvero bravi. Vai a capire.

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.