+507 6793-2498
info@escueladeprogramacion.net

Programación funcional con JavaScript

Creado por Danis C. En Consejos de Desarrollo de Software 19 October 2021

Uno de los paradigmas de programación más famosos es la programación orientada a objetos. Todos los desarrolladores, en algún momento, probablemente hayan oído hablar de este paradigma y lo hayan utilizado. El hecho es que hemos estado usando programación orientada a objetos en algún nivel en nuestras aplicaciones durante mucho tiempo y, a veces, este paradigma puede no ser el mejor enfoque para resolver un problema específico.

La programación funcional es un paradigma de programación que ha ido ganando mucha popularidad y uso entre los desarrolladores en los últimos años. Varios lenguajes de programación están diseñados específicamente para trabajar con este paradigma, como Clojure, Elixir, Haskell, etc.

Tenemos algunas bibliotecas diferentes en el ecosistema de JavaScript que nos ayudan a trabajar con un estilo de programación más funcional en nuestras aplicaciones, como Ramda y Lodash. A veces no necesitamos estas bibliotecas y podemos trabajar solo con los conceptos principales de JavaScript para lograr un código de programación más funcional.

Aprender exactamente cómo funciona el paradigma de programación funcional puede marcar una diferencia total en la carrera de un desarrollador. La forma en que el desarrollador piensa, codifica y resuelve un problema, todo puede estar influenciado por un paradigma de programación.

Necesitamos conocer algunos conceptos sobre programación funcional para implementar este paradigma en aplicaciones JavaScript. Entonces, aprendamos más sobre ellos.

¿Qué es la programación funcional?

La programación funcional es un paradigma de programación diseñado para manejar funciones matemáticas puras. Este paradigma está totalmente enfocado a escribir funciones más compuestas y puras.

JavaScript es un lenguaje de múltiples paradigmas, lo que significa que podemos mezclar fácilmente muchos paradigmas diferentes dentro de una simple pieza de código JavaScript. Podemos utilizar paradigmas de programación funcional, procedimental y orientada a objetos, todo al mismo tiempo en JavaScript. El hecho de que JavaScript sea un paradigma múltiple y nos permita trabajar con muchas formas diferentes de programación es lo que hace que este lenguaje sea tan hermoso y poderoso.

La programación funcional tiene algunos conceptos importantes que debemos conocer y comprender. Al implementar estos conceptos en sus aplicaciones, terminará con un código más funcional. Esto marcará una gran diferencia en su aplicación, haciéndola más legible, utilizable, manejable, fácil de probar y libre de errores.

Cubramos los conceptos importantes sobre la programación funcional y cómo podemos aplicarlos en JavaScript.

Objetos de primera clase

Las funciones en JavaScript son objetos de primera clase, también conocidos como " ciudadanos de primera clase ". Esto significa que podemos trabajar con funciones en JavaScript de la misma forma que con variables.

const sum = (a, b) => a + b;

const resultSum = sum(1, 2);

const sumAgain = (a, b, sum) => sum(a, b);
JavaScript

Las funciones en JavaScript son objetos: pueden tener propiedades y tener un enlace a su función de constructor.

Podemos trabajar con funciones en JavaScript de muchas formas diferentes. Por ejemplo:

  • Podemos asignarlos en una variable como valor.
  • Podemos pasarlos como argumentos a otras funciones.
  • Podemos devolverlos como valor de retorno de otra función.
  • Podemos incluirlos en diferentes estructuras de datos.

La forma en que JavaScript maneja las funciones es lo que nos permite implementar el paradigma de programación funcional en JavaScript.

Funciones puras

Uno de los conceptos más importantes en el paradigma de la programación funcional son las funciones puras. La programación funcional requiere que escribamos funciones puras y deterministas, y esto es lo que hace que la programación funcional sea tan hermosa y útil: nos obliga a escribir mejor código con funciones puras, lo que hace que nuestro código sea más fácil de probar y administrar.

Las funciones puras son funciones que, dada una entrada específica, siempre devolverán la misma salida. Las funciones puras están diseñadas para no causar efectos secundarios, por ejemplo, escribir en la consola, modificar un objeto, reasignar una variable, etc.

const myName = (name) => `Hello ${name}`;

myName("Leonardo") // Should always return "Hello Leonardo"
JavaScript

Una de las razones por las que las funciones puras son tan poderosas es que son mucho más fáciles de probar y depurar. Dado que una función pura debe devolver la misma salida dado un valor de entrada específico, podemos probar esta función muy fácilmente.

Algunas funciones se basan en datos distintos de los argumentos que pasa. Estas son las funciones impuras, funciones que mutan o cambian cualquier tipo de datos, variables o estados externos. Las funciones impuras también son conocidas por devolver diferentes valores.

let count = 0;

const increaseCount = (value) => count += value;
JavaScript

Las funciones puras son bloques de construcción simples y reutilizables dentro de una aplicación. Son completamente independientes del estado externo, fáciles de refactorizar, moverse por el código base y adaptarse en el futuro.

Funciones de orden superior

Un concepto poderoso de programación funcional son las funciones de orden superior. Son una excelente manera de abstraer la funcionalidad y escribir un mejor código.

Una función de orden superior es una función que recibe otra función como parámetro o devuelve una función como valor de retorno. Es posible que esté usando muchas funciones de orden superior a diario sin saberlo; por ejemplo, los métodos _mapfilterreduce_ de JavaScript son funciones de orden superior.

const names = ["Leonardo", "Lucas", "Bianca", "José", "Maria", "Joe"];

const sayHiToNames = names.map(name => `Hello ${name}`);
JavaScript

Es muy fácil identificar si una función es de hecho una función de orden superior: si esta función recibe otra función como parámetro (otro término para esto es "devolución de llamada"), es una función de orden superior.

Las funciones de orden superior son muy útiles para escribir funciones compuestas y complejas. Se recomiendan para abstraer y separar sus acciones, dividir sus funciones y crear funciones que puedan trabajar con una variedad de tipos de datos.

Composición

Saber componer tus funciones y colocarlas en el lugar adecuado es una técnica que puedes mejorar con el tiempo y un concepto muy importante en la programación funcional.

La composición también se puede expresar como combinación: es un proceso de combinación de múltiples funciones en una jerarquía para producir una nueva función o realizar un cálculo.

const splitName = (name) => name.split('_').join(' ');

const returnNameCapitalized = (name) => name.toUpperCase();

console.log(returnNameCapitalized(splitName('leonardo_maldonado')));
JavaScript

La composición se trata de pasar entradas de derecha a izquierda, devolviendo la salida de una función como entrada a otra función. Para los principiantes en programación funcional, este es un concepto más avanzado y puede ser difícil de comprender al principio.

Una vez que lo entienda y comience a usarlo, sentirá que lo ayudó a escribir funciones mejor compuestas y más legibles, separando preocupaciones y haciendo su código más limpio.

Declarativo versus imperativo

La programación declarativa e imperativa son paradigmas de programación diferentes que pueden ayudarlo a lograr resultados diferentes.

La programación declarativa es un paradigma de programación donde especificamos la lógica del programa sin describir el control de flujo. La programación declarativa tiene que ver con qué hacer para lograr un resultado determinado.

const numbers = [1, 2, 3, 4, 5];

const sumNumbers = (n) => n.reduce((acc, current) => acc + current);
JavaScript

La programación imperativa es un paradigma de programación en el que especificamos la lógica del programa que describe el control de flujo. La programación imperativa se trata de cómo lograr un resultado determinado.

const numbers = [1, 2, 3, 4, 5];

const sumNumbers = (n) => {

let finalResult = 0;
for (let i = 0; i < n.length; i++) {
finalResult += n[i];
}
return finalResult;
}
JavaScript

La programación funcional favorece la programación declarativa sobre la programación imperativa; en lugar de pensar en cómo hacerlo, se basa en qué hacer.

Inmutabilidad

Un concepto muy importante en la programación funcional es la inmutabilidad. Un objeto inmutable es un objeto que no se puede modificar después de su creación. Imagine que tenemos un objeto y queremos modificar este objeto agregando un nuevo elemento, ¿qué debemos hacer? Deberíamos crear un nuevo objeto, una copia del objeto real, y no mutarlo.

La inmutabilidad es un concepto poderoso que le ayuda a prevenir la creación de efectos secundarios inesperados en su código base. Le facilita la lectura y la redacción de su código.

Dado que JavaScript es un lenguaje multi-paradigma, no viene con las garantías que tenemos en los lenguajes de programación funcional donde podemos trabajar correctamente con el concepto de inmutabilidad.

Para tener datos inmutable en su aplicación, es necesario abandonar algunos métodos, especialmente los métodos de arreglos tales como fillpopsortspliceunshiftreversepush, etc.

Tenemos algunas bibliotecas que pueden ayudarnos con eso, por ejemplo, Immutable.js . Pero a veces no queremos usar una biblioteca de terceros, y ese es el momento en el que debemos confiar en JavaScript vanilla para ello.

Object.assign es el método perfecto para trabajar con datos inmutables. Tomemos como ejemplo un objeto, y queremos crear un nuevo objeto a partir de este objeto y modificar solo una propiedad.

const car = {
model: 'Tesla',
year: 2020
};

const newCar = car;
newCar.model = 'Honda';
JavaScript

No estamos utilizando el método Object.assign . Cuando cambiamos el newCarobjeto, también estamos cambiando el carobjeto antiguo .

Object.assign es una función de ES6 que copia una o más propiedades de uno o más objetos a un objeto de destino y lo devuelve.

const car = {
model: 'Tesla',
year: 2020
}
const newcar = Object.assign({}, car, {
model: 'Honda'
})
JavaScript

La inmutabilidad es un gran concepto con el que trabajar, especialmente cuando tenemos objetos grandes y necesitamos realizar algún tipo de tarea con ellos, para poder copiar el objeto y crear uno nuevo sin mutarlo.

Más sobre programación funcional

La programación funcional es un paradigma realmente poderoso y hermoso para escribir mejor código. Presenta una gran cantidad de beneficios, como aplicaciones sin errores, eficiencia y hacer que el código sea más fácil de probar, reutilizar, etc. No solo mejora su código, sino que también mejora la forma en que codifica. Incluso si trabaja con un lenguaje con un paradigma diferente al de la programación funcional, todavía tendrá los conceptos en su mente y los aplicará.

Hay algunos conceptos más para comprender sobre el paradigma de programación funcional, como Currying y Partial Application , por lo que hay mucho más para estudiar en caso de que desee profundizar en este paradigma de programación.

Aquí puede leer un libro de código abierto muy agradable sobre programación funcional en JavaScript y continuar estudiando sobre él.

Conclusión

La programación funcional se está utilizando cada vez más entre los desarrolladores de JavaScript, y en este artículo aprendimos sobre algunos conceptos de programación funcional que hacen que este paradigma realmente brille. Hay una variedad de otros conceptos en la programación funcional, pero al seguir los que se mencionaron aquí, sin duda mejorará su código y sus habilidades.

Comentarios (0)