Patrones de Diseño y JavaScript: Module

Este pattern propio de Javascript, es una forma de encapsular una lógica específica dentro de un contexto privado, del cual se pueden exponer o no ciertos atributos.

Su funcionalidad se ve reflejada en el uso de una funcion anónima, mediante la cual crea un contexto interno para mantener la lógica privada.

En su forma más básica permite ejecutar código sin contaminar el contexto en el cual se ejecuta:

// Creamos una funciona anonima y la ejecutamos
(function() {
	// variable privada
	var privateVar = 1;

	// metodo privado
	function show() {
		alert(privateVar);
	}

	// todo es ejecutado sin dejar rastro
	show();
// este ultimo par de parentesis ejecutan la expresión anterior,
// nuestra funcion anonima
})();

De igual manera, se puede “publicar” un objeto privilegiado* que contenga visión parcial o total de los elementos privados generando un clousure. Esta publicación se puede dar mediante el retorno de la función o la modificación de un objeto externo.

*Nomenclatura originalmente usada por Douglas Crockford para denominar a funciones con visibilidad justamente privilegiada sobre los elementos de un clousure.

/*
 * Generamos un objeto con una variable privada y su
 * getter/setter mediante el return de la funcion
 */
var myAPI = (function() {
	// private
	var value = 0;

	// devolvemos un objeto con metodos privilegiados
	return {
		set: function(v) {
			value = v;
		},
		get: function() {
			return v;
		}
	}
})();

myAPI.get(); //0

/*
 * Logramos el mismo resultado mediante la modificacion
 * de un objeto externo
 */
var myAPI;

(function() {
	// private
	var value = 0;

	// Modificamos el objeto myAPI con los metodos privilegiados
	myAPI = {
		set: function(v) {
			value = v;
		},
		get: function() {
			return v;
		}
	}
})();

Si bien este pattern puede parecer la solución para la falta de propiedades privadas del lenguaje, es importante notar que la lógica encapsulada queda inaccesible para posteriores modificaciones externas (por ejemplo un decorator sobre un setter).

EDIT:

Ejemplo de otro caso de uso del pattern es esta porción de código de la librería Prototype.js, en el cual se usa el module (o clousure en este caso) como acceso rapido a una variable (Element._attributeTranslations.read.values se convierte en v):

(function(v) {
    Object.extend(v, {
      href: v._getAttr2,
      src: v._getAttr2,
      type: v._getAttr,
      action: v._getAttrNode,
      disabled: v._flag,
      checked: v._flag,
      readonly: v._flag,
      multiple: v._flag,
      onload: v._getEv,
      onunload: v._getEv,
      onclick: v._getEv,
      // ... mas propiedades
    });
})(Element._attributeTranslations.read.values);

Leer más:

Shortlink: http://goo.gl/Mqzwz

 



Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Comment

You may use these tags : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>