Currying Functions
¿Conoces la técnica de programación denominada function currying? En este artículo aprenderemos en qué consiste y cómo la podemos aplicar en nuestros
Function Currying es una de las técnicas de programación más poderosas que tenemos a nuestra disposición cuando estamos desarrollando nuestro código pero desgraciadamente no es muy conocida por un porcentaje elevado de programadores. En este artículo explicaré en qué consiste y para ello vamos a partir de la definición de una función muy sencilla en la que simplemente se estarán sumando los dos números que recibe como parámetros:
function add(numOne + numTwo) {
return numOne + numTwo
}
¿En qué consiste el currying? Pues básicamente lo que viene a hacer es partir de una función que recibe varios parámetros y transformarla en varias funciones que únicamente recibirán un parámetro. Así, al primera llamada a la currying function que vayamos a construir va a retornar una función que tomará como parámetro el segundo parámetro de la función original que se la pasará a la función original y así se acabará obteniendo el valor final de su invocación.
¿Lioso? ¡Pues sí! Pero para eso vamos a desarrollar nuestro ejemplo. Nuestra función add
es una función muy sencilla de JavaScript que toma dos parámetros y los suma. Para poder hacer el currying de esta función lo que vamos a tener que hacer es crear una función que lo único que haga sea retornar el resultado de su invocación:
function add(numOne) {
return function (numTwo) {
return numOne + numTwo
}
}
¡Perfecto! Ya tenemos nuestra currying function pero ahora ¿cómo la vamos a usar? Pues tenemos que pensar en que en primer lugar deberemos hacer una llamada a la función add
pasándole como primer parámetro el número que queremos que se vaya a sumar (el primer operando de la suma):
const add10 = add(10)
de tal manera que ahora add10
es una función que recibe como parámetro el número que queramos sumar a 10. Esto nos va a permitir realizar las siguientes llamadas:
const add10Plus2 = add10(2) // 12
const add10Plus4 = add10(4) // 14
donde los valores que ahora tienen asignandas las variables add10Plus2
y add10Plus4
son respectivamente los resultado de sumarle 2 y 4 al valor 10.
Ejemplo práctico
Ahora que sabemos cómo funciona el currying vamos a intentar aplicarlo a un ejemplo más de nuestro día a día a como desarrolladores y para ello pensemos en un método que está asociado a un endpoint de una aplicación backend en Node como el siguiente:
app.put(
'/api/posts/:postId',
[validateResource(updatePostHandlerSchema)],
updatePostHandler
)
En concreto este método lo que está haciendo es definir un endpoint para atender a las peticiones de tipo PUT dentro de una aplicación Express aplicando un validation schema para asegurarse de que los datos que se van a utilizar en la petición son válidos sabiendo que esta validación va a tomar los datos que están recogidos en el objeto request
que está asociado a la petición del usuario comprobando que se amoldan a lo que esperábamos.
Veamos por lo tanto la implementación de esta función validateResource
que sería algo como lo siguiente:
const validateResource = resourceSchema => async (req, res, next) => {
try {
await resourceSchema.validate({
body: req.body,
query: req.query,
params: req.params
})
next()
} catch (error) {
logger.error(error)
return res.status(400).send(error)
}
}
el parámetro resourceSchema
(el primero de los parámetros) y la función que retorna estará esperando tres parámetros para su ejecución como son el objeto request
, response
y la función next
de Express.
Por lo tanto estamos viendo como gracias al currying de funciones es muy simple implementar el middleware en frameworks como Express.