C'est une bonne idée de garder le calcul des valeurs (expressions) séparé de l' exécution des actions (déclarations). Nous voulons un contrôle précis sur où et quand les actions seront prises (comme afficher des messages), mais lors du calcul des valeurs, nous préférons travailler à un niveau plus abstrait et ne pas avoir à nous soucier de la façon dont ces valeurs sont calculées.
Une fonction qui calcule uniquement une valeur de retour, en utilisant uniquement les arguments qui lui sont donnés, est appelée pure .
Une "fonction" qui exécute une action est en fait une procédure qui a un effet .
Tous les effets provoqués lors du calcul d'une valeur sont appelés effets secondaires , et il vaut mieux les éviter dans la mesure du possible ("J'avais juste besoin de cette chaîne, je ne savais pas qu'elle martellerait la base de données!").
Pour minimiser le risque d'effets secondaires, nous devons éviter d'envoyer trop de données à nos procédures ou d'y mettre des calculs; si un calcul doit être effectué au préalable, il est généralement préférable de le faire séparément dans une fonction pure, puis de ne transmettre que le résultat requis à la procédure. Cela permet de garder le but de la procédure clair et de réduire les chances qu'elle soit réutilisée ultérieurement dans le cadre d'un calcul (la fonction pure peut être réutilisée à la place).
Pour la même raison, nous devons éviter de traiter les résultats dans une procédure. Il est préférable de renvoyer le résultat (le cas échéant) de notre action et d'effectuer tout traitement ultérieur avec des fonctions pures.
Si nous suivons ces règles, nous pourrions nous retrouver avec une procédure comme sayHello
, qui n'a pas besoin de données et n'a pas de résultat. Par conséquent, la meilleure interface pour cela est de n'avoir aucun argument et de ne pas renvoyer de valeur. C'est préférable, par exemple, d'appeler "console.log" au milieu d'un calcul.
Pour réduire le besoin d'effets pendant le calcul, nous pouvons avoir des calculs qui renvoient des procédures ; par exemple. si nous devons décider d'une action à entreprendre, nous pouvons demander à une fonction pure de choisir une procédure et de la renvoyer, plutôt que de l'exécuter directement.
De même, pour réduire le besoin de calcul lors des procédures, nous pouvons demander aux procédures de prendre d'autres procédures comme paramètres (éventuellement le résultat d'une fonction); par exemple. prendre un tableau de procédures et les exécuter les unes après les autres.