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?
Réponses:
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 .
la source
Cela signifie que les deux concepts n'ont pas d'idées contrastées ou ne sont pas incompatibles.
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 .
la source
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.
la source
* 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.
la source