Design patterns javascript: O padrão de modelos
Padrões de design são padrões que podem ser comumente aplicados no desenvolvimento de softwares. Para algo ser considerado um padrão ele deve obedecer a três critérios básicos: serem uma solução provada, serem facilmente reutilizáveis e podem ser usados em diversos sistemas distintos. O padrão de modelos que falaremos hoje não foge a essa regra.
Introdução
O padrão de módulos tem como objetivo no javascript simular o conceito de encapsulamento das linguagens de programação tipadas sendo o javascript em si uma linguagem de programação não tipada.
O que é o encapsulamento?
O encapsulamento é um mecanismo da linguagem de programação para restringir o acesso a alguns componentes dos objetos, escondendo os dados de uma classe e tornando-os disponíveis somente através de métodos. - devmedia
No javascript isso é traduzido criando-se funções e variáveis públicas e/ou privadas, dentro de um objetos, fazendo que que seus nomes fiquem "escondidos" do restante do código.
1 - Closure
Um closure (fechamento) é uma função que se "lembra" do ambiente - ou escopo léxico - em que ela foi criada. - developer.mozilla.org
Graças a esse conceito o javascript pode simular as variáveis e funções públicas e privadas que existem em outras linguagens de programação.
O exemplo dado no stite da mozilla.org sobre clousure é algo como :
function makeFunc() {
var name = "Mozilla";
function displayName() {
alert(name);
}
return displayName;
}
var myFunc = makeFunc();
myFunc();
Nesse exemplo, o que está acontecendo é que a função myFunc, criada a partir da makeFunc() se tornou um "fechamento" ou closure da função da qual ela derivou. Portanto tudo que existia dentro da função inicial, incluindo variáveis e funções, está dentro da closure. é com esse conceito que podemos "imitar" variáveis privadas e com isso usar esse padrão.
2 - Outro exemplo prático
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 );
}
};
})();
Nesse outro exemplo do livro "Aprendendo Padrões de Design JavaScript
Um livro de Addy Osmani" podemos ver variáveis e funções consideradas privadas e públicas.
3 - Vantagens
- Facilidade para pessoas que estão migrando de alguma linguagem orientada a objetos de se familiarizar com o javascript.
- Organização do código.
- privacidade: Onde o que está fora da classe não é capaz de acessar os valores da sua parte privada
4- Desvantagens
- Como os acessos a itens público/privado são feitos de forma diferentes, portanto caso deseje mudar a visibilidade de um item terá, potencialmente, que alterar mais de um lugar no código.
- É bastante complicado criar testes automatizados com esse padrão, devido a natureza das funções e variáveis privadas