javascript-design-patterns-cover

Module Pattern e privacidade com JavaScript

Pois bem, imagine você trabalhando com uma grande aplicação JavaScript e muitos
desenvolvedores. E você precisa encontrar uma maneira de encapsular seçoes de códigos 
para que eles tenham um namespace privado sem que haja conflitos com o código 
existente.

Como você faria isso? Ora! com Módulos (Module Pattern)

Module pattern usa "funcões imediatas" para criar uma Closure para todo
seu código encapsulado. Você pode ter membros privados e até mesmo publicar APIs publicas

Vamos a um exemplo básico:

var Modulo = (function() {
	var _variavelPrivada = "Esta é privada";
	var _outraVariavelPrivada = "Eu também sou privada";
	public = {}; //Este objeto será retornado.

	function _metodoPrivado() {
		console.log("Este método é privado");		
	};

	public.acessarMetodoPrivado = function(){
		_metodoPrivado();
	};

	public.propriedadePublica = "Esta é uma propriedade publica";
	public.metodoPublico = function() {
		console.log("Este é um método publico");		
	};
	return public;	
})()

console.log(Modulo._variavelPrivada);       //imprime "undefined".
Modulo._metodoPrivado;                      //Lança um erro ao executar.
console.log(Modulo.propriedadePublica);     //imprime "Esta é uma propriedade publica"
Modulo.metodoPublico(); 		    //imprime "Este é um método publico"

 

 

Acessando Métodos privados

E o JavaScript é impressionante pois nos permite invocar métodos privados
através de nossos métodos publicos, observe:

Modulo.acessarMetodoPrivado();	     //imprime "Este método é privado"

O padrão Module Pattern é um excelente exemplo de usar Closure para
gerenciar escopo. Dentro do Módulo existe um âmbito privado que é protegido
de modificação.

Isso não é  tudo, você pode ainda extender o Modulo facilmente através 
de outra "funcão imediata". Tudo que você tem a fazer é passar o Modulo 
original como um novo argumento para a "funcão imediata". Vejamos:

 

var Modulo2 = (function(Modulo){
	//Acesso ao módulo
	Modulo.metodoPublico();
	return Modulo;
})(Modulo)

 

Conforme o código acima, o Modulo2 tem todas propriedades e métodos publicos do Modulo e pode assim acessá-los.

 

var Modulo2 = (function(Modulo){
	//Outro método
	Modulo.novoMetodo = function() {
		console.log("Novo método");	
	};
	return Modulo;
})(Modulo || {})


console.log(Modulo);  //Imprime Object {propriedadePublica: "Esta é uma propriedade publica", metodoPublico: function, novoMetodo: function}

 

Vemos que o método foi adicionado ao módulo inicial(Modulo).

 

Contudo o Padrão de Projeto Module é altamente flexivel por fazer 
grande uso de caracteristicas dinâmicas do JavaScript. É também usado nas bibiotecas
JavaScript modernas, por exemplo JQuery.

Por fim é isso amigos, essa é mais uma boa prática de JavaScript
Mais conhecimentos avançados e padrões de projetos estão por vir aqui neste blog fiquem ligados.

Michael Villander

Desenvolvedor Full Stack JavaScript, Entusiasta de NodeJS e ativo na comunidade open source. Já palestrou em eventos como GDG Goiânia

Latest posts by Michael Villander (see all)

Comentários