Introducción a la programación funcional con JavaScript

logo

Introducción a la programación funcional

Con este post pretendo dar pie a una serie de articulos sobre progracion funcional en javascript, mostrar sus ventajas frente a otros paradigmas como la programacion imperativa y como podemos sacarle el maximo provecho utilizando javascript como lenguaje funcional.

Pero antes de empezar, que es eso de programacion funcional?

La progracion funcional es simplemente otro enfoque a los problemas comunes del codigo, es otra forma de pensar sobre el codigo utilizando bases matematicas bien definidas y ampliamente probadas. En progracion funcional no necesitamos decirle a la computadora como tiene que hacer las cosas sino que simplemente le tenemos que decir que es lo que queremos obtener, no como obtenerlo. Pongamos un ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var users = [
{name: "carlos", age: 21 },
{name: 'marcelo', age: 30},
{name: 'mikaela', age: 25},
{name: 'cecilia', age: 37},
];
var getUsersName = function(users) {
var _names = [];
for (var i=0; i < users.length; i++) {
_names.push(users[i].name);
}
return _names;
}
var names = getUsersName(users);
console.log(names);

Este codigo te suena conocido?, pues es algo muy comun de hacer bajo la mano opresora de la programacion imperativa, lo que hacemos aqui es simplemente obtener la propiedad nombre de una lista de usuarios. Ahora una pregunta ¿Te ha sido facil saber que hace la funcion con solo darle un vistazo?. pues a mi francamente no. Como vemos el objetivo es simple, pero al estar programado de modo imperativo implica que tengamos que decirle paso a paso como obtener el resultado inflando asi el codigo mas de lo necesario. Basicamente lo que estamos diciendole aqui es:

  1. genera una funcion llamada getUsersName que acepte una lista de usuarios como argumento.
  2. declara un array llamado _names que este vacio
  3. itera sobre cada elemento de la lista de usuarios.
  4. por cada usuario obtene la propiedad name y agregala al array _names
  5. retorna el array _name.

¿no te parece demasiado lio para obtener simplemente una propiedad?. Veamos como podemos lograr lo mismo usando la programacion funcional:

1
2
nombres = users.map(function(user) { return user.name });
console.log(nombres);

¿que estamos diciendole aqui?, dada una lista de usuarios, quiero el nombre de cada uno.

Fijemonos en la diferencia. La version imperativa es mas similar a una receta de cocina donde debemos decir en cada paso lo que hay que hacer para lograr el objetivo, en cambio en la version funcional pareciera mucho mas sencillo entender a primera vista lo que hace, de la lista de usuarios, dame la propiedad name.. Parece algo tonto pero tiene mucho ese cambio de expresion, una cosa es decir lo que queremos y otra como lo queremos. Esa forma de programar se conoce como programacion declarativa ¿porque?, pues porque declaramos lo que queremos obtener, no como queremos que haga para obtenerlo.

Al contrario que la progracion imperativa, la programacion funcional tiene fuertes raices matematicas que analizaremos en su momento (no te preocupes que no es nada complicado), la cual dota al codigo de unas cuantas propiedades matematicas utiles.

¿Es cierto que no se usan variables en la programacion funcional?.

Pues no, si se utilizan variables pero no como las entendemos en imperativo, las variables en funcional las podemos entender como constantes que al tomar un valor lo mantiene durante toda la ejecucion. Si analizamos una vez mas la funcion anterior podemos ver como las variables i y name van cambiando su valor a lo largo de la ejecucion.

1
2
3
4
5
6
7
var getUsersName = function(users) {
var _names = [];
for (var i=0; i < users.length; i++) {
_names.push(users[i].name);
}
return _names;
}

Esto en funcional no esta permitido, de echo en lenguajes de programacion funcionales puros no existe el for ni el while ni nada parecido, pero hablaremos de ello mas adelante. Lo interesante es que las variables si las podemos usar pero siempre intentando reducirlas al minimo y nunca pero nunca usarlas de forma global.

Las funciones

En funcional, las funciones deben de ser cortas y hacer una sola tarea (de echo lo ideal seria comenzar cada funcion con un return), la idea detras de esto es la reutilizacion la cual como veremos mas adelante brilla por su presencia en la programacion funcional, ademas se intenta mantener las funciones “puras”, ¿que significa eso de “puras”?, lo explico por encima pero lo veremos en mas detalle en proximos articulos.

Una funcion pura es aquella que dada los mismos argumentos de entrada siempre produce la misma salida, tampoco depende del estado del sistema y no produce efectos colaterales como pueden ser mostrar algo en la consola, o guardar un registro en una base de datos, etc… ¡tranquilo si podemos usar esas funciones pero de otra manera!.

1
2
3
4
5
6
7
8
var _names = [];
var getUsersName = function(users) {
for (var i=0; i < users.length; i++) {
_names.push(users[i].name);
}
return _names;
}

Si miramos nuesta funcion getUsersName (modificada) vemos que es impura porque depende del estado general del sistema, en este caso del array _names definido fuera de la funcion, si necesitaramos poder referenciar ese array, deberemos pasarlo como argumento.

Por ahora eso es todo, este post no pretende explicar ni por encima la programacion funcional, sino que prentende ser lo que es, una introduccion a una serie de futuras publicaciones sobre programacion funcional en javascript que espero sean de tu agrado.

Comentarios