L'avantage est que les fonctions pures rendent votre code plus facile à raisonner. Ou, en d'autres termes, les effets secondaires augmentent la complexité de votre code.
Prenons un exemple de computeProductPrice
méthode.
Une méthode pure vous demanderait une quantité de produit, une devise, etc. Vous savez que chaque fois que la méthode est appelée avec les mêmes arguments, elle produira toujours le même résultat.
- Vous pouvez même le mettre en cache et utiliser la version mise en cache.
- Vous pouvez le rendre paresseux et reporter son appel lorsque vous en avez réellement besoin, sachant que la valeur ne changera pas entre-temps.
- Vous pouvez appeler la méthode plusieurs fois, sachant qu'elle n'aura pas d'effets secondaires.
- Vous pouvez raisonner sur la méthode elle-même dans un isolement du monde, sachant que tout ce dont elle a besoin sont les arguments.
Une méthode non pure sera plus complexe à utiliser et à déboguer. Comme cela dépend de l'état des variables autres que les arguments et peut-être de les modifier, cela signifie qu'il pourrait produire des résultats différents lorsqu'il est appelé plusieurs fois, ou ne pas avoir le même comportement lorsqu'il n'est pas appelé du tout ou appelé trop tôt ou trop tard.
Exemple
Imaginez qu'il existe une méthode dans le cadre qui analyse un nombre:
decimal math.parse(string t)
Il n'a pas de transparence référentielle, car il dépend de:
La variable d'environnement qui spécifie le système de numérotation, c'est-à-dire Base 10 ou autre chose.
La variable dans la math
bibliothèque qui spécifie la précision des nombres à analyser. Donc, avec la valeur de 1
, l'analyse de la chaîne "12.3456"
donnera 12.3
.
La culture, qui définit la mise en forme attendue. Par exemple, avec fr-FR
, l'analyse "12.345"
donnera 12345
, car le caractère de séparation doit être ,
, non.
Imaginez à quel point il serait facile ou difficile de travailler avec une telle méthode. Avec la même entrée, vous pouvez avoir des résultats radicalement différents selon le moment où vous appelez la méthode, car quelque chose, quelque part, a changé la variable d'environnement ou changé de culture ou défini une précision différente. Le caractère non déterministe de la méthode entraînerait plus de bugs et plus de cauchemar de débogage. Appeler math.parse("12345")
et obtenir 5349
une réponse car un code parallèle analysait des nombres octaux n'est pas bien.
Comment réparer cette méthode évidemment cassée? En introduisant la transparence référentielle. En d'autres termes, en se débarrassant de l'état global et en déplaçant tout vers les paramètres de la méthode:
decimal math.parse(string t, base=10, precision=20, culture=cultures.en_us)
Maintenant que la méthode est pure, vous savez que peu importe quand vous appelez la méthode, elle produira toujours le même résultat pour les mêmes arguments.