Question Programmation fonctionnelle vs Programmation Orientée Objet [closed]


J'ai été principalement exposé à la programmation OO jusqu'à présent et je suis impatient d'apprendre un langage fonctionnel. Mes questions sont:

  • Quand choisissez-vous la programmation fonctionnelle par rapport aux objets?
  • Quelles sont les définitions de problèmes typiques où la programmation fonctionnelle est un meilleur choix?

686
2018-01-16 21:41


origine


Réponses:


Quand choisissez-vous la programmation fonctionnelle par rapport à l'objet?

Lorsque vous anticipez un type différent d'évolution du logiciel:

  • Les langages orientés objet sont bons quand vous avez un ensemble fixe de opérations sur des choseset que votre code évolue, vous ajoutez principalement de nouvelles choses. Cela peut être accompli en ajoutant de nouvelles classes qui implémentent des méthodes existantes et les classes existantes sont laissées seules.

  • Les langages fonctionnels sont bons quand vous avez un ensemble fixe de des choses, et que votre code évolue, vous ajoutez principalement de nouvelles opérations sur des choses existantes. Cela peut être accompli en ajoutant de nouvelles fonctions qui calculent avec des types de données existants, et les fonctions existantes sont laissées seules.

Quand l'évolution va mal, vous avez des problèmes:

  • Ajouter une nouvelle opération à un programme orienté objet peut nécessiter l'édition de nombreuses définitions de classe pour ajouter une nouvelle méthode.

  • Ajouter un nouveau type de chose à un programme fonctionnel peut nécessiter l'édition de nombreuses définitions de fonctions pour ajouter un nouveau cas.

Ce problème est connu depuis de nombreuses années; en 1998, Phil Wadler l'a surnommé le "problème d'expression". Bien que certains chercheurs pensent que le problème d'expression peut être résolu avec des fonctionnalités telles que les mixines, une solution largement acceptée n'a pas encore trouvé sa place.

Quelles sont les définitions de problèmes typiques où la programmation fonctionnelle est un meilleur choix?

Les langages fonctionnels excellent dans la manipulation de données symboliques sous forme d'arbre. Un exemple préféré est celui des compilateurs, où les langues source et intermédiaire changent rarement (la plupart du temps les mêmes des choses), mais les rédacteurs de compilateurs ajoutent toujours de nouvelles traductions et des améliorations de code ou des optimisations (nouvelles opérations sur des choses). La compilation et la traduction sont plus généralement des «applications tueuses» pour les langages fonctionnels.


1072



Vous n'avez pas nécessairement à choisir entre les deux paradigmes. Vous pouvez écrire un logiciel avec une architecture OO en utilisant de nombreux concepts fonctionnels. FP et OOP sont de nature orthogonale.

Prenez par exemple C #. On pourrait dire que c'est principalement de la POO, mais il y a beaucoup de concepts et de concepts de PF. Si vous considérez Linq, les constructions les plus importantes qui permettent à Linq d'exister sont de nature fonctionnelle: expressions lambda.

Un autre exemple, F #. On pourrait dire que c'est principalement la PF, mais il existe de nombreux concepts et constructions de POO disponibles. Vous pouvez définir des classes, des classes abstraites, des interfaces, gérer l'héritage. Vous pouvez même utiliser la mutabilité lorsque cela rend votre code plus clair ou quand il augmente considérablement les performances.

Beaucoup de langues modernes sont multi-paradigmes.

Lectures recommandées

Comme je suis dans le même bateau (OOP background, learning FP), je vous suggère quelques lectures que j'ai vraiment appréciées:


152



La programmation orientée objet offre:

  1. Encapsulation, à
    • contrôler la mutation de l'état interne
    • Limiter le couplage à la représentation interne
  2. Sous-typage, permettant:
    • substitution de types compatibles (polymorphisme)
    • un moyen brut de partage de l'implémentation entre les classes (héritage d'implémentation)

La programmation fonctionnelle, dans Haskell ou même dans Scala, peut permettre une substitution par un mécanisme plus général des classes de types. L'état interne mutable est découragé ou interdit. L'encapsulation de la représentation interne peut également être réalisée. Voir Haskell vs OOP pour une bonne comparaison.

L'affirmation de Norman selon laquelle "ajouter un nouveau type de chose à un programme fonctionnel peut nécessiter la modification de nombreuses définitions de fonctions pour ajouter un nouveau cas". dépend de la façon dont le code fonctionnel a employé des classes de types. Si la correspondance de modèle sur un type de données abstrait particulier est répartie dans une base de code, vous souffrez en effet de ce problème, mais c'est peut-être une mauvaise conception pour commencer.

ÉDITÉ Suppression de la référence aux conversions implicites lors de la discussion des classes de types. Dans Scala, les classes de types sont codées avec des paramètres implicites, pas des conversions, bien que les conversions implicites soient un autre moyen d'obtenir la substitution de types compatibles.


28



  1. Si vous êtes dans un environnement fortement concurrentiel, alors la programmation fonctionnelle pure est utile. Le manque d'état mutable rend la concurrence presque triviale. Voir Erlang.

  2. Dans un langage multiparadigm, vous pouvez vouloir modéliser certaines choses de manière fonctionnelle si l'existence d'un état mutable est un détail d'implémentation, et donc FP est un bon modèle pour le domaine du problème. Par exemple, voir la liste des compréhensions en Python ou std.range dans le langage de programmation D. Ceux-ci sont inspirés par la programmation fonctionnelle.


22



La programmation orientée objet (POO) est un paradigme de programmation basé sur le concept des «objets», qui sont des structures de données qui contiennent des données, sous la forme de champs, souvent appelés attributs; et le code, sous la forme de procédures, souvent appelés méthodes.

La programmation fonctionnelle est un paradigme de programmation, un style de construction de la structure et des éléments des programmes informatiques, qui traite le calcul comme l'évaluation des fonctions mathématiques et évite les données changeantes et mutables.

La POO dit que rassembler les données et leur comportement dans un seul endroit facilite la compréhension du fonctionnement d'un programme. FP dit que les données et le comportement sont des choses distinctes et doivent être séparés pour plus de clarté.

Même en combinant la programmation Javascript et la programmation orientée objet, les développeurs peuvent écrire des codes propres, concis et reproductibles. Les développeurs peuvent créer de petits blocs de codes qui peuvent ensuite être appelés à nouveau sans qu'ils aient à réécrire le code ou copier-coller le code encore et encore. OOP JavaScript offre également un héritage basé sur des prototypes, basé sur des classes, qui permet aux objets d'hériter directement d'autres objets.


16