Funciones Puras (Pure Functions)

Funciones Puras (Pure Functions)

¿Qué son las funciones puras? ¿Por qué son importantes?

El concepto de Funciones Puras (Pure Functions) proviene del mundo de las matemáticas y que ha sido adoptado por la programación funcional.

Podemos decir que una función es pura siempre y cuando cumpla con dos condiciones:

  1. Dados los mismos parámetros de entrada siempre ha de devolver los mismos parámetros de salida.

  2. La función no puede tener efectos laterales (side effects) lo que se traduce en que no va a poder manipular ningún valor fuera de su scope de ejecución.

Ejemplos

Vamos a considerar el siguiente ejemplo donde podemos entender mucho mejor lo que estamos hablando:

let num = 0

function randomNumber() {
  // Retorna un valor diferente cada vez que la ejecutamos.
  // Además muta el valor de la variable 'num'.
  nu, = Math.random()
}

randomNumber()

La función randomNumber no puede ser considerada una función pura por dos razones.

  1. La primera de ellas es que dados los mismos valores de entrada no tenemos ninguna garantía de que nos vaya a retornar los mismos valores de salida.

  2. La segunda es que está manipulando un valor que está fuera de su scope (lo que se conoce como un side effect).

Veamos ahora un ejemplo de una función que sí que se puede considerar pura:

function add(numOne, numTwo) {
  // Resultado predecible.
  // No hay side effects.
  return numOne + numTwo
}

const result = add(2, 2)

Es fácil entender que la función add ante los mismos parámetros de entrada siempre nos va a retornar el mismo resultado además de que dentro de la misma no se está manipulando ningún valor que esté fuera de su scope de ejecución.

La forma de escribir pure functions por lo general es algo bastante sencillo de hacer y muy fácil de realizar. Además se trata de unas funciones que son muy sencillas de testear lo que siempre será algo que nos facilitará nuestro trabajo del día a día.

Ahora bien, ¿es siempre deseable tener nuestro código todos formado con pure functions? ¿qué sucederá en el caso de que tengamos que introducir algún side effect como consecuencia de una llamada a una función? Pues en estos casos sí que se deberá saltar el uso de las pure functions creando una serie de funciones en las que se recojan todos esos side effects que son necesarios en nuestro código, funciones que trataremos de que estén aisladas (isolated) todo lo que podamos y además trataremos de que sean el menor número posible de ellas.