Como programadores necesitamos que nuestro código sea eficiente. Para ello, no solo es suficiente garantizar su funcionamiento, también requerimos que sea legible y comprensible de un vistazo. Esto también sucede con Javascript.
Para lograrlo, podemos recurrir a diversas herramientas de la programación funcional que nos permitan usar un paradigma declarativo para que en pocos pasos llevemos a cabo nuestro cometido.
Si usamos un estilo imperativo para nuestros bucles tendremos que escribir muchos pasos y obligar a nuestros compañeros de equipo a que usen su valioso tiempo en interpretar nuestras intenciones, por eso veremos algunas herramientas para simplificar nuestro código y evitar procedimientos innecesarios.
Problemas iniciales de Javascript
Este lenguaje reúne una serie de características que lo hacen apropiado para un público inicial, su facilidad de uso y dinamismo en ocasiones pueden generar código que muchos definen como espagueti: básicamente es una estructura de control de flujo compleja e innecesaria, difícil de comprender y enredada, como un plato de espaguetis.
Afortunadamente, tenemos herramientas que nos pueden ayudar a evitar el conflicto anteriormente descrito, uno de ellos es abordar el problema desde un punto de vista declarativo, es decir, podemos indicar al compilador o en el caso de Javascript, el intérprete, que queremos que haga, en lugar del cómo.
Veamos un ejemplo de una fracción de código que podemos mejorar. Es un bucle simple donde agregamos un elemento a una colección desde otra inicial, siempre y cuando el elemento de la colección inicial sea un número par:
Aunque el código anterior funciona, necesitamos una serie de pasos descriptivos e innecesarios que aumentan la complejidad del mismo.
Primeramente tenemos que determinar si el bucle está correctamente inicializado, que el bucle tenga un límite de iteraciones (10) y que realmente agregue el elemento correcto cuando requerimos un número par.
Ahora veamos la misma fracción de código abordada desde un paradigma funcional:
Acá, simplemente hemos reducido a la mitad la cantidad de líneas de código requeridas para ejecutar la misma funcionalidad del bucle for.
Ahora veamos algunas de estas herramientas o funciones que nos ayudan a crear código mantenible y mejor organizado, todas ellas entran en la categoría de funciones de orden superior, por que reciben otras funciones como argumentos, devolviendo resultados dependientes del proceso requerido.
Map
Esta es una función muy común en el ámbito del los lenguajes funcionales, simplemente se encarga de aplicar otra función a cada valor sobre una colección dada, produciendo una nueva colección de elementos transformados.
Requiere dos argumentos, el primero es la función callback que se encargará de producir un nuevo elemento para la colección final, el segundo argumento es opcional.
La función interna o callback puede recibir tres parámetros:
- Valor: El elemento actual de la colección que se está procesando.
- Índice: El índice del elemento actual dentro de la colección.
- Colección: La colección sobre la que se llama map.
Por lo general, solo necesitamos el primer parámetro para que funcione.
Ejemplo:
Deseamos sumar un valor a cada elemento en una colección de valores.
Reduce
En ocasiones necesitamos obtener un valor que sea el resultado acumulativo de aplicar una función sobre todos los elementos de una colección, para ese fin podemos recurrir a reduce.
Requiere dos argumentos, la función callback y un elemento que fungirá como inicial.
La función interna o callback puede recibir cuatro parámetros:
- Acumulador: El elemento resultado de la iteración anterior, el primer valor será el segundo argumento de reduce.
- Valor: El elemento actual de la colección que se está procesando.
- Índice Actual: El índice del elemento actual de la colección que se está procesando.
- Colección: La colección sobre la que se llama reduce.
Ejemplo:
Imaginemos que necesitamos obtener el total de dinero que se paga en salarios para un determinado departamento dentro de la empresa.
Filter
El método filter nos permite filtrar los elementos de una colección dada, devolviendo otra colección con la aplicación de la función callback.
Toma dos argumentos, el primero es la función que se encargará de filtrar, comprobando una condición para determinar si debe formar parte de la colección resultado, el segundo argumento es opcional, es el valor a utilizar como this cuando se ejecuta la función callback.
La función interna o callback puede recibir tres parámetros:
- Valor: El elemento actual de la colección que se está procesando.
- Índice: El índice del elemento actual dentro de la colección.
- Colección: La colección sobre la que se llama filter.
Ejemplo:
Recurriendo a nuestro ejemplo original, necesitamos obtener los números pares de una colección de 10 elementos.
Combinar funciones
Como te podrás imaginar, es posible combinar dos o más de estos métodos para generar resultados compactos y fáciles de mantener.
Ejemplo:
Ahora, supón que necesitamos mapear un bono a cada empleado del departamento de ventas, pero filtraremos por rendimiento y finalmente obtendremos un resultado total de los salarios más los bonos.
Conclusión
Realizar una aplicación eficiente requiere de un equipo profesional y capacitado, con experiencia en el ramo que pueda brindar una solución acorde a las necesidades de cada cliente.
G&L posee el personal que necesitas para que tu empresa dé los resultados óptimos y sea productiva a lo largo del tiempo.