JavaScript Rudo: Paradigma Funcional
Olvidémonos de lo clásico y seamos vanguardistas. Lo funcional resurge como el ave fénix en la blockchain y aplicaciones modernas, aprendamos de funciones puras, pongamos algunas bases firmes y lleguemos a steem-js de una vez por todas.
¿Porqué Programación Funcional?
Antes que nada dejaré claro que no perderé tiempo en explicar cuestiones que de sobra se pueden encontrar en las fuentes que dejaré en las referencias de este post. Pero si pondré lo que a mi parecer es notable sobre JS para trabajar con librerías interesantes que pueden ayudarnos a solucionar problemas sin la necesidad de crear todo un sistema web, por ejemplo enlazar steem-js con discord-js, o realizar algunas operaciones sencillas de automatización, pero programando con un estilo moderno y conveniente.
Aclarado esto les cuento que diferentes paradigmas de programación han surgido en la historia de la computación. El más dominante y que se aprende en la mayor parte de cursos universitarios es la Programación Orientada a Objetos (POO), un paradigma es una filosofía, estilo o manera de realizar algo que implica respetar sus normas, convenciones y forma de atacar un problema.
Han habido otros paradigmas para programar, entre ellos el de nuestro interés, el Paradigma Funcional, que ocurrió antes que POO, pero que pasó de moda y cuando parecía morir!!, ocurrió que el Internet dejó de ser un bebé y llegó la Big Data, Inteligencia Artificial, Computación paralela y ahora la Blockchain. Y como en las películas de acción, antes de que el mundo se volviera insostenible y colapsara, recurrieron a un viejo lobo de mar retirado, si señor!, la Programación Funcional.
¿Qué es Programación Funcional?
Primero decir que la definición está basada en en mismo concepto de función matemática. Recordar:
F(X) = X + 1
Significa que hay una función F que toma a X como argumento y nos regresa a cambio el resultado de X incrementada en una unidad.
Ahora hay cuestiones clave en esta inofensiva expresión:
- Una función siempre debe tomar argumentos, al menos uno.
- Una función siempre debe devolver un valor.
- Una función actúa solamente sobre sus argumentos o parámetros que recibe (en este caso X), nunca sobre el mundo exterior.
- Para una entrada X habrá una y solo una salida (en el ejemplo X +1). Pueden haber salidas iguales para diferentes entradas, pero cada entrada tiene una única salida, nunca salidas diferentes.
Trasladando estos conceptos a código JS, vamos a crear una función de manera moderna, lo clásico es bueno, pero en este caso es mejor lo nuevo:
var f = ( x ) => {x + 1}; //notar la forma, x es la entrada o argumento
//y lo que esta entre llaves es la salida
f(100); // Nos devolverá 101!!!
sin paréntesis y llaves también funciona, pero es bueno dejar marcado de forma visual la entrada y la salida
Esta es una Función Pura porque para dar su salida o resultado solo depende de x, ahora veamos un contra ejemplo:
var a = 1
var f = (x) => {x + a}; //notar que la variable a es externa a la función
f(100); // Nos devolverá 101 también!!!
funciona igualmente y en otros paradigmas es correcto, pero no en el Funcional
A continuación una definición formal de Paradigma Funcional:
Programación Funcional es un paradigma en el cual creamos funciones que para su rutina necesita solamente de su entrada. Esto asegura que una función, cuando es llamada varias veces, regresará el mismo resultado, siempre. La función tampoco cambia datos externos a ella. Esto deja un código almacenable y testeable.
Funciones vs Métodos
var funcionIdentidad = ( x ) => { x }; //función facilita
funcionIdentidad(99); // ver que al usarla la invocamos por su nombre y devuelve 99
var objeto = { funcionIdentidad : ( x ) = { a } };
objeto.funcionIdentidad(99); // devuelve 99, pero la usamos dependiendo del nombre del objeto
Los objetos son parte de la POO y en lugar de funciones, usa métodos, pero no siempre respetan lo Funcional
Transparencia Referencial y Funciones Puras
Todas las funciones regresan el mismo valor para la misma entrada y solo depende de dicha entrada, no modifican ni dependen de datos externos. Eso favorece los trabajos en paralelo y el almacenamiento de caché porque bajo otros paradigmas, se suelen hacer bloqueos a la ejecución del código por tener que esperar información externa a sus funciones y métodos, lo que implica trabajar con hilos y es un problema averiguar cual de todos los procedimientos causan errores a estos datos globales o compartidos.
Además podemos sustituir sin problema una función, por el valor que devuelve, dentro del código:
var funcionIdentidad = ( x ) => { x }; //función facilita
var suma = (a, b) => { a + b }; //simple suma de dos números
funcionIdentidad(1); // ver que al usarla la invocamos por su nombre y devuelve 1
suma(2,3) + funcionIdentidad(1); // nos dará 6
suma(2,3) + 1; //También da 6 y notar que esto se llama modelo de sustitución
Una función es pura si regresa el mismo valor para una entrada determinada, esto nos permite y facilita el testeo de código mejor que en otros paradigmas.
Imperativo, Declarativo y Abstracción
La programación funcional se realiza mediante un estilo declarativo y abstracto. Primero veamos un ejemplo imperativo de pensar:
var nums = [ 1, 2, 3 ];
for( i = 0 ; i < nums.length ; i++ );
console.log( nums[i] ); //imprime 1, 2, 3
Notar que en cada momento se le dice "cómo" queremos que realice cada cosa, desde que hay un arreglo de números, los tienes que recorrer desde el primero, hasta el último e ir imprimiendo uno a uno.
Ahora veamos la solución declarativa:
var nums= [ 1, 2, 3 ];
nums.forEach( ( elemento ) => console.log( elemento ) ); //imprime 1, 2, 3
Notar que el "cómo" quedó oculto por la función forEach, a eso se le llama abstracción y es declarativo porque solo le pedimos el "Qué", no damos instrucciones una a una como en el modo imperativo.
¿Porqué usar Programación Funcional con Steem-JS?
Primero veamos la librería de steem-js:
Solo son un par de ejemplos, pero el resto tienen el mismo patrón común, son puras funciones!!!
Instalación de steem-js
Primero nos vamos a instalar NodeJS, en el sitio se encuentra todo lo necesario para dejarlo en cualquier sistema operativo que se necesite, este programa es:
"...un entorno de ejecución para JavaScript construido con el motor de JavaScript V8 de Chrome. Node.js usa un modelo de operaciones E/S sin bloqueo y orientado a eventos, que lo hace liviano y eficiente. El ecosistema de paquetes de Node.js, npm, es el ecosistema mas grande de librerías de código abierto en el mundo".
Ahora abrimos por ejemplo en Windows 10, una consola con PowerShell de preferencia y ejecutamos:
cd $HOME
npm install steem --save
Para probar que funciona usando tu consola preferida:
node
Esto nos lleva al interprete o consola de nodejs
Dentro de la consola de node poner:
var steem = require('steem');
var imprimErr = (err, result) => {console.log(err, result)};
steem.api.getAccounts([ 'jesuscirino', 'cervantes' ], imprimErr) ;
Listo sería el hola mundo a steem-js, mientras imprimes la información de @jesuscirino y @cervantes!
Resumen
JS no es un lenguaje ni orientado a objetos, ni para programación funcional, pero puede adoptar ambos sin ningún problema e incluso con mucha eficiencia. La tendencia actual de la programación funcional en investigaciones de computación científica es ampliamente utilizado, no así en la industria del software, sin embargo lo académico y la industria empezaron a converger rápidamente.
Todos sabemos que las blockchains usan muchas matemáticas y no son simples de comprender, su programación requiere de medidas poderosas y por ello vimos que este paradigma estrella es ideal para grandes volúmenes de datos, computación paralela, y lo mejor, mantener código de programación se vuelve más fácil y sostenible.
Para mi en lo personal me viene a la medida porque siempre he querido crear alguna aplicación usando alguna blockchain, pero basta ver que los creadores exitosos de estas tecnologías usan lo último, ejemplo Ethereum usa el nuevo lenguaje de programación de Google, Go!. La razón es que es moderno y adaptable al futuro. También es cierto que algo complejo y extenso es difícil de mantener, y cuando eres un programador solitario, es mejor poder abstraer tu código en tamaño y testearlo rapidamente, sin perder tiempo en buscar y buscar la razón de un bug entre líneas y líneas de archivos y archivos.
- https://www.w3schools.com
- Aravinth, A. (2017). Beginning Functional JavaScript. Tamil Nadu, India: Apress.
Amigo haces que lo que explicas de programación parezca cosas de niños. admiro tu facilidad para explicar y facilitar que otros entiendan sobre tu especialidad. Felicitaciones
gracias @joslud, realmente iré creando una serie de rutinas en cada post, para otro proyecto con el que quiero probar suerte, y al menos si el proyecto no me sale, por lo menos quiero compartir mis avances, quizá a alguien le guste o con una mejor imaginación lo logre.
Buenas @jesuscirino, este post se ha votado a través del Proyecto Cervantes 'Posts de Calidad'. Un saludo.
excelente! me gustó el análisis. Y sí, es un nuevo paradigma. Yo aún estoy muy aferrado a la programación orientada a objetos, pero ya he empezado a hacer cosas con steem-js como el steem activity
wow amigo revisé steem activity y es muy muy bueno, yo la verdad soy un necio de la consola, imagínate me niego a usar sublime-Text en su lugar sigo usando Vim, y apenas comencé a usar un windows, pero aprender a desarrollar en la web no es fácil y pues felicidades por tu trabajo.
Gracias