FP e OO ortogonali?


13

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

Prima di tutto, cosa significa che 2 concetti sono ortogonali?

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

Sembrano opposti. Ciò significa che sono ortogonali?

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


5
L'orientamento agli oggetti non richiede che gli oggetti ne manipolino lo stato. I metodi possono restituire nuovi oggetti come risultati. Il fatto che uno possa e spesso modifichi lo stato di un oggetto non significa che debbano farlo o che sia una buona idea. OO e FP non sono opposti.
Huperniketes

4
Duplicato su StackOverflow: FP e OO ortogonale?
sepp2k,

Risposte:


22

Il termine "ortogonale" deriva dalla matematica, dove ha un sinonimo: "perpendicolare". In questo contesto, potresti capirlo 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 hai una programmazione funzionale contro una programmazione imperativa. Jonas offre un buon confronto tra i due. La versione a una frase 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, beh, dati astratti. Smalltalk utilizza oggetti che fondono i dati e le operazioni su tali dati in un'unica unità. William Cook spiega meglio di quanto potessi nel suo articolo On Understanding Data Abstraction, Revisited .

È perfettamente comprensibile che la maggior parte delle persone finisca per pensare che FP e OO siano opposti: la maggior parte dei linguaggi OO sono imperativi, quindi se si confrontano, diciamo, Haskell e Java, si ha flusso di dati + ADT contro flusso di controllo + oggetto. Ma ci sono altre possibilità! Matthias Felleisen spiega come sposare felicemente FP e OO nel suo discorso Functional Objects .


+1, ottima risposta. Tuttavia, la tua risposta manca sulle macchine da scrivere Haskell.
missingfaktor,

Di sicuro. Ho appena iniziato a studiare Haskell.
Frank Shearar,

Mi chiedo se ci sia una registrazione di quella presentazione di Functional Objects ... Sono davvero interessato, ma le diapositive da sole non rendono giustizia.
Rei Miyasaka,

9

Prima di tutto, cosa significa che 2 concetti sono ortogonali?

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

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

Sembrano opposti. In che modo influenza la loro ortogonalità?

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

OO riguarda incapsulamento, composizione dell'oggetto, astrazione dei dati, polimorfismo tramite sottotipizzazione e mutazione controllata quando necessario (l'immutabilità è incoraggiata anche in OO). FP riguarda la composizione delle funzioni, l'astrazione del controllo e il polimorfismo vincolato (noto anche come polimorfismo parametrico). Quindi le due idee non sono contraddittorie. Entrambi forniscono diversi tipi di poteri e meccanismi di astrazione, che sono certamente possibili in una lingua. In effetti, questa è la tesi su cui è stata costruita Scala !

Nel suo discorso alla Scala Experiment su Google, Martin Odersky spiega molto bene come crede che i due concetti - OO e FP - siano ortogonali tra loro e in che modo Scala unisca i due paradigmi in modo elegante e senza soluzione di continuità in un nuovo paradigma popolarmente conosciuto nella comunità Scala come paradigma oggetto-funzionale. Devo guardare i discorsi per te. :-)


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


1
"Significa che i due concetti non hanno idee contrastanti o non sono incompatibili tra loro." - È vero, ma penso che direi qualcosa di simile " distinto ma non incompatibile". Ad esempio, se uno fosse un sottoinsieme dell'altro, non sarebbero incompatibili, ma non sarebbero neppure ortogonali.
Tim Goodman,

@Tim: Quello era il mio tentativo [forse fallito] di definire il termine. Non sono un guru inglese, vedi. : - |
missingfaktor,

7

Ortogonale significa approssimativamente "indipendente".

Quindi, se FP e OO sono ortogonali, ciò significa che è possibile utilizzare l'immutabilità sia che si utilizzino gli oggetti o meno, sia che si possano usare gli oggetti indipendentemente dal fatto che siano immutabili o meno.


2
"Indipendente" è un buon modo per dirlo. Non è che siano opposti, ma se il tuo codice è uno stile di programmazione funzionale o uno stile di programmazione orientato agli oggetti sono due cose separate. Pensa a loro come gli assi xey su un grafico: puoi spostarti su e giù uno rimanendo fisso sull'altro. (In senso matematico, un vettore nella direzione xe un vettore nella direzione y sono letteralmente ortogonali - la definizione CS è correlata.)
Tim Goodman

@TimGoodman: mi è piaciuto molto l'asse x, y sull'analogia del grafico che hai creato. Questo può essere mappato sul risultato finale ottenuto quando uno si muove in una direzione rispetto a un'altra (intendo che entrambi gli obiettivi del paradigma di programmazione sono avere un codice più semplice e
gestibile

0

* Ho sentito questa volta e sto cercando di capire e convalidare l'idea che FP e OO siano ortogonali. *

Prima di tutto, cosa significa che 2 concetti sono ortogonali?

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

Semplicemente, significa solo che la modifica a un sistema non funziona 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 influisca sulla riproduzione di CD, poiché il mio salta qualche volta)).

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

Sembrano opposti. Ciò significa che sono ortogonali?

Tipo. Il problema è che nessuno di questi concetti è definito in modo molto duro. Ma sì, ne hai capito il senso.

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.