O padrão do módulo foi originalmente definido como uma maneira de fornecer encapsulamento público e privado para as classes na engenharia de software convencional.
Ao trabalhar com o padrão Módulo, podemos achar útil definir um modelo simples que usamos para começar a usá-lo. Aqui está um que abrange variáveis de espaçamento entre nomes, públicas e privadas.
Em JavaScript, o padrão Module é usado para emular ainda mais o conceito de classes de forma que possamos incluir métodos e variáveis públicos / privados em um único objeto, protegendo partes específicas do escopo global. O que isso resulta é uma redução na probabilidade de os nomes de nossas funções entrarem em conflito com outras funções definidas em scripts adicionais na página.
var myNamespace = (function () {
var myPrivateVar, myPrivateMethod;
// A private counter variable
myPrivateVar = 0;
// A private function which logs any arguments
myPrivateMethod = function( foo ) {
console.log( foo );
};
return {
// A public variable
myPublicVar: "foo",
// A public function utilizing privates
myPublicFunction: function( bar ) {
// Increment our private counter
myPrivateVar++;
// Call our private method using bar
myPrivateMethod( bar );
}
};
})();
Vantagens
por que o padrão do módulo é uma boa escolha? Para iniciantes, é muito mais limpo para os desenvolvedores que têm um background orientado a objetos do que a idéia de encapsulamento verdadeiro, pelo menos da perspectiva do JavaScript.
Em segundo lugar, ele suporta dados privados - portanto, no padrão Módulo, partes públicas do nosso código são capazes de tocar as partes privadas; no entanto, o mundo exterior não consegue tocar nas partes privadas da classe.
Desvantagens
As desvantagens do padrão do módulo são que, como acessamos os membros públicos e privados de maneira diferente, quando desejamos alterar a visibilidade, na verdade temos que fazer alterações em cada local em que o membro foi usado.
Também não podemos acessar membros privados em métodos que são adicionados ao objeto posteriormente . Dito isto, em muitos casos, o padrão do módulo ainda é bastante útil e, quando usado corretamente, certamente tem o potencial de melhorar a estrutura do nosso aplicativo.
O padrão revelador do módulo
Agora que estamos um pouco mais familiarizados com o padrão do módulo, vamos dar uma olhada em uma versão um pouco melhorada - o padrão do módulo revelador de Christian Heilmann.
O padrão Revealing Module surgiu quando Heilmann ficou frustrado com o fato de ter que repetir o nome do objeto principal quando desejávamos chamar um método público de outro ou acessar variáveis públicas. objetar notação literal pelas coisas que ele desejava tornar públicas.
O resultado de seus esforços foi um padrão atualizado, onde simplesmente definimos todas as nossas funções e variáveis no escopo privado e retornamos um objeto anônimo com ponteiros para a funcionalidade privada que desejamos revelar como pública.
Um exemplo de como usar o padrão Revealing Module pode ser encontrado abaixo
var myRevealingModule = (function () {
var privateVar = "Ben Cherry",
publicVar = "Hey there!";
function privateFunction() {
console.log( "Name:" + privateVar );
}
function publicSetName( strName ) {
privateVar = strName;
}
function publicGetName() {
privateFunction();
}
// Reveal public pointers to
// private functions and properties
return {
setName: publicSetName,
greeting: publicVar,
getName: publicGetName
};
})();
myRevealingModule.setName( "Paul Kinlan" );
Vantagens
Esse padrão permite que a sintaxe de nossos scripts seja mais consistente. Também fica mais claro no final do módulo quais de nossas funções e variáveis podem ser acessadas publicamente, o que facilita a legibilidade.
Desvantagens
Uma desvantagem desse padrão é que, se uma função privada se refere a uma função pública, essa função pública não pode ser substituída se um patch for necessário. Isso ocorre porque a função privada continuará se referindo à implementação privada e o padrão não se aplica aos membros públicos, apenas às funções.
Membros de objetos públicos que se referem a variáveis privadas também estão sujeitos às notas de regra sem patch acima.