Currying Functions
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.
Subscribe to my newsletter
Read articles from DevJoseManuel directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
DevJoseManuel
DevJoseManuel
Desarrollando código desde los 80s desde que en los 80 vi por primera vez un Amstrad en un escaparate de una tienda de electrónica en mi ciudad natal, lo que me llevó a insistirles a mis padres para que me apuntaran a clases de informática donde aprendí cosas como Basic y ensamblador del x86. A lo largo de mi carrera profesional he pasado por varias revoluciones (y crisis) que han hecho que me haya tenido que ir reinventando para poder seguir desarrollando mi trabajo de la mejor forma posible. Creo que el desarrollo de software tiene una parte de ciencia pero también una de artesanía (y creatividad) que lo convierten en algo apasionante. Eternamente contagiado con el Síndrome del Impostor.