Una sinfonía en C#

Un pequeño aporte a la comunidad de habla hispana.

Patrones útiles en Javascript: Module

Esto es el principio de una serie de posts que podemos llamar “back to basics” o “es bueno saber esto para la vida en general” o “no cazo una en javascript”, como sea, la idea es ir un poco más allá del punto en que el uno es un programador backend y hace Javascript porque lo tiene que hacer y como la sintáxis es similar a Java, C o C# más o menos me las rebusco.

Por ellos veremos algunas “cositas” y particularidades de Javascript y algunos de los patrones que podemos usar para que nuestro código no sea una bolsa de funciones tiradas sin más relación.

Ya he hablado en este blog hace unos años sobre algunas cosas básicas de Javascript como:

Justamente de esto último vamos a hablar hoy, o mas o menos…

El patrón Module

Bien, todos sabemos que hasta hoy no es posible definir niveles de visibilidad en Javascript, es decir, declarar algo como privado y si bien en versiones futuras se podrá no siempre tenemos la suerte de que quienes vayan a usar nuestra aplicación usen un navegador de última generación y lo mismo, no contamos con esa capacidad, pero es posible definir un ámbito de visibilidad acotado para nuestro código, cómo? usando el patrón module.

Básicamente es una función autoejecutable que tiene esta forma

var prueba = (function(){
    // esta variable no es visible fuera de este módulo
    var variablePrivada1 = "hola ";
    // esta función tampoco es visible fuera de este módulo
    var funcionPrivata = function(nombre){
        return variablePrivada1 + nombre;
    };

    // declaramos que esta función retorn un objeto con un único miembro
    // llamado "saludar" que apunta a la función privada "funcionPrivada"
    return {
        saludar: funcionPrivata
    };
})();

Este código es una función autoejecutable, cuyo resultado queda en la variable prueba, ya que la función tiene declaraciones que no son visibles desde el exterior (como variablePrivada1) y al ejecutarse automáticamente, es decir, una vez que el intérprete de Javascript pasa por estas líneas llega a los paréntesis finales y ejecuta la función dejando en la variable prueba lo que la misma retorna, un objeto que no tiene más que un miembro llamado saludar que apunta a la función funcionPrivada.

De este modo ni la variable ni la función son visibles, lo único que quien consume la variable prueba ve es un objeto con una miembro saludar que acepta un parámetro y podemos invocar, el resto está protegido.

Haciendo simplemente

prueba.saludar("Leonardo")

Invocamos el objeto y llamamos a la función privada a través del punto público que nosotros decidimos, de esta manera conseguimos que ciertas partes de nuestro código sean privadas. Además de la elegancia no llenamos todo de cosas públicas, que en caso de trabajar sobre algo ya existente puede generar problemas de “pisar” cosas existentes o que alguien pise las nuestras.

Cumplir con los principios SOLID

Con este simple ejemplo (a pesar de no ser programación orientada a objetos) podemos cumplir con algunos de los principios SOLID

  • Responsabilidad única
  • Principio Abierto / Cerrado (en este caso solo hemos “cerrado)

Si quisiéramos dejar abierto nuestro código para que sus dependencias pudieran ser inyectadas no tenemos más que pasarlas a parámetros, por ejemplo:

var consoleWritter = (function(){
    return {
        write: function(s){
            console.log(s);
        }
    };
})();

var prueba = (function(writter){

    var variablePrivada1 = "hola ";
    var funcionPrivada = function(nombre){
        writter.write(variablePrivada1 + nombre);
    };

    // declaramos que esta función retorn un objeto con un único miembro
    // llamado "saludar" que apunta a la función privada "funcionPrivada"
    return {
        saludar: funcionPrivada
    };

})(consoleWritter);


prueba.saludar("Leonardo");

En este ejemplo declaramos un consoleWritter (que no es más que un wrapper a console.log) y lo inyectamos por medio de parámetro de la función autoejecutable que retorna nuestro objeto prueba, de esta manera hacemos que el objeto prueba no sepa quién se encarga de escribir el mensaje y cumplimos con el principio abierto/cerrado de SOLID y de paso con la inversión de dependencias.

Dejo un link con los dos ejemplos de código en github.

Nos leemos.

Loading