Lenguajes de programación

A la hora de elegir un lenguaje de programación no es suficiente mirar la sintaxis o el grupo de probemas que resuelve. Eso hay que mirarlo por supesto, pero (enfasis en el) no es suficiente.

Yo tuve un profesor que decía:

Yo tuve un profesor que decía: En quince días se puede aprender cualquier lenguaje.

– Mi profesor que decía cosas que decía su profesor –

Y estoy completamente deacuerdo. Alguien que ya programe puede aprender la sintaxis y «tirar lineas» en dos semanitas. Pero eso no es suficiente.

Creo que hay 3 patas para todo lenguaje (igual si mañana pienso que hay más escribiré otro post) que tambien hay que tener muy en cuenta a la hora de elegir lenguaje:

  • Sintaxis
  • Librerias (Bibliotecas)
  • Comunidad

Todas igual de valiosas. La sintaxis podria extenderse a los paradigmas que implementa o los patrones que son más «fáciles» de implementar. Alivia la fricción del día a día.

Las Librerías son imprescindibles para llegar lejos rápido. Problemas comunes ya resueltos, si están resueltos no quiero reinventar la rueda (o no deberia de querer aunque me encante).

La comunidad surge de las dos anteriores, pero mejora las dos anteriores. El feedback imprescindible para mejorar, pero no solo eso hace una comunidad, tambíen mejora la sintaxis y las librerías (así como crea nuevas con menos fricción, bueno … el software libre es marabilloso). Así como para hacer preguntas y responderlas a problemas más comunes; en Stackoverflow y «foros» varios. Con estos se alimentas las IAs que escriben código.

Babel Types by example

BabelJS es una herramienta que siempre me ha interesado. Originalmente 6to5, transformaba Javascript «nuevo» en Javascript «antiguo». Esta era su funcion principal para que la tarea del desarrollador no fuese tan dura al tener que duplicar implementación y aun así soportar navegadores menos actualizados (todos sabemos de quien estamos hablando …).

BABEL

Desde eso ha llovido mucho. Hoy soporta Typescript, JSX y la casi por nadie utilizada sintaxis de Flow. Así como una millonada de plugins disponibles en npm hacen que desarrollar con tu sabor favorito de JS sea más fácil que nunca.

Para progamar un plugin de Babel la propia librería esta dividida en distintos paquetes para ayudar al desarrollo. Aunque para ello tienes que conocer bien la sintaxis de JS, así como las otras sintaxis que también soporta.

Una función es una pieza de código que puede ser llamada en otra parte invocandola con parentesis.

function foo() {
    // 
}

const bar = function () { /* ...*/ }

const biz = () => 24;

Pero no es lo mismo si esta función está declarada directamente, o asignada a una variable, o asignada a una variable y además es una arrow function.

El analizador sintactico (parser) de babel transforma el codigo a una estructura de árbol para transformarla más fácilmente. Este árbol es simplemente un objeto con otros objetos anidados. La estructura se puede visualizar muy bien en ASTExplorer, que es un proyectazo muy util para entender lo que pasa por detrás de la transpilación.

Y aquí llega la parte aun más interesante. El tipo de objeto creado para repesentar una función será una FunctionDeclaration, pero si la estamos asignando es un FunctionExpression. Y bueno para la arrow function es una ArrowFunctionExpression.

Porque sí, no son lo mismo, el programa no sería representado de una manera unívoca si no tuviesemos estos distintos tipos. Todos los tipos que existen en babel están documentados en babel-types, que es el paquete de la librería con funciones para crear y comprobar tipos. Así se facilita mucho el desarrollo de un plugin.

En la documentación oficial explican como se debe usar cada metodo para crear un tipo y que parametros necesita. También si tiene algun alias, si el tipo es de Flow, Typescript o JSX y eso está geniar pero … no es muy didactica.

Para hacer más facil la comprensión de a que se refiere el nombre de cada tipo he publicado una documentación extendida, babel-types-by-example, con uno o varios ejemplos del elemento resaltado en un ejemplo de código.

Documentación de un jsxAttribute en @babel/types by example

Cómo se puede ver, cada tipo es una unidad comprensible por el parser de babel.

Espero que el pequeño «highlight» en cada uno de los elementos sea de ayuda. Para mi, el hecho de encotrar cada uno de los tipos dentro del código está siendo una formación genial en el lenguaje. El proyecto y la documentación de los ejemplos es un trabajo todabía en progreso, pero ya va tomando forma.

No pretende ser una documentación alternativa, ya que el script para generarla se basa en la oficial. Actualmente en versión 7 y pronto en 8 que está en beta. Si el lector tiene feedback sobre el proyecto o quiere contribuir toda ayuda es bienvenida.

La funcion Dolar

Si llevas tocando JavaScript poco tiempo quizá aun no la hayas usado, pero por poco que lleves usando algun framework (biblioteca/libreria) seguro que te suena.
La función $ viene siendo de las más usadas o ampliamente implementadas en cualquier libreria JS para el manejo del DOM.

Que hay del DOM

DOM son las siglas de Document Object Model. La página html que estás viendo se estructura en el navegador como un árbol, en el que cada uno de los nodos del árbol es un objeto. El hecho de que se el navegador controle la página como un grupo de nodos Objeto beneficia al programador que quiere trabajar con esos objetos. Tratando cada elemento como un objeto le podemos asignar propiedades, eliminarlo o crear nuevos dinámicamente.

Cuando modificas un objeto visible del DOM los cambios se ven reflejados en el navegador. Si quieres ver más cosas sobre el DOM puedes ver la gran documentación de Mozilla de cómo Gecko (Motor de renderizado del a fundación Mozilla) implementa el DOM (DOM Gecko). Si cuando hayas terminado con esto te apetece profundizar más y tienes la posibilidad de poner el ‘Modo Dios’ de lectura puedes pelearte con la docu del w3c, que son los que dicen como tiene que ser el DOM (w3c DOM).

Tocando los nodos del DOM

Visto lo visto, si queremos que la página cambie sin recargar nos va a tocar modificar los elementos del DOM en el lado del cliente. Para acceder a un elemento que queremos modificar tenemos que acceder a el como a un objeto que es. Todos los objetos tienen un padre, y el padre de todos (la raíz del árbol) es el documento en si, es decir, el objeto document.

Para acceder al árbol existen distintas funciones. Estas nos permiten acceder al primer hijo, al último o a la lista de hijos y seleccionar el que queremos mediante corchetes:

result = document.firstChild.childNodes.length;//2
result = document.firstChild.childNodes[0];// [object HTMLHeadElement]
result = document.firstChild.childNodes[1];// [object HTMLBodyElement]
result = document.firstChild.childNodes[1].childNodes[n];//[object HTMLDivElement]

Acceder así a los elementos es bastante arido, por eso hay otras funciones que nos acortan el trabajo

Funciones que devuelven un HTMLCollection.

La definicion en IDL es:
interface HTMLCollection {
readonly attribute unsigned long length;
Node item(in unsigned long index);
Node namedItem(in DOMString name);
};

result = document.getElementsByTagName("div");//[object HTMLCollection]
result = document.getElementsByName("nombre");//[object HTMLCollection]
result = document.getElementsByClassName("nombreDeLaClase");//[object HTMLCollection]

Seleccionar por identificador a veces es más comodo porque el id debe de ser único

result = document.getElementById("identificador");// [object HTMLDivElement] porque hemos dado ese id a un div

Si tenemos más de un elemento con el mismo identificador (cosa que no debe ocurrir) hay que tener cuidado. La funcion ‘getElementById’ devuelve un solo Element (de ahi su nombre en singular) así que nos devolverá la primera ocurrencia solamente.

Los corchetes[] molan

La definición en del objeto HTMLColection nos da una interfaz para seleccionar un elemento concreto ya sea por nombre o por identificador, pero los corchetes facilitan mucho la vida del programador. Se puede invocar por nombre, identificador o numero de orden del elemento de la colección que queramos:

var result = document.getElementsByClassName("nombreDeLaClase");
result.namedItem("nombre") === result["nombre"];// true
result.item("identificador") === result["identificador"];// true
result.item(0) === result[0];// true
result.length;// 1

Para acceder a un elemento que esté en la página usamos a la estrella de las funciones de manejo del DOM:

var miElemento = document.getElementById("identificador");

Así tenemos en la variable ‘miElemento’ el elemento/objeto del DOM con id «identificador». No tenemos que sabernos la ruta completa.

Y una vez seleccionado el elemento que queramos podemos acceder a su contenido en formato HTML. Con innerHTML podemos leer y escribir su contenido directamente. Este método no es un estándar de la especificación del lenguaje ECMAScript, pero todos los navegadores lo implementan. Lo inventó microsoft para una de sus primeras versiones del explorer y al extenderse su uso por comodidad, todos los browsers lo impementaron. Tan sencillo como:

result = document.getElementById("identificador").innerHTML;//a

Con todo esto manejamos el DOM a nuestro gusto, pero ¿me estoy saliendo del tema? no. Como hemos visto se puede acceder de distintas formas a los elementos de nuestra página. Por nombre, id, clase o posición en el árbol, pero escribir estas funciones con un nombre tan largo, con nombres tan parecidos para hacer lo mismo y obtener una tipo de objeto un tanto extraño no es muy cómodo para desarrollar.
La función dolar tiene que ver mucho con el manejo del DOM, y es que esta función surge a raíz de esta problemática.

PrototypeJS

En Prototype la funcion $ es la forma acortada de ‘document.getElementById’. En realidad tiene algo más de potencia ya que si le pasamos varios argumentos nos devolverá un vector con esos elementos seleccionados.
Así que devuelve o un elemento o un array con elementos. Ojo, si los elementos no existen en el árbol nos devolverá un array vacio.

Para seleccionar elementos del DOM Prototype viene con el metodo $F que viene a hacer lo mismo que $ pero dirigido a formularios. Como ellos dicen “es un alias comodo de Form.Element.getValue”.

Pero la funcion que realmente aporta ahorro al desarrollador es la funcion doble dolar $$(). El parámetro pasado a esta funcion debe ser un string que contenga el elemento o elementos a seleccionar, pero aqui viene lo bueno, acepta sintaxis CSS. Es decir que si quemos selecciona un elemento que tenga class con valor “miElemento” introducirmos : $$(“.miElemento”). Hasta aquí poca novedad, pero y si queremos seleccionear los elementos de una lista que tnegan class “miElemento”, pues la llamada será así: $$(“li.miElemento”) y así con todo tipo de selectores css http://www.w3.org/TR/css3-selectors/
A diferencia de $, $$ devolverá siempre un vector de Element.

MooTools

En Mootoos encontramos algo parecido en cuanto a funciones dolar se refiere. La funcion dolar está orientada a identificadores y encontramos los selectores CSS en la doble dolar. Contiene los selectores CSS3.
El selector CSS de MooTools se llama Slick. Lo sacaron para la version 1.3 de la librería y mejora en un 50% el selector de la version 1.2. A demás Slick es más rapido que el selector CSS de Prototype en un porcentaje variable pero en todos los navegadores.
Tambien le podemos pasár a la funcion $$ uno o más objetos Element, y devolverá una instancia de Element que los contenga.
Como vemos Dollars de MooTools añade algo más de funcionalidad que el Dollars de Prototype. En MooTools obtendremos de $$ una instancia del objeto Element de MooTools (como en Prototype) pero la mejora está en que acepta no solo cadenas con selectores si no también elementos propios.

jQuery

jQuery es una libreria orientada al DOM, de hecho la funcion $ es un alias de la funcion jQuery. La funcion $ nos devolverá un objeto jQuery que es la que contiene toda las funciones de la librería. Es la forma de trabajar en jQuery, al objeto que tenemos le hacemos lo que queremos.
Pero a la hora de pasarle parámetros, el $ de jQuery es el más versatil.
Acepta selectores CSS, elementos del DOM o arrays de elementos. A demás con los selectores podemos indicarle un contexto en el que seleccionarlo, si es que sabemos donde está lo que buscamos y no queremos que nos devuelva partes que estén más allá de ese ambito.
El selector jQuery es el más rápido de las tres librerías. Pero no solo de selectores vive el hombre. $ de jQuery acepta codigo HTML a pelo. ¿Y para qué? para generarlo dinamicamente. Esto nos permitirá crear partes de la pagina al vuelo para insertarlas donde queramos.
Por si fuera poco $ en jQuery también es un alias del metodo “$(document).ready” (que es como asignar un metodo en “document.onload”). Así que si le pasamos como parámetro una funcion, esta será ejecutada tras la carga completa del documento.
Sin duda es la función Dollar más versátil. Esta librería está orientada a usar el $ y a usar el DOM, de esta manera ahorra muchas lineas de código a los programadores que solo utilicen JavaScript para manejar el DOM, que son la mayoría, por eso está teniendo tanto exito.

Está claro que el $ no da la felicidad, por eso cada cual se lo implementa a su manera. Es el nombre de función más representativo que existe, corto y poco común. Por corto le proporciona ahorro de tiempo en la programación, y lo poco común le proporciona ahorro de tiempo en la lectura del código.
Como en definitiva para una gran proporcion de programadores vienen usando JavaScript para manejar el DOM sin incluir mucha más logica en las aplicaciones JS, el seleccionar elementos (sea estilo CSS o no) el mejor alias para un selector es el caracter Dolar.
Sinceramente, aunque sea para acortar la funcion “document.getElementById” ya es útil. Si como hemos visto le añadimos algunas funcionalidades extra mejor que mejor.

Zepto un mini jQuery

ZeptoJSPensando en que los móviles no tienen mucha capacidad de computo (todo es cuestionable) ni tanto ancho de banda (esto ya suele ser más normal) que los ordenadores personales, ha surgido la idea de minimizar el tamaño de la libreria (biblioteca) más popular de javascript y su nombre es Zepto.
Como jQuery pero en aerogel. Esa es su filosofía, y la verdad es que la parte ajax de la biblioteca la dejan an 39 lineas de código.
Que se reducen sus funcionalidades es algo lógico y normal, pero en realidad las principales y muchos selectores CSS siguen estando.
Las cosas que cambian y con motivo son por ejemplo la detección de UserAgent que la implementa de la siguiente manera:

android = ua.match(/(Android)\s+([\d.]+)/),
iphone = ua.match(/(iPhone\sOS)\s([\d_]+)/),
ipad = ua.match(/(iPad).*OS\s([\d_]+)/),
webos = ua.match(/(webOS)\/([\d.]+)/);

Como veis aunque está pensado para dispositivos móviles está orientado hacia el uso de un navegador con webkit. De hecho todo el apartado de FX de la librería lo solucionan con las directivas de webkit.

$.fn.anim = function(props, dur, ease){
var transforms = [], opacity, k;
for (k in props) k === 'opacity' ? opacity=props[k] : transforms.push(k+'('+props[k]+')');
return this.css({ '-webkit-transition': 'all '+(dur||0.5)+'s '+(ease||''),
'-webkit-transform': transforms.join(' '), opacity: opacity });
}

Me gusta la iniciativa de una versión ‘mini’ o ‘movil’ de jQuery, de hecho en muchas ocasiones no se utiliza la librería en todo su esplendor, cosa que es normal. Pero en el caso de Zepto, que aun va por la versión 0.2 se podria tener en cuenta el resto de navegadores para moviles (como opera mini).