Programmation fonctionnelle vs programmation orientée objet [fermé]

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 plutôt que orientée objet?
  • quelles sont les définitions de problèmes typiques où la programmation fonctionnelle est un meilleur choix?
697
demandé sur Olivier Lalonde 2010-01-17 00:35:48

4 réponses

quand choisissez-vous la programmation fonctionnelle plutôt que orientée objet?

quand on anticipe une évolution logicielle différente:

  • les langages orientés objet sont bons lorsque vous avez un ensemble fixe de opérations sur choses , et que votre code évolue, vous ajoutez principalement de nouvelles choses. Ceci peut être accompli en ajoutant de nouvelles classes qui mettre en œuvre les méthodes existantes, et les classes existantes sont laissés seuls.

  • les langues fonctionnelles sont bonnes lorsque vous avez un ensemble fixe de choses , et que votre code évolue, vous ajoutez principalement le nouveau opérations sur les choses existantes. Ceci peut être accompli en ajoutant de nouvelles fonctions qui calculent avec les types de données existants, et les fonctions existantes sont laissées seules.

quand l'évolution va dans le mauvais sens, 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 bien 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 de l'expression peut être résolu avec des caractéristiques linguistiques telles que les mixines, une solution largement acceptée n'a pas encore atteint le grand public.

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

les langues fonctionnelles excellent dans la manipulation symbolique les données dans la forme de l'arbre. Un exemple préféré est celui des compilateurs, où les langues source et intermédiaire changent rarement (la plupart du temps le même choses ), mais les rédacteurs de compilateurs ajoutent toujours de nouvelles traductions et améliorations ou optimisations de code (nouvelles opérations sur les choses). La Compilation et la traduction sont plus généralement des "applis tueuses" pour les langues fonctionnelles.

1083
répondu Norman Ramsey 2010-05-09 08:11:56

vous ne devez pas nécessairement choisir entre les deux paradigmes. Vous pouvez écrire des logiciels avec une architecture OO en utilisant de nombreux concepts fonctionnels. de la FP et de la programmation orientée objet sont orthogonaux dans la nature .

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

un autre exemple, F#. Vous pourriez dire que C'est surtout FP, mais il ya beaucoup de concepts et de constructions OOP disponibles. Vous pouvez définir des classes, des classes abstraites, des interfaces, gérer l'héritage. Vous pouvez même utiliser la mutabilité quand elle rend votre code plus clair ou quand elle augmente considérablement les performances.

beaucoup de langues modernes sont multi-paradigme.

lectures recommandées

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

156
répondu Bruno Reis 2010-05-09 08:10:07

la Programmation Orientée Objet, propose:

  1. Encapsulation, à
    • mutation de contrôle de l'état interne
    • accouplement limite à la représentation interne
  2. Sous-typage
  3. , permettant:
    • substitution de types compatibles (polymorphisme)
    • un moyen rudimentaire de partager la mise en œuvre entre les classes (succession de la mise en œuvre)

la programmation fonctionnelle, à Haskell ou même à Scala, peut permettre la substitution par un mécanisme plus général de classes de type. L'état interne Mutable est soit découragé, soit interdit. L'Encapsulation de la représentation interne peut également être réalisé. Voir Haskell vs OOP pour une bonne comparaison.

Norman affirme que "l'Ajout d'un nouveau genre de chose à un programme fonctionnel peut exiger éditer 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 type. Si la correspondance de modèle sur un type de données abstraites particulier est répandue dans une base de données, vous souffrirez en effet de ce problème, mais il est peut-être un mauvais design pour commencer.

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

29
répondu retronym 2010-02-18 14:08:33
  1. si vous êtes dans un environnement fortement concurrent, alors la programmation fonctionnelle pure est utile. L'absence d'état mutable rend la concurrence presque insignifiante. Voir Erlang.

  2. dans un langage multiparadigm, vous pouvez vouloir modéliser certaines choses fonctionnellement si l'existence de l'état mutable est un détail de mise en œuvre, et donc FP est un bon modèle pour le domaine de problème. Par exemple, voir liste des compressions dans Python ou std.plage dans le langage de programmation D. Ces sont inspirés par la programmation fonctionnelle.

22
répondu dsimcha 2010-01-16 21:41:00