Ejemplo avanzado del patrón módulo con javascript (Module Pattern)

En este tutorial vamos a mejorar nuestra implementación del Module Pattern para tener algo más escalable.

Rodríguez Patiño, Eduardo
3,653 lecturas
Rodríguez Patiño, Eduardo
Hemos migrado hace poco nuestras publicaciones del blog antiguo. Si crees que esta se encuentra incompleta o sin coherencia deja un comentario para restaurarla manualmente.

Bien señores, en la entrada anterior vimos como implementar el patrón Module con Javascript y vimos que es muy práctico y que problamente hagamos uso de este sin darnos cuenta. Lo que vamos a ver ahora es mejorar este, porque la solución anterior no es completamente de mi agrado.

Creando un contenedor de módulos

Hasta ahora hemos visto el concepto en general y su utilidad pero yo quiero que mi módulo sea más escalable que (mantenerlo, actualizarlo, mejorarlo) sea una tarea más sencilla y que un programador nuevo no se le dificulte.

¿Saben cual es el principal problema del ejemplo anterior?, no me gusta que todo el código este escrito en un mismo lugar, eso va a crecer y va a ser horrible mantener más adelante. Entonces hagamos que nuestro módulo se vuelva una fábrica de módulos (una especie de contenedor de módulos).

var Module = (function(){
    var modules = {};
    return {
        create: function(name, credit) {
            if(modules[name] === undefined) {
                modules[name] = {};
            }

            modules[name].credit = function(){
                return credit;
            }
        },
        append: function(name, module) {
            if(modules[name] === undefined) {
                throw 'Module not exists';
            }

            for(var k in module) {
                modules[name][k] = module[k];
            }
        },
        get: function(name) {
            if(modules[name] === undefined) {
                throw 'Module not exists';
            }

            return modules[name];
        }
    }
})();

El ejemplo mostrado es experimental, lo he creado para este tutorial y es una base para que ustedes puedan usar como partida.

¿Cómo registro un módulo?

Module.create('venta', {
    name: 'Venta',
    description: 'Módulo que contiene formulas para trabajar con los montos de la venta',
    version: '1.0'
});

Module.create('financiera', {
    name: 'Financiera',
    description: 'Módulo que contiene formulas para trabajar con las tasas de interés',
    version: '1.0'
});

En este ejemplo he creado 2 módulos y cada vez que creamos un módulo se creará un método adicional para obtener los créditos del módulo.

Agregando comportamiento a nuestro módulo

Module.append('venta', {
    iva: 0.18,
    calcularIva: function(monto) {
        return monto * this.iva;
    },
    calcularMontoSinIva: function(monto){
        return monto / (1 + this.iva);
    }
});

Module.append('financiera', {
    calcularTasaEfectivaAnual: function(capital, interes, periodos) {
        return capital * Math.pow(1 + interes, 2);
    }
});

Listo, ya hemos agregado a nuestro módulo de venta y financiera su lógica de negocio obteniendo así un código más escalable ya que un programador nuevo que quiera extender las funcionalidades del módulo de venta o financiera solo hará esto.

Module.append('venta', {
    calcularUtilidad: function(costo, ingreso) {
        return ingreso - costo;
    }
});

Nuestro código adicionará un nuevo método a nuestro módulo de venta y nuestro nuevo programador evitó la tediosa tarea de comerse tanto código. Esa es la finalidad de los patrónes de diseño, hacernos la vida más fácil.

¿Cómo hago uso de los módulos?

/* Obteniendo el módulo venta */
var venta = Module.get('venta');
console.log(venta.calcularMontoSinIva(1000)); // 847.4576271186442

/* Obtener crédito */
console.log(venta.credit());

/* Obteniendo el módulo financiera */
var financiera = Module.get('financiera');
console.log(financiera.calcularTasaEfectivaAnual(10000, 0.05, 2)); // 11025
¿Te gustó nuestra publicación?
Suscríbete a nuestro boletín