Jusqu'à présent, j'ai été principalement exposé à la programmation OO et j'ai hâte 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?
oop
functional-programming
paradigms
Olivier Lalonde
la source
la source
Réponses:
Lorsque vous prévoyez un autre type d'évolution logicielle:
Les langages orientés objet sont bons lorsque vous avez un ensemble fixe d' opérations sur des choses , et 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 lorsque vous avez un ensemble fixe de 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 les types de données existants, et les fonctions existantes sont laissées seules.
Lorsque l'évolution va dans le mauvais sens, vous avez des problèmes:
L'ajout d'une nouvelle opération à un programme orienté objet peut nécessiter la modification de nombreuses définitions de classe pour ajouter une nouvelle méthode.
L'ajout d'un nouveau type de chose à un programme fonctionnel peut nécessiter la modification de nombreuses définitions de fonction 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 d'expression peut être résolu avec des fonctionnalités de langage telles que les mixins, une solution largement acceptée n'a pas encore atteint le courant dominant.
Les langages fonctionnels excellent dans la manipulation de données symboliques sous forme d'arbre. Un exemple préféré est les compilateurs, où les langages source et intermédiaire changent rarement (principalement les mêmes choses ), mais les rédacteurs du compilateur ajoutent toujours de nouvelles traductions et des améliorations ou optimisations de code (nouvelles opérations sur les choses). Plus généralement, la compilation et la traduction sont des "applications tueuses" pour les langages fonctionnels.
la source
Vous n'avez pas nécessairement à choisir entre les deux paradigmes. Vous pouvez écrire des logiciels avec une architecture OO en utilisant de nombreux concepts fonctionnels. FP et OOP sont de nature orthogonale .
Prenons par exemple C #. On pourrait dire qu'il s'agit principalement de POO, mais il existe de nombreux concepts et constructions FP. Si vous considérez Linq , les constructions les plus importantes qui permettent à Linq d'exister sont de nature fonctionnelle: les expressions lambda .
Un autre exemple, F #. On pourrait dire qu'il s'agit principalement de FP, 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é lorsqu'elle rend votre code plus clair ou lorsqu'elle augmente considérablement les performances.
De nombreuses langues modernes sont multi-paradigmes.
Lectures recommandées
Comme je suis dans le même bateau (formation OOP, apprentissage de la PF), je vous suggère quelques lectures que j'ai vraiment appréciées:
Programmation fonctionnelle pour le développement .NET quotidien , par Jeremy Miller. Un excellent article (bien que mal formaté) montrant de nombreuses techniques et des exemples pratiques et réels de FP sur C #.
Programmation fonctionnelle du monde réel , par Tomas Petricek. Un grand livre qui traite principalement des concepts de PF, essayant d'expliquer ce qu'ils sont, quand ils doivent être utilisés. Il existe de nombreux exemples en F # et C #. De plus, le blog de Petricek est une excellente source d'informations.
la source
La programmation orientée objet offre:
La programmation fonctionnelle, dans Haskell ou même dans Scala, peut permettre la substitution par un mécanisme plus général des classes de types. L'état interne mutable est soit découragé, soit 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 «l'ajout d'un nouveau type de chose à un programme fonctionnel peut nécessiter la modification de nombreuses définitions de fonction pour ajouter un nouveau cas». dépend de la façon dont le code fonctionnel a utilisé les classes de type. Si la correspondance de motifs sur un type de données abstrait particulier est répartie dans une base de code, vous souffrirez en effet de ce problème, mais c'est peut-être une mauvaise conception pour commencer.
EDITED Suppression de la référence aux conversions implicites lors de la discussion des classes de type. 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 de parvenir à la substitution de types compatibles.
la source
Si vous êtes dans un environnement fortement concurrent, une programmation fonctionnelle pure est utile. L'absence d'état mutable rend la concurrence presque insignifiante. Voir Erlang.
Dans un langage multiparadigm, vous voudrez peut-être modéliser certaines choses fonctionnellement 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 problématique. Par exemple, consultez la liste des compréhensions en Python ou std.range dans le langage de programmation D. Ceux-ci s'inspirent de la programmation fonctionnelle.
la source