El beneficio es que las funciones puras hacen que su código sea más fácil de razonar. O, en otras palabras, los efectos secundarios aumentan la complejidad de su código.
Tome un ejemplo de computeProductPricemétodo.
Un método puro le pediría una cantidad de producto, una moneda, etc. Usted sabe que siempre que se llame al método con los mismos argumentos, siempre producirá el mismo resultado.
- Incluso puede almacenarlo en caché y usar la versión en caché.
- Puede hacerlo flojo y posponer su llamada cuando realmente lo necesite, sabiendo que el valor no cambiará mientras tanto.
- Puede llamar al método varias veces, sabiendo que no tendrá efectos secundarios.
- Puede razonar sobre el método en sí mismo en un aislamiento del mundo, sabiendo que todo lo que necesita son los argumentos.
Un método no puro será más complejo de usar y depurar. Dado que depende del estado de las variables que no sean los argumentos y posiblemente las altere, significa que podría producir resultados diferentes cuando se llama varias veces, o no tener el mismo comportamiento cuando no se llama o se llama demasiado pronto o demasiado tarde.
Ejemplo
Imagine que hay un método en el marco que analiza un número:
decimal math.parse(string t)
No tiene transparencia referencial, porque depende de:
La variable de entorno que especifica el sistema de numeración, que es Base 10 u otra cosa.
La variable dentro de la mathbiblioteca que especifica la precisión de los números para analizar. Entonces, con el valor de 1, el análisis de la cadena "12.3456"dará 12.3.
La cultura, que define el formato esperado. Por ejemplo, con fr-FR, el análisis "12.345"dará 12345, porque el carácter de separación debería ser ,, no.
Imagine lo fácil o difícil que sería trabajar con tal método. Con la misma entrada, puede tener resultados radicalmente diferentes dependiendo del momento en que llame al método, porque algo, en algún lugar, cambió la variable de entorno o cambió la cultura o estableció una precisión diferente. El carácter no determinista del método conduciría a más errores y más pesadillas de depuración. Llamar math.parse("12345")y obtener 5349una respuesta ya que algún código paralelo estaba analizando números octales no es bueno.
¿Cómo arreglar este método obviamente roto? Mediante la introducción de la transparencia referencial. En otras palabras, deshaciéndose del estado global y moviendo todo a los parámetros del método:
decimal math.parse(string t, base=10, precision=20, culture=cultures.en_us)
Ahora que el método es puro, sabe que no importa cuándo lo llame, siempre producirá el mismo resultado para los mismos argumentos.