¿Qué es una función pura y por qué es deseable?
Ver respuesta — intenta responderla en voz alta primero
Una función pura es aquella que, dadas las mismas entradas, siempre devuelve la misma salida y no produce efectos secundarios (no modifica nada fuera de sí misma). Son deseables porque son predecibles, fáciles de probar y fáciles de reutilizar.
Una función es pura si cumple dos reglas:
- Determinista: con los mismos argumentos, siempre devuelve el mismo resultado.
- Sin efectos secundarios: no modifica variables externas, no cambia sus argumentos, no imprime en la consola, no escribe en disco y no hace peticiones.
Lo contrario es una función impura: depende de algo externo o cambia algo externo.
Las funciones puras son más fáciles de probar (solo revisas la entrada y la salida) y más fáciles de razonar (no tienes que preocuparte por lo que tocan afuera).
// PURA: misma entrada, misma salida, sin efectos secundarios
function sumar(a, b) {
return a + b;
}
console.log(sumar(2, 3)); // siempre 5
// IMPURA: depende de una variable externa
let impuesto = 0.16;
function precioConImpuesto(precio) {
return precio * (1 + impuesto); // si impuesto cambia, el resultado cambia
}
// IMPURA: modifica su argumento (efecto secundario)
function agregarItem(carrito, item) {
carrito.push(item); // muta el arreglo original
return carrito;
}
// Versión PURA: crea una copia en lugar de mutar
function agregarItemPura(carrito, item) {
return [...carrito, item]; // devuelve un arreglo nuevo
}
const original = ["a"];
const actualizado = agregarItemPura(original, "b");
console.log(original); // ["a"] (intacto)
console.log(actualizado); // ["a", "b"]
Pensar que una función es pura solo porque tiene un return. Si adentro modifica un arreglo que recibió como parámetro, o depende de una variable externa que puede cambiar, ya es impura. Mutar los argumentos es el efecto secundario más común y más difícil de detectar.
"Una función pura siempre devuelve el mismo resultado para las mismas entradas y no tiene efectos secundarios: no modifica variables externas ni sus propios argumentos. Son deseables porque son predecibles y muy fáciles de probar, ya que solo tengo que revisar la entrada y la salida. Siempre que puedo, evito mutar los argumentos y en su lugar devuelvo copias nuevas, por ejemplo usando el operador spread."
Convierte esta función impura en una pura:
let total = 0;
function acumular(n) {
total += n;
return total;
}
Ver solución
// Pura: recibe el total acumulado y devuelve el nuevo, sin estado externo
function acumular(total, n) {
return total + n;
}
console.log(acumular(0, 5)); // 5
console.log(acumular(5, 3)); // 8