Récemment, j'ai beaucoup entendu parler de l'utilisation de langages fonctionnels tels que Haskell. Quelles sont les grandes différences, avantages et inconvénients de la programmation fonctionnelle par rapport à la programmation orientée objet?
Je dirais que c'est plus Programmation fonctionnelle vs Programmation impérative.
La plus grande différence est que la programmation impérative concerne le flux de contrôle tandis que la programmation fonctionnelle concerne le flux de données . Une autre façon de le dire est que la programmation fonctionnelle utilise uniquement expressions tandis qu'en programmation impérative, les deux expressions et instructions sont utilisés.
Par exemple, dans les variables et boucles de programmation impératives sont courantes lors de la gestion de l'état, tandis que dans fonctionnelles la programmation de l'état est gérée via le passage de paramètres, ce qui évite les effets secondaires et les affectations.
Pseudo-code impératif pour une fonction de calcul de la somme d'une liste (la somme est conservée dans une variable):
int sumList(List<int> list) {
int sum = 0;
for(int n = 0; n < list.size(); n++) {
sum = sum + list.get(n);
}
return sum;
}
Pseudo-code fonctionnel pour la même fonction (la somme est passée en paramètre):
fun sumList([], sum) = sum
| sumList(v::lst, sum) = sumList(lst, v+sum)
Je recommande la présentation Taming Effects with Functional Programming by Simon Peyton-Jones pour une bonne introduction aux concepts fonctionnels.
La programmation fonctionnelle est basée sur un modèle déclaratif et tire ses racines du calcul lambda. Il offre beaucoup de grands concepts qui peuvent être empruntés à des langages plus impératifs comme C++ et C #.
Certains exemples incluent la transparence référentielle, les fonctions lambda, les fonctions de première classe, l'évaluation paresseuse et avide et l'immuabilité.
Si pour rien d'autre, l'apprentissage de la programmation fonctionnelle est utile pour les concepts qu'elle contient. Cela changera votre façon de programmer et de penser à la programmation. Et je suppose qu'à l'avenir, la programmation fonctionnelle sera tout aussi importante que la programmation orientée objet.
Pour commencer, vous pouvez choisir d'utiliser un langage fonctionnel pur comme Haskell, ou vous pouvez utiliser un langage hybride comme F # .
La plupart des bonnes universités couvriront la programmation fonctionnelle et si vous allez à l'école, je vous suggère fortement de suivre ce cours.
Quelles sont les grandes différences, avantages et inconvénients de la programmation fonctionnelle par rapport à la programmation orientée objet?
La programmation bien orientée objet est agréable car elle vous permet de modéliser votre problème complexe en hiérarchies afin que vous puissiez simplifier le problème. Mais cela devient très difficile lorsque vous commencez à envisager une programmation multithread tout en utilisant des objets mutables. Dans de tels cas, vous devez utiliser intensivement les objets de synchronisation et il est presque impossible de perfectionner une grande application.
C'est là qu'intervient la programmation fonctionnelle. En raison de choses comme l'immuabilité, la programmation fonctionnelle simplifie vraiment les programmes multithreads. Il est presque trivialement facile de paralléliser quelque chose lorsque vous savez que, étant donné l'entrée X d'une fonction, elle produira toujours Y. De plus, vous savez qu'une variable (ou une valeur dans la programmation fonctionnelle) ne peut pas changer en cours d'utilisation à partir d'un autre thread.
(Cette réponse est adaptée d'un réponse à une question fermée sur StackOverflow .)
L'une des grandes différences entre la programmation fonctionnelle et la programmation orientée objet est que chacun est meilleur dans un type différent d'évolution logicielle:
Les langages orientés objet sont bons lorsque vous avez un ensemble fixe d'opérations sur les choses , et à mesure que votre code évolue, vous ajoutez principalement de nouvelles choses. Cela peut être accompli en ajoutant de nouvelles classes qui implémentent les 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 nouveaux opérations sur les 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 de l'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.
Il n'y a pas de véritable contre. Ils peuvent être parfaitement complémentaires. Il existe FP langages, qui prennent en charge la POO. Mais les communautés diffèrent dans la façon dont elles gèrent la modularité.
Les utilisateurs des langages FP ont tendance à atteindre la modularité grâce aux lois mathématiques. Et préfèrent les preuves pour montrer la conformité avec leurs lois.
En impératif OOP les utilisateurs ont tendance à capturer le comportement de l'objet dans des cas de test, qui peuvent être réexécutés si l'objet a changé et atteindre ainsi la modularité.
Ce n'est qu'un petit aspect, mais je pense qu'il convient de le mentionner.
Une analogie:
On vous remet une demande d'emploi. Vous indiquez votre nom, vos coordonnées et votre historique professionnel. Lorsque vous avez terminé, vous n'avez plus d'application vide.
Maintenant, imaginez plutôt qu'avant d'écrire, vous le recouvrez d'une feuille de cellophane transparente. Vous écrivez votre nom. Vous ajoutez une autre feuille de cellophane. Vous écrivez vos coordonnées. Plus de cellophane. Vous écrivez votre historique de travail. Lorsque vous avez terminé, l'application vierge reste intacte. Vous avez également trois feuilles de cellophane ayant chacune capturé l'effet d'un seul changement discret.
Le premier (OOP) embrasse l'idée de changer les choses en place tandis que le second (FP) l'évite. Les deux sont des paradigmes de gestion de l'État. Les deux peuvent, en utilisant des stratégies différentes, saisir l'effet de remplir une demande d'emploi. OOP change directement l'instrument de départ, tandis que FP superpose ce qui l'a précédé pour effectuer l'apparence du changement .