FP et OO orthogonales?


13

J'ai entendu à maintes reprises et j'essaye de comprendre et de valider l'idée que FP et OO sont orthogonaux.

Tout d'abord, qu'est-ce que cela signifie pour 2 concepts d'être orthogonaux?

FP encourage autant que possible l'immuabilité et la pureté. et OO semble être quelque chose qui est construit pour l'état et la mutation (une version légèrement organisée de la programmation impérative?). Et je me rends compte que les objets peuvent être immuables. Mais OO semble impliquer l'état / le changement pour moi.

Ils semblent opposés. Est-ce à dire qu'ils sont orthogonaux?

Un langage comme Scala facilite les deux OO et FP, cela affecte-t-il l'orthogonalité des 2 méthodes?


5
L'orientation objet ne nécessite pas que les objets manipulent son état. Les méthodes peuvent renvoyer de nouveaux objets en tant que résultats. Le fait que l'on puisse, et le fait souvent, modifier l'état d'un objet ne signifie pas qu'il doit le faire ou que c'est une bonne idée. OO et FP ne sont pas opposés.
Huperniketes

4
Dupliquer sur stackoverflow: FP et OO orthogonal?
sepp2k

Réponses:


22

Le terme "orthogonal" vient des mathématiques, où il a un synonyme: "perpendiculaire". Dans ce contexte, vous pourriez le comprendre comme «les deux choses n'ont rien à voir l'une avec l'autre».

Lorsque les gens comparent FP et OO, ils confondent souvent deux axes distincts.

D'une part, vous avez une programmation fonctionnelle par rapport à une programmation impérative. Jonas donne une bonne comparaison des deux. La version d'une phrase dit que "flux de données contre flux de contrôle".

L'autre axe est l'abstraction des données. Des langages comme Haskell utilisent des types de données abstraits pour, enfin, des données abstraites. Smalltalk utilise des objets, qui fusionnent les données et les opérations sur ces données en une seule unité. William Cook explique mieux que moi dans son article sur la compréhension de l'abstraction des données, revisité .

Il est parfaitement compréhensible que la plupart des gens finissent par penser que FP et OO sont opposés: la plupart des langages OO sont impératifs, donc si vous comparez, disons, Haskell et Java, vous avez un flux de données + ADT contre un flux de contrôle + objet. Mais il y a d'autres possibilités! Matthias Felleisen explique comment marier joyeusement FP et OO dans son discours Functional Objects .


+1, excellente réponse. Votre réponse manque cependant sur les classes de Haskell.
missingfaktor

Pour sûr. Je viens juste de commencer à apprendre Haskell.
Frank Shearar

Je me demande s'il y a un enregistrement de cette présentation des objets fonctionnels ... Je suis vraiment intéressé, mais les diapositives seules ne rendent pas vraiment justice.
Rei Miyasaka

9

Tout d'abord, qu'est-ce que cela signifie pour 2 concepts d'être orthogonaux?

Cela signifie que les deux concepts n'ont pas d'idées contrastées ou ne sont pas incompatibles.

FP encourage autant que possible l'immuabilité et la pureté. et OO semble être quelque chose qui est construit pour l'état et la mutation (une version légèrement organisée de la programmation impérative?). Et je me rends compte que les objets peuvent être immuables. Mais OO semble impliquer l'état / le changement pour moi.

Ils semblent opposés. Comment cela affecte-t-il leur orthogonalité?

Un langage comme Scala facilite les deux OO et FP, cela affecte-t-il l'orthogonalité des 2 méthodes?

OO concerne l'encapsulation, la composition des objets, l'abstraction des données, le polymorphisme via le sous-typage et la mutation contrôlée si nécessaire (l'immuabilité est également encouragée dans l'OO). FP concerne la composition des fonctions, le contrôle de l'abstraction et le polymorphisme contraint (alias polymorphisme paramétrique). Ainsi, les deux idées ne sont pas contradictoires. Ils vous fournissent tous deux différents types de pouvoirs et de mécanismes d'abstraction, qui sont certainement possibles dans une seule langue. En fait, c'est la thèse sur laquelle Scala a été construit!

Dans son discours sur l' expérience Scala à Google, Martin Odersky explique très bien comment il pense que les deux concepts - OO et FP - sont orthogonaux l'un à l'autre et comment Scala unifie les deux paradigmes de manière élégante et transparente en un nouveau paradigme populairement connu dans la communauté Scala comme paradigme objet-fonctionnel. Doit regarder parler pour vous. :-)


Autres exemples de langages objet-fonctionnels: OCaml , F # , Nemerle .


1
"Cela signifie que les deux concepts n'ont pas d'idées contrastées ou ne sont pas incompatibles." - C'est vrai, mais je pense que je dirais quelque chose comme " distinct mais pas incompatible". Par exemple, si l'un était un sous-ensemble de l'autre, ils ne seraient pas incompatibles, mais ils ne seraient pas non plus orthogonaux.
Tim Goodman

@Tim: C'était ma tentative [peut-être ratée] de définir le terme. Je ne suis pas un gourou anglais, vous voyez. : - |
missingfaktor

7

Orthogonal signifie à peu près «indépendant».

Donc, si FP et OO sont orthogonaux, cela signifie que vous pouvez utiliser l'immuabilité, que vous utilisiez des objets ou non, et vous pouvez utiliser des objets qu'ils soient immuables ou non.


2
"Indépendant" est un bon moyen de le dire. Ce n'est pas qu'ils sont opposés, mais que votre code soit un style de programmation fonctionnel ou un style de programmation orienté objet sont deux choses distinctes. Considérez-les comme les axes x et y sur un graphique - vous pouvez monter et descendre l'un tout en restant fixe sur l'autre. (Au sens mathématique, un vecteur dans la direction x et un vecteur dans la direction y sont littéralement orthogonaux - la définition CS est liée.)
Tim Goodman

@TimGoodman: J'ai vraiment aimé l'axe x, y sur l'analogie graphique que vous avez faite. Est-ce que cela peut être mappé au résultat final obtenu quand un mouvement dans une direction contre une autre (je veux dire finalement que le but du paradigme de programmation est d'avoir un code plus facile et maintenable, n'est-ce pas?)
rahulaga_dev

0

* J'ai entendu à maintes reprises et j'essaie de comprendre et de valider l'idée que FP et OO sont orthogonaux. *

Tout d'abord, qu'est-ce que cela signifie pour 2 concepts d'être orthogonaux?

Citation de Wikipedia: "L'orthogonalité garantit que la modification de l'effet technique produit par un composant d'un système ne crée ni ne propage d'effets secondaires à d'autres composants du système."

Simplement, cela signifie simplement que le changement d'un système n'affecte pas et ne peut pas affecter un changement dans l'autre système.

Par exemple, une voiture a des composants et des commandes orthogonaux (par exemple, l'accélération du véhicule n'influence rien d'autre que les composants impliqués exclusivement avec la fonction d'accélération. Cela n'affecte pas la radio par exemple (bien que je ne sois pas sûr si cela affecte la lecture du CD, puisque le mien saute parfois)).

FP encourage autant que possible l'immuabilité et la pureté. et OO semble être quelque chose qui est construit pour l'état et la mutation (une version légèrement organisée de la programmation impérative?). Et je me rends compte que les objets peuvent être immuables. Mais OO semble impliquer l'état / le changement pour moi.

Ils semblent opposés. Est-ce à dire qu'ils sont orthogonaux?

Un peu. Le problème est qu'aucun de ces concepts n'est vraiment défini dur comme du roc. Mais oui, vous avez compris l'essentiel.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.