En informatique, une fonction ou une expression est dite avoir un effet secondaire si elle modifie un état ou a une interaction observable avec des fonctions appelantes ou avec le monde extérieur.
De Wikipedia - Effet secondaire
Une fonction, au sens mathématique, est un mappage d’entrée en sortie. L’appel d’une fonction a pour effet de mapper l’entrée sur la sortie qu’elle renvoie. Si la fonction fait autre chose, peu importe, mais si elle a un comportement qui ne mappe pas l'entrée vers la sortie, ce comportement est connu pour être un effet secondaire.
En termes plus généraux, un effet secondaire est un effet qui n’est pas l’effet recherché par le concepteur de la construction.
Un effet est tout ce qui affecte un acteur. Si j'appelle une fonction qui envoie un message texte de séparation à ma petite amie, qui affecte un groupe d'acteurs, moi-même, elle-même, le réseau de l'entreprise de téléphonie mobile, etc. Le seul effet recherché en appelant une fonction sans effets secondaires, c'est pour la fonction pour me retourner un mappage de mon entrée. Donc pour:
public void SendBreakupTextMessage() {
Messaging.send("I'm breaking up with you!")
}
Si cela est censé être une fonction, la seule chose à faire est de retourner vide. S'il était sans effet secondaire, il ne devrait pas envoyer le message texte.
Dans la plupart des langages de programmation, il n'y a pas de construction pour une fonction mathématique. Aucune construction n'est destinée à être utilisée en tant que telle. C'est pourquoi la plupart des langues disent que vous avez des méthodes ou des procédures. De par leur conception, ceux-ci sont conçus pour pouvoir produire beaucoup plus d’effets. Dans le langage courant de la programmation, personne ne se soucie vraiment de l’intention de ce qu’est une méthode ou une procédure, ainsi quand on dit que cette fonction a un effet secondaire, ils veulent dire en réalité que cette construction ne se comporte pas comme une fonction mathématique. Et quand quelqu'un dit que cette fonction est sans effet secondaire, ils veulent dire que cette construction se comporte efficacement comme une fonction mathématique.
Une fonction pure est toujours libre d'effets secondaires, par définition. Une fonction pure, est une façon de dire, cette fonction, même si elle utilise une construction qui permet plus d'effets, n'a pour effet qu'un effet égal à celui d'une fonction mathématique.
Je défie quiconque de me dire quand une fonction sans effets secondaires ne serait pas pure. À moins que l'effet recherché principal du contexte de la phrase utilisant les termes pur et effet secondaire secondaire ne soit pas celui de l'effet recherché mathématique d'une fonction, ceux-ci sont toujours égaux.
En tant que tel, parfois, bien que plus rarement, et je crois que c'est la distinction qui manque et qui égare les gens (car ce n'est pas l'hypothèse la plus courante) dans la réponse acceptée, mais on suppose parfois que l'effet recherché d'une fonction de programmation est: mapper l'entrée sur la sortie, entrée non contrainte aux paramètres explicites de la fonction, mais sortie limitée à la valeur de retour explicite. Si vous supposez que c'est l'effet recherché, alors une fonction lisant un fichier et renvoyant un résultat différent en fonction de son contenu est toujours sans effet secondaire, car vous avez autorisé les entrées provenant d'autres endroits de l'effet souhaité.
Alors, pourquoi est-ce si important?
Tout est question de contrôle et de maintien. Si vous appelez une fonction et que cette dernière renvoie une valeur, il est difficile de raisonner sur son comportement. Vous devrez aller à l'intérieur de la fonction pour que le code réel devine ce qu'il fait et affirme son exactitude. La situation idéale est qu’il est très clair et facile de savoir quelle entrée est utilisée par la fonction et qu’elle ne fait rien d’autre que de renvoyer une sortie pour elle. Vous pouvez vous détendre un peu et dire que savoir exactement quelle entrée il utilise n’est pas aussi utile que d’être certain de ne rien faire d’autre que vous pourriez ne pas être au courant, puis de renvoyer une valeur. Vous êtes donc peut-être content qu'il ne fait rien d'autre que mapper l'entrée, peu importe d'où il provient, à la sortie.
Dans presque tous les cas, le but d'un programme est d'avoir des effets autres que la cartographie des éléments entrant dans les éléments à venir. L'idée de contrôler l'effet secondaire est que vous pouvez organiser le code d'une manière plus facile à comprendre et à raisonner. Si vous mettez tous les effets secondaires ensemble, dans un endroit très explicite et central, il est facile de savoir où regarder et de croire que c'est tout ce qui se passe, pas plus. Si vous souhaitez que l'entrée soit très explicite également, cela permet de tester le comportement de différentes entrées, et il est plus facile à utiliser, car vous n'avez pas besoin de modifier l'entrée dans de nombreux endroits différents. Certains peuvent ne pas être évidents, pour obtenir ce que vous voulez.
Parce que le meilleur moyen de comprendre, de raisonner et de contrôler le comportement d’un programme est de regrouper toutes les entrées de manière claire et explicite, et de regrouper et d’expliciter tous les effets secondaires, c’est généralement ce dont les gens parlent quand ils disent: effet secondaire, pur, etc.
Parce que le plus utile est le regroupement des effets secondaires et de leur caractère explicite, parfois les gens ne veulent que le dire, et le différencient en disant que ce n'est pas pur, mais qu'il reste "sans effets secondaires". Mais l’effet secondaire est relatif à l’effet supposé «effet primaire voulu», il s’agit donc d’un terme contextuel. Je trouve que cela est moins souvent utilisé, bien qu’étonnamment, on en parle beaucoup dans ce fil.
Enfin, idempotent signifie que si vous appelez cette fonction plusieurs fois avec les mêmes entrées (peu importe d'où elles viennent), vous obtiendrez toujours les mêmes effets (effets secondaires ou non).