Herramientas Javascript en acción
Descubre algunas herramientas de recuperación JavaScript para subir de nivel en tu juego de programación. Más información sobre ESLint, Prettier y Husky.
Lea nuestro artículo para descubrir la potencia de la programación funcional en JavaScript. La programación funcional se clasifica como un paradigma declarativo en el que la descripción del programa se separa de los cálculos.
"En términos sencillos, la programación funcional es una desarrollo de software estilo que hace hincapié en el uso de funciones".
Extractos del libro: Luis Atencio "Programación funcional en JavaScript. Cómo mejorar su JavaScript programas utilizando técnicas funcionales"
Programación funcional se clasifica como declarativo donde la descripción del programa se separa de los cálculos. Aquí se hace hincapié en el uso de expresiones para describir la lógica del programa. Esto es lo contrario de imperativo programación, donde el código se ejecuta paso a paso y le indica al ordenador con todo detalle cómo realizar el trabajo.
Consideremos un caso en el que tenemos una matriz de números enteros y necesitamos elevar cada uno de ellos a la segunda potencia y luego seleccionar sólo aquellos valores que no sean pares.
const números = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const resultados = []
for(let i = 0; i < longitud.números; i++) {
const segundaPotencia = Math.pow(números[i], 2)
if(segundaPotencia & 1) { // o % 2 pero las operaciones en bits son más rápidas
results.push(segundaPotencia);
}
}
console.log(resultados) // [1, 9, 25, 49, 81]
En cuanto a la imperativo el enfoque en los detalles de implementación es claramente visible. En el bucle, se puede ver el índice del array basado en la necesidad de controlar el número de elementos. Debido a la gran cantidad de detalles en el código, es más difícil centrarse en lo que está haciendo. Centrémonos ahora en el declarativo solución.
const aumentaPotencia = (num) => Math.pow(num, 2)
const isOdd = (num) => num & 1;
const números = [1, 2, 3, 4, 5, 6, 7, 8, 9]
const resultados = números
.map(subeALaSegundaPotencia)
.filter(esPunto);
console.log(resultados) // [1, 9, 25, 49, 81]
En esta solución, se ha separado la implementación de la invocación llevando la lógica a funciones separadas. Gracias a esta solución, sólo podemos centrarnos en los nombres de las funciones que describen lo que ocurre en ellas. Además, el nivel de abstracción se ha elevado y la lógica ahora puede ser reutilizable. Ahora, centrémonos en la llamada. No puedes ver ningún detalle en ella, sólo una descripción que te dice lo que hace este código, paso a paso:
map(subeALaSegundaPotencia)
- toma cada elemento de una matriz y lo eleva a la segunda potencia,filter(isOdd)
- filtrar y seleccionar los elementos impares.Programación funcional tiene muchas ventajas. Cuando se trata de JavaScriptEl uso de funciones es natural porque se trata de un lenguaje funcional. Incluso las clases de este lenguaje son "azúcar sintáctico" y están compuestas por debajo de funciones.
En cuanto a la legibilidad, en el enfoque imperativo el código suele convertirse en una lista con nombres de funciones que pueden leerse secuencialmente sin profundizar en su lógica. Como resultado, no nos centramos en los detalles de implementación.
Otra ventaja es ceñirse a la convención de objetos inmutables. Gracias a este enfoque, el código se vuelve más seguro porque las referencias en JavaScript son muy fuertes y es fácil modificar el objeto no deseado.
En la programación funcional, el código se descompone en pequeñas funciones que pueden considerarse fácilmente código abstracto reutilizable.
Una de las consideraciones importantes en la programación funcional son las funciones puras. Para crear una función de este tipo, es necesario recordar algunas reglas:
// Función Inpure
let contador = 5
...
const multipleCounter = (multiplicador) => {
contador = contador * multiplicador
}
multiplyCounter(2) // -> ? el resultado depende del valor inicial
// Función pura
const multiplicarPor = (multiplicador) => (valor) => valor * multiplicador
const multiplicaPorDos = multiplicaPor(2)
const contador = multiplyByTwo(5) // -> 10
La primera función es impredecible porque depende de un parámetro externo que puede cambiar. La segunda función es transparente, sólo depende de parámetros de entrada, no los modifica y no utiliza variables fuera de rango. Es transparente porque depende de parámetros, no los modifica, no utiliza variables fuera de rango y devuelve un nuevo valor.