Bonjour, Habr! Je vous présente une traduction d'un article de
Roman Provaznik -
Pourquoi FP est-il important même pour un développeur OOP?Une fois très intéressé par la programmation fonctionnelle, j'ai commencé à l'étudier et à dire à tous mes amis à quel point c'est merveilleux. Plus tard, je suis tombé sur un article sur la programmation fonctionnelle du point de vue d'un programmeur OOP et j'ai décidé de le traduire pour vous. Ne jugez pas strictement, c'est ma première traduction.
On m'a demandé de donner un avis personnel sur la programmation fonctionnelle d'un point de vue objectif. J'ai même été obligé de créer un compte sur le Medium. En tant qu'ancien développeur OOP et pour le moment, je deviendrai un jour un vrai programmeur FP, je pense avoir quelque chose à dire:
Bienvenue voyageur
Si vous n'avez pas passé les 60 dernières années sur une autre planète (si oui, bon retour, voyageur), vous avez probablement entendu parler de programmation fonctionnelle. Si vous suivez les tendances actuelles de l'industrie du logiciel, vous entendez quotidiennement des termes comme «programmation fonctionnelle», «immuabilité», «fonctions pures» et «composition». Tout cela semble cool, délicieux et compréhensible jusqu'à ce que vous pensiez: "Hé, je suis un programmeur OOP et je ne peux pas (ou ne veux pas) changer le paradigme. Que peut me donner la programmation fonctionnelle? Pourquoi devrais-je déranger? " En tant que programmeur / passionné de FP venu du monde de la POO, je veux partager ce que j'aimerais savoir moi-même il y a de nombreuses années. Vous pouvez en parler pendant des heures, alors choisissons les trois choses les plus importantes.
Immuabilité
L'avantage traditionnel de FP est le mot, qui prend généralement au moins deux diapositives de chaque présentation sur la programmation fonctionnelle. Balle d'argent FP, non? Pas vraiment. Malgré le fait que ce mot est le plus souvent utilisé principalement par les programmeurs fonctionnels, il n'est pas exclusif à FP. En tant que développeur OOP, vous pouvez atteindre (presque) le même niveau d'immuabilité qu'un développeur FP. En fait, c'est assez simple, il vous suffit de regarder un peu différemment vos objets et collections. Imaginez que vous ne modifiez pas l'original, mais que vous créez une nouvelle version. Article ajouté à la collection? Super! Vous n'avez pas modifié la collection d'origine, vous avez simplement une nouvelle collection contenant l'élément ajouté. Vous avez changé la propriété d'un objet? Ouah! Vous avez maintenant un nouvel objet avec une propriété modifiée.
Je sais, je sais - cela semble étrange. Mais ce petit changement de conscience vous permettra de dormir plus calme. Dès que vous comprendrez que vos objets ne peuvent pas être modifiés (seulement copiés), vous serez sûr que personne dans l'équipe ne pourra les réaffecter ailleurs. C'est comme emprunter votre ancienne cassette audio Pink Floyd préférée sans craindre de la réenregistrer avec Justin Bieber. Et en bonus, votre code aura des méthodes entièrement traçables dans lesquelles de véritables changements se produisent (où de nouveaux objets sont créés en fonction des originaux). Et, j'ai presque oublié que si vous êtes un développeur C # ou Java, vous les utilisez déjà en appelant "ToLower ()", "Trim ()" sur des lignes qui sont initialement immuables. Ce n'est essentiellement rien de nouveau.
Fonctions pures
Une autre expression à la mode considérée à tort exclusivement FP. Qu'est-ce qu'une «fonction pure»? En termes simples, une fonction pure est une fonction qui renvoie le même résultat avec la même valeur d'entrée, sans communication avec le «monde extérieur» (opérations d'E / S, état général, etc.), également appelé «effets secondaires». Un exemple typique de ce type de fonction peut être d'obtenir la longueur de chaîne (vous ne vous connecterez pas à la base de données pour compter le nombre de caractères dans une chaîne?), Le calcul du sinus, etc. Quels en sont les avantages pour la POO? Identique à FP. Si vous travaillez avec des fonctions (ou méthodes) pures, vous savez exactement quel résultat vous obtiendrez pour chaque valeur d'entrée. Et si votre code ne dépend pas d'un état caché, il est très facile à tester et vous n'aurez pas la peine d'écrire un test unitaire. Nous savons tous que sans interaction avec le monde extérieur, notre logiciel serait inutile, mais il y a une différence notable entre le code pur (écrit avec des fonctions / méthodes pures) avec des entrées-sorties uniquement aux frontières du système et un système dans lequel chaque méthode dépend de l'état interne, mis à jour par d'autres méthodes.
Encore une fois, un peu de repenser l'approche E / S donne tous les avantages de la FP, plus le test devient si simple qu'il va enfin commencer à faire plaisir.
Déclaratif VS impératif
Nous avons déjà changé le point de vue sur notre code - nous pouvons écrire du code plus sûr (immuable) et testable (propre). Il est maintenant temps d'aller un peu plus loin et de changer l'approche pour déterminer ce que notre logiciel doit faire. Qu'est-ce qui rend la POO si différente de la FA? Dans un monde fonctionnel, nous définissons «ce qui» doit se produire au lieu de déterminer «comment» doit se produire. Bien sûr, il reste la partie du programme qui effectue cette opération particulière, mais ici, il est important de se concentrer sur les expressions plutôt que sur les instructions. Et c'est ce que vous pouvez faire dans votre langue préférée de POO.
Par exemple, si vous connaissez des choses comme LINQ (à partir de C #), vous connaissez déjà les avantages des expressions de requête lorsque vous pouvez lire votre code comme «Ouais, ici je prends 10 éléments de la collection, les trie par ordre alphabétique et les utilise comme paramètre pour les éléments suivants méthode. " Vous avez probablement lu des milliers d'expressions de type LINQ sans avoir à penser à ce qui se passe réellement dans les coulisses. Et le plus important est de se concentrer sur ce qui compte vraiment.
Résumé
Je pense que cela suffit pour l'instant. Je ne veux pas finir par vendre la PF comme une solution miracle. Le monde n'est pas seulement noir et blanc. La vérité est que FP est incroyablement difficile pour moi. Presque aussi compliqué que la POO appropriée. Mais ça vaut vraiment la peine d'essayer. De mon point de vue, OOP vs FP est, dans l'ensemble, la façon dont je pense au code et à sa structure. Comment je pense aux dépendances, aux effets secondaires, au monde entier des E / S et des tests. Pour résumer avec une pensée, "Une approche fonctionnelle aidera, indépendamment de la langue, du domaine et de la plate-forme."