Fermer

juillet 1, 2022

Fonctions pures et effets secondaires en JavaScript


Discutons des fonctions pures et pourquoi elles sont si importantes pour notre code JavaScript.

Il existe de nombreux concepts dans le domaine de l’informatique qui sont très anciens et ont été créés il y a des décennies. Cela arrive tout le temps – nous travaillons sur quelque chose et suivons un paradigme ou un concept qui a été créé par un esprit incroyable il y a des décennies et nous ne le remarquons même pas. Il y a eu de nombreuses tentatives dans le passé pour définir et trouver les meilleures approches pour des situations données. Beaucoup ont bien fonctionné et beaucoup n’ont pas fonctionné.

La programmation fonctionnelle est un paradigme de programmation très important utilisé depuis des décennies. De nombreux langages suivent le paradigme pour suivre une méthode de programmation plus simpliste, puissante et concise. C’est un paradigme de programmation qui suit une règle simple de création, d’application et de composition de fonctions. C’est devenu un paradigme si important que les développeurs essaient toujours d’en suivre quelques concepts dans d’autres langages.

L’un des concepts de la programmation fonctionnelle est celui des fonctions pures. L’idée de s’appuyer sur des fonctions et de créer les fonctions les plus pures possibles peut rendre notre code prévisible, concis et puissant.

Fonctions pures

Les fonctions sont l’un des aspects les plus importants de la programmation. Tout langage de programmation que vous pouvez imaginer dépend de fonctions.

Les fonctions sont un morceau de code autonome qui exécute une tâche spécifique. Il peut recevoir des données, en faire quelque chose et les renvoyer comme résultat d’une fonction. Il peut être appelé plusieurs fois dans différentes parties de la même application.

Une fonction pure est une fonction qui renvoie toujours la même sortie compte tenu d’une entrée spécifique.

Une fonction pure ne change aucune valeur ou état en dehors de sa portée et ne dépend d’aucune valeur en dehors de sa portée. Cela dépend uniquement de l’entrée donnée à la fonction et ne produit aucun effet secondaire.

La complexité est tout ce qui rend un logiciel difficile à comprendre ou à modifier.
— John Outerhout

Il n’y a que deux choses dont nous devons nous assurer pour définir qu’une fonction est une fonction pure :

  1. La fonction doit être prévisible. Étant donné une entrée spécifique, il renverra toujours la même sortie.
  2. La fonction ne produit aucun effet secondaire.

Voici un exemple simple d’une fonction pure :

function sumTwoNumbers(num1, num2) {
  return num1 + num2
};

La fonction sumTwoNumbers reçoit deux arguments. Nous additionnons simplement les deux nombres et les renvoyons comme résultat de la fonction.

Cette fonction est une fonction pure car le résultat de la fonction repose entièrement sur les arguments passés à la fonction. Notre fonction ne modifie aucun état ou valeur en dehors de son champ d’application. Peu importe ce que nous avons dans notre application, si nous avons affaire à une gestion d’état lourde, à des mutations de données, etc.

Voyons maintenant un exemple de la fonction suivante :

const person = {
  name: "Leonardo"
};

function myImpureFunction(obj) {
  obj.name = "Leonardo Maldonado";
  return obj;
}

C’est un bon exemple d’une fonction impure car elle modifie la valeur de l’objet personne en dehors de sa portée. Notre fonction reçoit un objet en argument et modifie la propriété name.

Les fonctions pures sont utilisées dans presque tous les langages de programmation car elles nous aident à créer un code plus prévisible. Nous utilisons des fonctions pures en JavaScript sans même nous en apercevoir.

Prenons comme exemple le Math objet intégré que nous pouvons utiliser pour les opérations mathématiques. Il existe de nombreuses fonctions différentes que nous pouvons utiliser et toutes les fonctions sont pures. La Math.max() fonction, par exemple, renvoie le plus grand des zéro ou plusieurs nombres donnés comme paramètres d’entrée.

Peu importe le nombre de fois que nous exécutons la fonction, si nous passons toujours les mêmes arguments d’entrée, nous allons recevoir le même résultat :

Math.max(1, 5, 10); 

Avantages des fonctions pures

Il existe de nombreuses raisons d’écrire des fonctions pures dans nos applications. Voici quelques raisons pour lesquelles nous devrions écrire des fonctions plus pures et en faire la méthode d’écriture de fonctions par excellence.

1. Prévisibilité

Cela nous aide tous à écrire un morceau de code dont nous sommes fiers. Nous avons compris. La vérité est que personne ne veut écrire du code désordonné, mais cela arrive parfois. Habituellement, quand quelqu’un vous demande, « Que fait ce code ? » cela peut signifier que votre code est difficile à lire.

Les fonctions pures nous aident à créer un code plus prévisible et lisible. Les fonctions pures sont de petites fonctions qui effectuent une tâche très spécifique et renverront toujours la même sortie compte tenu d’une entrée spécifique.

La lisibilité est importante dans chaque application de nos jours. Nous devons nous rappeler que ce n’est pas seulement nous qui travaillons dans une base de code. Après avoir écrit une ligne de code, il y aura beaucoup de développeurs qui la liront, et elle devrait être aussi propre et lisible que possible pour ne pas causer de problèmes aux autres développeurs.

2. Tests

Les fonctions pures sont également la meilleure option pour écrire des tests. Tester des fonctions pures est plus facile car elles sont prévisibles et ne produisent aucun effet secondaire, nous ne modifierons donc jamais un état de notre valeur en dehors de sa portée.

function sumTwoNumbers(num1, num2) {
  return num1 + num2
};

describe("sumTwoNumbers", () => {
  test("should return 2". () => {
    expect(sumTwoNumbers(1, 1)).toEqual(2);
  });
});

Une fonction impure, en revanche, est une fonction très difficile à tester. Ils modifient l’état ou la valeur en dehors de sa portée et peuvent renvoyer un résultat différent en fonction d’une entrée spécifique à chaque fois.

3. Mémoïsation

La mise en cache des résultats renvoyés d’une fonction peut nous éviter d’écrire des fonctions de calcul coûteuses et les rendre plus performantes.

Les fonctions pures sont faciles à mémoriser. Puisqu’ils renvoient les mêmes résultats avec une entrée spécifique, le résultat mis en cache peut être renvoyé lorsque la fonction est appelée avec les mêmes arguments d’entrée.

La clé pour écrire une fonction pure est de diviser les grandes fonctions en petites et de ne pas muter les valeurs en dehors de sa portée. Chaque fonction doit être responsable d’une petite partie du code.

Conclusion

Comprendre et utiliser des fonctions pures dans votre code rendra votre code plus lisible, concis et prévisible. Il vous aide à développer un meilleur code, ce qui facilite les tests et rend l’ensemble de votre application plus performant. Vous commencerez à voir les avantages d’écrire des fonctions pures dans votre code car elles le rendront plus lisible et prévisible.




Source link