Cómo utilizar una aplicación parcial para mejorar su código JavaScript

Hacer uso de esta técnica funcional puede hacer que su código sea más elegante

La programación funcional nos brinda técnicas para resolver problemas en nuestro código. Uno de ellos, la aplicación parcial, es un poco complicado de entender, pero puede permitirnos escribir menos (suena interesante, ¿verdad?).

¿Qué es?

La aplicación parcial comienza con una función. Tomamos esta función y creamos una nueva con uno o más de sus argumentos ya "establecidos" o aplicados parcialmente . Esto suena extraño, pero reducirá la cantidad de parámetros necesarios para nuestras funciones.

Demos un poco de contexto sobre cuándo podríamos usar una aplicación parcial:

const list = (lastJoin, ...items) => { const commaSeparated = items.slice(0,-1).join(", "); const lastItem = items.pop(); return `${commaSeparated} ${lastJoin} ${lastItem}`;}

Esta pequeña función toma una sola palabra lastJoin, y un número arbitrario de items. Inicialmente, listdeclara una commaSeparatedvariable. Esta variable almacena una matriz unida separada por comas de todos los elementos excepto el último. En la siguiente línea almacenamos el último elemento itemsen una lastItemvariable. Luego, la función regresa usando una plantilla de cadena.

Luego, la función devuelve items, como una cadena, en formato de lista. Por ejemplo:

list("and", "red", "green", "blue"); // "red, green and blue"list("with", "red", "green", "blue"); // "red, green with blue"list("or", "red", "green", "blue"); // "red, green or blue"

Nuestra listfunción nos permite crear listas cuando queramos. Cada tipo de lista que creamos, "y", "con", "o" es una especialización de la listfunción general . ¿No sería bueno si pudieran ser funciones propias?

Cómo utilizar la aplicación parcial

Aquí es donde la aplicación parcial puede ayudar. Por ejemplo, para hacer una listAndfunción, "establecemos" (o aplicamos parcialmente ) el lastJoinargumento para que sea "y". El resultado de hacer esto significa que podemos invocar nuestra función parcialmente aplicada de esta manera:

listAnd("red", "green", "blue"); // "red, green and blue"

Tampoco es necesario que se detenga allí. Podemos hacer muchas funciones especializadas aplicando parcialmente un argumento a nuestra función de lista:

listOr("red", "green", "blue"); // "red, green or blue"listWith("red", "green", "blue"); // "red, green with blue"

Para hacer esto, necesitamos crear una partialfunción de utilidad:

const partial = (fn, firstArg) => { return (...lastArgs) => { return fn(firstArg, ...lastArgs); }}

Esta función toma una función fncomo primer parámetro y firstArgcomo segundo. Devuelve una nueva función de la marca con un parámetro, lastArgs. Esto reúne los argumentos pasados.

Ahora, para hacer nuestra listAndfunción, invocamos partialpasando nuestra listfunción y nuestra última palabra de unión:

const listAnd = partial(list, "and");

Nuestra listAndfunción ahora solo toma una lista arbitraria de elementos. Esta función cuando se invoca, a su vez, invoca la listfunción pasada . Podemos ver que se pasará "y" como primer argumento y lastArgsluego se recopilará .

Ahora hemos creado una función aplicada parcialmente. Podemos usar esta función especializada una y otra vez en nuestro programa:

listAnd("red", "green", "blue"); // "red, green and blue"

Llevándolo más lejos

La partialfunción que creamos es para ilustrar cómo funciona la aplicación parcial. Hay algunas grandes bibliotecas funcionales de JavaScript disponibles que tienen esta utilidad incorporada, como Ramda JS.

Vale la pena señalar que incluso si es nuevo en la aplicación parcial como concepto, hay muchas posibilidades de que lo haya estado utilizando. Si alguna vez ha utilizado el .bind()método en una función, este es un ejemplo de aplicación parcial. Es una práctica común pasar thisal enlace para establecer su contexto. Debajo del capó se está aplicando parcialmente thisy devolviendo una nueva función.