FP e OO ortogonali?

13

Ho sentito dire più e più volte e sto cercando di capire e convalidare l'idea che FP e OO siano ortogonali.

Prima di tutto, cosa significa per 2 concetti essere ortogonali?

FP incoraggia l'immutabilità e la purezza il più possibile. e OO sembra qualcosa che è stato costruito per lo stato e le mutazioni (una versione leggermente organizzata della programmazione imperativa?). E mi rendo conto che gli oggetti possono essere immutabili. Ma OO sembra implicare uno stato / cambiamento per me.

Sembrano opposti. Ciò significa che sono ortogonali?

Un linguaggio come Scala rende facile fare OO e FP entrambi, questo influisce sull'ortogonalità dei 2 metodi?

    
posta letronje 16.10.2010 - 18:01
fonte

4 risposte

22

Il termine "ortogonale" deriva dalla matematica, dove ha un sinonimo: "perpendicolare". In questo contesto, potresti capire come "le due cose non hanno nulla a che fare l'una con l'altra".

Quando le persone confrontano FP e OO spesso confondono due assi separati.

Da un lato si ha la programmazione funzionale rispetto alla programmazione imperativa. Jonas fornisce un buon confronto dei due. La versione a frase unica dice che "flusso di dati contro flusso di controllo".

L'altro asse è l'astrazione dei dati. Lingue come Haskell usano tipi di dati astratti per, bene, dati astratti. Smalltalk utilizza oggetti, che fondono i dati e le operazioni su quei dati in una singola unità. William Cook spiega meglio di quanto ho potuto nel suo articolo Informazioni sull'astrazione dei dati, rivisitato .

È perfettamente comprensibile che la maggior parte delle persone finisca per pensare che FP e OO siano opposti: la maggior parte dei linguaggi OO è imperativa, quindi se si confronta, ad esempio Haskell e Java, si ha flusso di dati + ADT rispetto al flusso di controllo + oggetto. Ma ci sono altre possibilità! Matthias Felleisen spiega come sposare felicemente FP e OO nel suo discorso Oggetti funzionali .

    
risposta data 16.10.2010 - 21:37
fonte
9

First of all, what does it mean for 2 concepts to be orthogonal ?

Significa che i due concetti non hanno idee contrastanti o non sono incompatibili tra loro.

FP encourages immutability and purity as much as possible. and OO seems like something that is built for state and mutation(a slightly organized version of imperative programming?). And I do realize that objects can be immutable. But OO seems to imply state/change to me.

They seem like opposites. How does it affect their orthogonality ?

A language like Scala makes it easy to do OO and FP both, does this affect the orthogonality of the 2 methods ?

OO riguarda incapsulamento, composizione degli oggetti, astrazione dei dati, polimorfismo tramite sottotipizzazione e mutazione controllata quando necessario (l'immutabilità è incoraggiata anche in OO). FP riguarda la composizione funzionale, l'astrazione di controllo e il polimorfismo vincolato (noto anche come polimorfismo parametrico). Quindi le due idee non sono contraddittorie. Entrambi ti forniscono diversi tipi di poteri e meccanismi di astrazione, che è certamente possibile avere in una lingua. In realtà, questa è la tesi su cui è stato costruito Scala !

Nel suo esperimento di Scala parla a Google, Martin Odersky spiega molto bene come crede i due concetti - OO e FP - sono ortogonali tra loro e in che modo Scala unifica i due paradigmi elegantemente e senza soluzione di continuità in un nuovo paradigma conosciuto popolarmente nella comunità di Scala come paradigma funzionale-oggettuale. Deve guardare parlare per te. : -)

Altri esempi di linguaggi funzionali agli oggetti: OCaml , F # , Nemerle .

    
risposta data 16.10.2010 - 18:36
fonte
7

Orthogonal indica più o meno "indipendente".

Quindi se FP e OO sono ortogonali, ciò significa che puoi usare l'immutabilità indipendentemente dal fatto che tu usi o meno gli oggetti, e puoi usare gli oggetti sia che siano immutabili o meno.

    
risposta data 16.10.2010 - 18:05
fonte
0

* Ho sentito parlare di tanto in tanto e sto cercando di capire e convalidare l'idea che FP e OO siano ortogonali. *

Prima di tutto, cosa significa per 2 concetti essere ortogonali?

Citazione di Wikipedia: "L'ortogonalità garantisce che la modifica dell'effetto tecnico prodotto da un componente di un sistema non crea né propaga effetti collaterali ad altri componenti del sistema."

Semplicemente, significa semplicemente che la modifica a un sistema non lo è e non può influire su una modifica nell'altro sistema.

Ad esempio, un'auto ha componenti e controlli ortogonali (ad esempio, l'accelerazione del veicolo non influenza nient'altro che i componenti coinvolti esclusivamente con la funzione di accelerazione.) Ad esempio, non influisce sulla radio (anche se non sono sicuro che abbia effetto Riproduzione di CD, poiché la mia salta a volte)).

FP incoraggia l'immutabilità e la purezza il più possibile. e OO sembra qualcosa che è stato costruito per lo stato e le mutazioni (una versione leggermente organizzata della programmazione imperativa?). E mi rendo conto che gli oggetti possono essere immutabili. Ma OO sembra implicare lo stato / cambiare per me.

Sembrano opposti. Significa che sono ortogonali?

Kinda. Il problema è che nessuno di questi concetti è veramente definito. Ma sì, ne hai il succo.

    
risposta data 16.10.2010 - 18:09
fonte