Próximamente en JavaScript


Mi relación con JavaScript no empezó con buen pie. Hace años aprendí algo del lenguaje más popular del mundo para programar una trivialidad y la experiencia no fue nada edificante, lo que hizo que me alejara de JavaScript para dedicar mi tiempo a lenguajes más atractivos. Por casualidades de la vida que escapan a mi control, he tenido que retomar mi formación en JS y he de confesar que esta vez ha sido menos traumático. La principal diferencia se produce por los cambios introducidos en 2015 cuando publican el standard de referencia ES6 y las posteriores reformas que nos han traído funciones flecha, clases, promesas, async/await y un largo etcétera que hace de JavaScript una herramienta mucho más atractiva. Ciertamente, es lamentable que el lenguaje de programación número uno en el mundo solo se haya puesto las pilas en el último lustro pero le espera un futuro cargado de novedades interesantes entre las que voy a destacar dos que me parecen fundamentales.

Aunque se encuentran en la primera etapa de su desarrollo, estoy seguro de que vamos a poder disfrutar de pipes y placeholders en el corto plazo. El comité técnico 39 de Ecma se encarga de revisar las propuestas que cualquier candidato puede plantear y publica todo el proceso para conocer los objetivos que persigue JavaScript. Si bien hay algunas que no me interesan, como la introducción de decoradores, que potenciarían la orientación a objetos del lenguaje y lo acercarían a dialectos como TypeScript en los que ya es una realidad, es importante estar informados para tomar las decisiones de diseño y planificación de software más inteligentes.

El operador pipeline |> es una gran propuesta para cualquier lenguaje por la utilidad demostrada en la última mitad de siglo. Como dijo Brian Kernighan: “los pipes son la quintaesencia de Unix”. Mi experiencia al respecto no se centra en el shell donde su uso es evidentemente imprescindible. Los pipes son herramientas potentísimas en cualquier entorno de desarrollo. Recuerdo cuando empecé a utilizarlos en R mediante la librería magrittr del tidyverse. En ese momento tuve una revelación y adquirí el convencimiento de que deberían formar parte de todos los lenguajes.

Por ejemplo si tenemos las siguientes funciones

function doubleSay (str) {
	return str + ", " + str;
}
function capitalize (str) {
	return str[0].toUpperCase() + str.substring(1);
}
function exclaim (str) {
	return str + '!';
}

y quisiéramos componerlas de forma que el resultado fuese

let result = exclaim(capitalize(doubleSay("hello")));

se aprecia claramente que esta no es la sintaxis más inteligible. Los pipes permiten un estilo de programación más funcional mediante lo que podría considerarse un postfijo. Cualquiera acostumbrado a trabajar en Bash podría traducir inmediatamente estas funciones anidadas

let result = "hello"
	|> doubleSay
	|> capitalize
	|> exclaim;

El segundo operador está íntimamente relacionado con la anterior propuesta. Resuelve el problema producido al tener funciones con más de un argumento. Como señalan en la documentación, si partimos del código

function double (x) { return x + x; }
function add (x, y) { return x + y; }

function boundScore (min, max, score) {
	return Math.max(min, Math.min(max, score));
}

let person = { score: 25 };

tendríamos que utilizar una función flecha para ir conectando los distintos tramos

let newScore = person.score
	|> double
	|> (_ => add(7, _))
	|> (_ => boundScore(0, 100, _));

Esta es una solución tan frágil que personalmente preferiría no usar pipes en este caso concreto. Afortunadamente, el operador placeholder ? soluciona este problema sin mayor complicación, indicando el lugar que debería ocupar el valor desplazado a lo largo de la función anidada

let newScore = person.score
	|> double
	|> add(7, ?)
	|> boundScore(0, 100, ?);

Es más difícil explicarlo que entenderlo con estos ejemplos que aparecen en las propuestas. Estoy impaciente por incorporar estos conceptos a todo el código que escriba en JavaScript.