#2 - Programación Funcional - Funciones de Primera Clase y Funciones de Orden Superior

Ronaldo B.1 de agosto de 20225 min de lectura

Funciones de Primera Clase - First Class Function

La Programación Funcional es un paradigma de programación que permite utilizar recursos provenientes de la matemática y trabajar con sistemas escalables que evitan efectos secundarios, muchos lenguajes de programación son totalmente funcionales o multiparadigma. Esta serie muestra cómo utilizar los conceptos de Programación Funcional en JavaScript

Antes de continuar, tal vez considere leer el primer artículo de la serie que trata sobre el concepto de PF y nos prepara para esta serie, en el artículo de hoy vamos a exponer técnicamente las Funciones de Primera Clase:

  1. https://bit.ly/3ecrRZk - Programación Funcional - ¡Todo lo Que Necesitas Saber! Artículo 1 de 10

¿Qué son las Funciones de Primera Clase?

Uno de los recursos de la programación funcional presentes en JavaScript son las Funciones de Primera Clase, esto es posible porque en JavaScript las funciones también se tratan como Objetos de Primera Clase, esto significa que podemos tratar funciones como valores, y almacenarlas en variables y constantes, pasar funciones como parámetros en otras funciones e incluso tener funciones como retorno de otras funciones. Esto abre un abanico de posibilidades en varios Patrones de diseño (Design Patterns), tales como Funciones de Orden Superior (High Order Functions), callback entre otros recursos, y se vuelve indispensable cuando trabajamos con bibliotecas que utilizan el paradigma de la programación Funcional como Lodash, RamdaJS o incluso React.

Almacenando como valores en variables y constantes

Uno de los recursos de la función de primera clase, también conocida como ciudadano de primera clase, es el recurso que permite almacenar la función como valor de una constante o variable, en JavaScript las funciones ya son objetos como otros tipos de datos.

En el ejemplo a continuación creamos la función cl una abreviatura para console.log, posteriormente asignamos a la constante escribe con la función cl, a partir de ese momento, podemos llamar a la constante escribe como una función de primera clase.

function cl(x) {
    console.log('console:' + x);
}

const escribe = cl;

escribe('Función como valor de una constante');

La función cl se asigna a la constante escribe.

Función de Orden Superior - High Order Function

Pasando una función como parámetro de otra función

Pasar una función como parámetro permite crear funciones de orden superior, en el ejemplo a continuación, la función retorna, recibe una función como parámetro, esta función puede ejecutar cualquier operación, dentro de la función retorna, podría ser llamada en cualquier momento, además de ser retornada como fue en el ejemplo.

Las funciones que se pasan como parámetro permiten reutilizar códigos más pequeños con lógica simple para componer lógicas más elaboradas, y aún así mantener el alcance y evitar efectos secundarios.

function cl(x) {
    console.log('console:' + x);
}

const escribe = cl;

escribe('Función como valor de una constante');

function retorna(fn){
    return fn
}

let exibe = retorna(escribe)

exibe('Pasando una función escribe como parámetro y retornando una función')

Es posible llamar a una función que fue asignada a una variable, y ejecutarla en otro contexto.

Almacenando funciones en una estructura de datos

Además de almacenar las funciones como valores de una constante o variable, también es posible asignar esta función como un índice de un array, y apuntar el índice de este array ejecutando esta función, e incluso pasando parámetros.

En el ejemplo a continuación creamos el array acciones almacenando dos funciones, una vez más el poder de las funciones de orden superior, así es posible llamar a la función cl y pasar el parámetro para ejecutar, o incluso almacenar la función con la llamada de parámetro, y luego solo referenciarla como en el caso de la segunda posición con la función exibe.

. //código anterior
.
.
let acciones = [cl, exibe('\nExhibiendo: llamando dentro de un array')]
acciones[0]('Exhibiendo la función cl dentro del array')
acciones[1]

A continuación el código completo, con el fragmento anterior al final del código.

function cl(x) {
    console.log('console:' + x);
}

const escribe = cl;

escribe('Función como valor de una constante');

function retorna(fn){
    return fn
}

let exibe = retorna(escribe)

exibe('Pasando una función escribe como parámetro y retornando una función')

let acciones = [cl, exibe('\nExhibiendo: llamando dentro de un array')]

acciones[0]('Exhibiendo la función cl dentro del array')

acciones[1]

Ya hemos utilizado funciones como paso de parámetros innumerables veces, como es el caso de los ya conocidos callbacks, también cuando pasamos Arrow Functions como parámetros, estamos trabajando con funciones de orden superior.

En el siguiente ejemplo vemos el comando setTimeout() que recibe una función como parámetro, y un tiempo en milisegundos que debe ser respetado antes de ejecutar el código. en este caso, estamos pasando el tiempo en segundos como parámetro, que será convertido en milisegundos.


const timeout = (seg) => setTimeout(() => cl(`Esperando ${seg}s`), parseInt(seg) * 1000);

timeout(5)

High Order Function en la práctica.

Quizás ya te hayas dado cuenta de que ya utilizas algunos recursos de la programación funcional, sin saber que pertenecían a este paradigma de programación, pero lo genial de la Programación Funcional es además del uso consciente, el uso en conjunto con otros recursos de la Programación Funcional, como la programación declarativa, inmutabilidad y mucho más.

En el próximo artículo continuaremos aprendiendo nuevos recursos de la programación funcional, si te gustó comparte con tus amigos este artículo, y recuerda que tenemos un Curso Completo de JavaScript sensacional donde abordamos muchos recursos del lenguaje en proyectos reales, y si ya conoces JavaScript te invitamos a conocer nuestro Curso Completo de NodeJS que está imperdible.

¡Nos vemos en el próximo artículo! ¡Hasta entonces!

Glaucio Daniel

Sigue aprendiendo con Hcode

Regístrate en la plataforma de cursos y sigue las próximas guías del blog.