Original article: Functional Programming in JavaScript for Beginners

La programación funcional no es un nuevo enfoque de programación, pero ha crecido bastante en popularidad en los últimos años.

Esto es porque, una vez que los programadores entienden lo básico de las técnicas (y son capaces de escribir código limpio y confiable usando), las aplicaciones que fueron escritas usando un enfoque funcional son mucho más fáciles de usar.

Por esta razón, vale la pena mejorar nuestro conocimiento de la programación funcional una vez que hayas terminado de trabajar con este JavaScript beginners’ handbook.

Si sueles trabajar con JavaScript, usando este enfoque podrás ahorrarte tiempo, y podrás hacer que tu código sea más fácil para usar y, así como también, tiene potencial de ser más seguro.

En este artículo, vamos a ver los principios básicos de la programación funcional, y luego demarcar algunas de las herramientas claves para usar este tipo de enfoque en JavaScript.

Programación Imperativa vs. Funcional

Los orígenes de la programación funcional se remontan a la década de 1930 con la invención del Cálculo Lambda.

Este enfoque a la computación buscaba definir tareas simples y funciones, no como la manipulación estructural de estructuras de datos (como los arreglos y las listas), sino más bien como funciones matemáticas realizadas sobre ellas.

image-144
Image Source

Esto puede llegar a sonar un poco abstracto, especialmente si eres nuevo a la programación. Pero es el caso que la diferencia entre un enfoque funcional y uno imperativo puede ser expresado de manera breve usando un ejemplo como el siguiente:

Imperativo:

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];

function obtenerImpar(arr) {
  let impares = [];
  for (let i = 0; i < arr.length + 1; i++) {
    if (i % 2 !== 0) {
      impares.push(i);
    }
  }
  return impares;
}

console.log(obtenerImpar(arr)); // logs [1, 3, 5, 7, 9]

Funcional:

function obtenerImpar2(arr){
return arr.filter(num => num % 2 !== 0)
}console.log(obtenerImpar2(arr))
// logs [ 1, 3, 5, 7, 9 ]
const obtenerImpar3 = arr => arr.filter(num => num % 2 !== 0)console.log(obtenerImpar3(arr))
// logs [ 1, 3, 5, 7, 9 ]

Como podrás ver, la manera en la que estos programas trabajan es muy distinta.

El enfoque imperativo es el de definir una estructura de data, y luego manipularla para obtener el output requerido. En el enfoque funcional, usamos funciones de filtro para definir una función programada, y luego llamar esta misma cuando sea necesario.

Obviamente, la mayor parte de la complejidad de cómo funciona la programación funcional está escondida del usuario final, así como también del programador si está usando un framework de desarrollo front end.

Pero las ventajas de usar un enfoque funcional son claras hasta dentro de este ejemplo - este paradigma resulta en código más corto que es más fácil de leer, ser entendido y comprobado.

¿Por qué debería usar la programación funcional?

Además de esta ventaja básica, hay varias otras ventajas para su uso.

Varias de estas provienen del simple hecho de que el código funcional es más fácil de leer que el código imperativo. Esto es porque el ser humano puede fácilmente ver como funciona un programa funcional, en vez de tener que desarmar el código para poder entenderlo, muchos aspectos de testing son simplificados.

La programación funcional garantiza la integridad del código con pruebas de penetración

Pruebas de penetración se vuelve más efectiva donde el código es legible por el humano. Esto lo hace más fácil para evaluar la integridad del código funcional.

Según la desarrolladora de software Barbara Ericson de Cloud Defense, las pruebas de penetración siempre deben realizarse en aplicaciones JavaScript, y un enfoque funcional puede ayudar a que esto sea más riguroso.

Esta facilidad de lectura también simplifica muchos otros procesos administrativos que aplican al desarrollo de código y aplicaciones nuevas.

En los enfoques funcionales, los procesos de cumplimiento son más fáciles, porque los programadores no deberían preocuparse mucho por la ejecución de su código. Lo cual significa que las partes del programa que trabajan con información más sensible puede estar aislado y evaluado separado del resto del programa.

La programación funcional hace que el código sea más fácil de leer

Aun así, las ventajas del enfoque funcional no están limitadas al análisis de código. También se extienden al proceso de desarrollo.

De hecho, el enfoque funcional construyen y amplifican las ventajas y desventajas de JavaScript mismo.

image-145
Image Source

Al hacer que el código sea más fácil de leer, puedes traer muchos más grupos de staff al proceso de desarrollo, mismo si no tienen un conocimiento extenso de JavaScript.

Esta es la clave fundamental para el enfoque DevOps, que uno pueda ayudar a mitigar las vulnerabilidades de tu código JavaScript. También es facilitado al tomar un enfoque funcional a tu código.

Herramientas clave para la programación funcional

Hay un número de herramientas clave y conceptos que deberían conocer cuando se trata de poner un enfoque funcional en acción. Veamos cuáles son.

1. Funciones puras e impuras

En el nivel más básico, una programación funcional busca manipular información sin mutarla. Esto significa que una "función funcional" puede obtener datos, llevar a cabo cálculos, y devolver un resultado (todo sin reescribir ninguna parte de la estructura de datos en sí misma).

Funciones que funcionan de esta manera son llamadas "puras", y aquellas que no lo hacen son denominadas "impuras".

 
function getSquare(items) {
  var len = items.length;
  for (var i = 0; i < len; i++) {
    items[i] = items[i] * items[i];
  }
  return items;
}

La idea general es la de dejar la data con la que estás trabajando completamente intacto.

Si quieres fusionar dos arreglos, no debes utilizar la estrategia de  Array.prototype.push() (que sobreescribirá tu data original). Por lo contrario, usar una función Array.prototype.concat(), que creará un nuevo arreglo en "funcionamiento" con el cual podrías trabajar.

2. Funciones anónimas

Las funciones anónimas también son una parte importante de la programación funcional, una que tiene raíces de cálculos Lambda.

Las funciones anónimas, como el nombre lo sugiere, no tienen un nombre explícitamente definido. En cambio, son las funciones que son asignadas a variables e invocadas por medio de las mismas.

 alert((function(x) {
    return !(x > 1)
      ? 1
      : arguments.callee(x - 1) * x;
  })(20));

La ventaja de hacer esto es que mientras que puedas seguir cuáles funciones están asignadas a cuáles variables, estas pueden ser invocadas fácilmente, y pasadas de un módulo a otro sin nada más que una llamada de variables. Esto te da una nueva manera más flexible y poderosa de trabajar con funciones.

3. Funciones recursivas

El uso de funciones recursivas es otro sello de la programación funcional. Aunque la idea general de la recursión será familiar para los programadores principiantes, la programación funcional lleva la idea aún más lejos al definir funciones que se llamen a sí mismas.

function cuentaRegresiva(fromNumber) {
    console.log(fromNumber);

    let siguienteNum = fromNumber - 1;

    if (siguienteNum > 0) {
        cuentaRegresiva(siguienteNum);
    }
}
cuentaRegresiva(3);

Esto hace que la implementación de la recursión sea más simple - en gran parte porque los programadores no necesitan usar bucles para hacerlo.

Aunque, también viene con sus peligros. Específicamente, tener una función que se llame a sí misma hace que sea aún más fácil para accidentalmente crear un bucle infinito, así que ten el cuidado de respaldar cada función recursiva con una manera rigurosa de parar la ejecución.

Conclusión

Aunque estos tres conceptos son típicos de la programación funcional, la verdad es que la gran variedad de maneras en la cual el paradigma puede ser aplicado significa que es más una filosofía que herramientas y procesos bien diseñados.

Toma un par de pasos para adentrarte al mundo emocionante de la programación funcional, y empezarás a ver su influencia en todos lados. De hecho, comunica muchas de las prácticas más comunes en JavaScript que se usan hoy en día.

En otras palabras, aunque la programación funcional parezca superficialmente simple, tiene consecuencias muy profundas en la manera en la que programas. Es por esto que vale la pena aprenderlo, incluso aunque no lo suelas usar todo el tiempo.