74 votes

Sont FP et OO orthogonale?

J'ai entendu cela de nombreuses fois, et j'essaie de comprendre et de valider l'idée que la FP et OO sont orthogonaux.

Tout d'abord, que signifie pour 2 concepts orthogonaux?

FP encourage l'immuabilité et de la pureté, autant que possible, tout en OO semble construit pour l'état et la mutation légèrement organisé version de la programmation impérative? Je me rends compte que les objets peuvent être immuable, mais OO semble impliquer état/changement pour moi.

Ils semblent comme des contraires. Comment cela affecte leur orthogonalité?

Une langue comme la Scala le rend facile à faire OO et FP à la fois, cela affecte l'orthogonalité des deux méthodes?

70voto

Mark Byers Points 318575

Orthogonalité implique que les deux choses ne sont pas liés. Il s'agit de mathématiques où il signifie perpendiculaire. Dans l'usage commun, il peut vouloir dire deux décisions sont sans rapport avec ou qu'un sujet n'est pas pertinent lorsque l'on considère un autre sujet. Tel qu'utilisé ici, orthogonale signifie qu'un concept n'a pas d'entraîner ou de les en exclure d'autres.

Les deux concepts de la programmation orientée objet et la programmation fonctionnelle, ne sont pas incompatibles les uns avec les autres. Objet orienté n'implique pas la mutabilité. Beaucoup de gens qui sont introduites dans des programmes orientés objets, la manière traditionnelle souvent de la première utilisation de C++, Java, C# ou similaire langues où la mutabilité est commun, et même encouragé, (bibliothèques standard de fournir de ça, c'mutable classes pour les gens à utiliser). Par conséquent, il est compréhensible que beaucoup de gens associent la programmation orientée objet avec la programmation impérative et la mutabilité, c'est de cette façon qu'ils ont appris.

Cependant la programmation orientée objet couvre des sujets comme:

  • L'Encapsulation
  • Le polymorphisme
  • L'Abstraction

Rien de tout cela implique la mutabilité, et rien n'exclut de la programmation fonctionnelle. Alors oui, elles sont orthogonales dans que ce sont des concepts différents. Ils ne sont pas opposés - vous pouvez utiliser l'un ou l'autre, ou les deux (ou même aucune). Les langues, comme le Scala et F# tentent de combiner les deux paradigmes dans une seule langue:

Scala est un multi-paradigme du langage de programmation conçu pour intégrer les fonctionnalités de la programmation orientée objet et la programmation fonctionnelle.

Source

F# est un succincte, expressif et efficace fonctionnel et langage orienté objet .NET qui vous permet d'écrire du code simple pour résoudre des problèmes complexes.

Source

15voto

missingfaktor Points 44003

Tout d'abord, que signifie pour 2 concepts orthogonaux ?

Cela signifie que les deux concepts n'ont pas de contraste idées ou ne sont pas incompatibles les uns avec les autres.

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

Ils semblent comme des contraires. Comment affectent-ils leur orthogonalité ?

Une langue comme la Scala le rend facile à faire OO et FP à la fois, cela affecte l'orthogonalité des 2 méthodes ?

OO est à propos de l'encapsulation, l'objet de la composition, de l'abstraction de données, le polymorphisme par sous-typage, et contrôlé la mutation quand nécessaire (immutabilité est encouragé dans OO). FP est au sujet de la fonction de la composition, de contrôle de l'abstraction, et contraint de polymorphisme (aka polymorphisme paramétrique). Ainsi, les deux idées ne sont pas contradictoires. Ils vous proposent différentes sortes de pouvoirs et des mécanismes d'abstraction, qui sont certainement possible d'avoir dans une seule langue. En fait, c'est la thèse sur laquelle Scala a été construit!

Dans son Scala Expérience de parler à Google, Martin Odersky, l'explique très bien comment il croit que les deux concepts - OO et FP - sont orthogonaux les uns aux autres et comment Scala unifie les deux paradigmes élégamment et de façon transparente dans un nouveau paradigme populairement connu en Scala de la communauté en tant qu'objet-paradigme fonctionnel. Faut regarder de parler pour vous. :-)


D'autres exemples de l'objet, de langages fonctionnels: OCaml, F#, Nemerle.

12voto

sepp2k Points 157757

Tout d'abord, que signifie pour 2 concepts orthogonaux?

Cela signifie qu'ils ne touchent pas les uns les autres. I. e. un langage fonctionnel n'est pas moins fonctionnel car il est aussi orientée objet.

Ils semblent comme des contraires. Comment affectent-ils leur orthogonalité?

Si elles étaient contraires (c'est à dire d'un point de vue purement fonctionnel de la langue, ne pouvait pas être orientée objet), ils seraient, par définition, pas être orthogonaux. Cependant, je ne crois pas que ce soit le cas.

et OO semble comme quelque chose qui est construit pour l'état et de mutation(un peu organisé version de la programmation impérative?). Et je me rends compte que les objets peuvent être immuable. Mais OO semble impliquer état/changement pour moi.

Ce qui est vrai pour la plupart des langages à objets, il n'y a pas de raison qu'un langage OO doit avoir mutable état.

Si un langage a objets, méthodes, héritage virtuel et ad-hoc, le polymorphisme, c'est un langage orienté objet - qu'il a également mutable état ou pas.

7voto

Tobias Points 3120

Pour les deux concepts orthogonaux signifie qu'ils peuvent être réalisé de manière indépendante à un degré quelconque dans toute manifestation donnée. Considérant la musique, par exemple, vous pouvez classer un morceau de musique comment harmonique et la rythmique c'est. Les deux concepts de "harmonique" et "rythmique" sont orthogonaux dans le sens qu'il y a des harmoniques et rythmiques des morceaux, disharmonic et arrythmic morceaux, mais aussi disharmonic et rythmique des morceaux ainsi que les harmoniques et arythmique morceaux.

Appliquée à la question de départ, ce qui signifie qu'il y a de purement fonctionnels, non-programmation orientée objet lanuages comme Haskell, purement orienté objet, "non fonctionnel" des langues comme Eiffel, mais aussi des langues qui ne sont ni tels que C et les langues qui sont à la fois tels que Scala.

Il suffit de parler, Scala étant orientée objet signifie que vous pouvez définir des structures de données ("classes" et "traits") qui encapsulent des données avec les méthodes permettant de manipuler ces données, en garantissant que les instances de ces structures ("objets") sont toujours dans un état (l'objet du contrat prévu dans sa classe).

D'autre part, la Scala étant un langage fonctionnel signifie qu'il favorise l'immuable sur mutable état et que les fonctions sont des objets de première classe, qui peut être utilisé comme tout autre objet comme des variables locales, des champs ou des paramètres à d'autres fonctions. En plus de cela, presque tous les instruction dans Scala a une valeur, qui vous encourage à utiliser un style de programmation fonctionnelle.

L'orthogonalité de la programmation orientée objet et la programmation fonctionnelle en Scala de plus signifie que vous en tant que programmeur est libre de choisir n'importe quelle combinaison de ces deux concepts que vous voyez l'ajustement pour votre but. Vous pouvez écrire vos programmes dans un but purement impératif de style, en utilisant mutable objets et non à l'aide de fonctions comme des objets, d'autre part, vous pouvez aussi écrire purement fonctionnelle des programmes en Scala de ne pas utiliser l'un de ses fonctionnalités orientées objet.

Scala vraiment ne vous oblige pas à utiliser un modèle ou l'autre. Il vous permet de choisir le meilleur des deux mondes pour résoudre votre problème.

7voto

Stephen Swensen Points 13439

Comme toutes les classifications, la division des langages de programmation fonctionnelle, orientée objet, procédural, etc. est une fiction. Mais nous avons besoin de classifications, et dans les langages de programmation nous classons par un ensemble de fonctionnalités de langage et l'approche philosophique de ceux qui utilisent la langue (où le plus tard est influencée par l'ancien).

Alors parfois, "orienté objet" langues peuvent avoir du succès en adoptant les caractéristiques et les philosophies de la "fonctionnelle" des langages de programmation et vice-versa. Mais certainement pas l'ensemble de la programmation des fonctionnalités du langage et de la philosophie sont compatibles.

Par exemple, un langage fonctionnel comme OCaml réalise l'encapsulation par une portée lexicale et de la fermeture, alors que les langages orientés objet l'utilisation publique/privée des modificateurs d'accès. Elles ne sont pas incompatibles mécanismes proprement dit, mais ils sont redondants, et d'une langue comme F# (surtout un langage fonctionnel qui cherche à vivre en harmonie avec l'résolument orientée objet .NET de la bibliothèque et de la langue de la pile) a pour aller à des longueurs de combler le fossé.

Comme autre exemple, OCaml utilise un type de structure du système de l'orientation de l'objet, alors que la plupart des langages orientés objet l'utilisation d'un type nominal du système. Ce sont à peu près incompatible, et il est intéressant de représenter l'incompatibilité dans le domaine des langages orientés objet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X