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?
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.
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:
-
Programmation Fonctionnelle pour tous les jours .NET Développement , par Jeremy Miller. Un grand article (bien que mal formaté) montrant de nombreuses techniques et des exemples pratiques, du monde réel de FP sur c#.
-
Monde Réel Functional Programming , par Tomas Petricek. Un grand livre qui traite principalement des concepts de FP, en essayant d'expliquer ce qu'ils sont, quand ils devraient être utilisés. Il y a de nombreux exemples à la fois dans F# et C#. Aussi, le blog de Petricek est une excellente source d'information.
la Programmation Orientée Objet, propose:
- Encapsulation, à
- mutation de contrôle de l'état interne
- accouplement limite à la représentation interne
Sous-typage - , 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.
-
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.
-
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.