Front End

14 mai, 2012

Saiba mais sobre encapsulamento com JavaScript

Publicidade

O JavaScript é a língua franca da Internet. Está em todo lugar, é importante, e não está indo embora. No entanto, um monte de desenvolvedores que usam JavaScript não o entendem muito bem.

Certamente não é por falta de recursos. Na verdade, existem vários recursos ótimos na Internet para aprender JavaScript. Há também ótimos livros, vídeos e apresentações. E, provavelmente, outros tipos de materiais educativos. No entanto, apesar de todos esses recursos, os desenvolvedores ainda acham difícil de aprender.

Talvez a principal razão para isso seja porque o JavaScript não é uma linguagem OO clássica, como C# ou Java. Em outras palavras, JavaScript não depende de classes para implementar os princípios fundamentais de OO, que todos nós aprendemos a amar na escola. Você sabe, coisas como encapsulamento, herança, polimorfismo e abstração.

A boa notícia é que o JavaScript possui outras maneiras de realizar o mesmo objetivo. A notícia potencialmente ruim é que ele é um pouco diferente do que estamos acostumados.

Considere o encapsulamento. Se você se lembrar da sua Introdução à Classe de Programação, o encapsulamento é sobre como ocultar informações e implementação. Os objetos devem expor apenas as propriedades e os métodos que são exigidos para interagir com eles. Todo o resto deve ser escondido. Para ver como esse conceito é implementado em JavaScript, vamos considerar um exemplo.

Criando um boleiro

Conheça Bob, o boleiro. Bob sabe fazer bolos e gosta de usar um ingrediente especial que só ele conhece. Naturalmente, Bob quer manter este ingrediente em segredo. Ele também quer manter para si o método exato que ele usa para preparar bolos (sim, Bob é surpreendentemente secreto). Então, como fazemos Bob?

Bem, em uma linguagem clássica, como C# poderíamos definir uma classe para representar um boleiro. Nós, então, criaríamos outro método de acesso público que pode chamar para fazer bolos. E faríamos todo o resto (ingrediente secreto, passos para assar) privado.

Em JavaScript nós não temos classesRF091186435SG. Então, temos que definir uma função que representa um fabricante de bolo. Variáveis ??particulares, como o ingrediente secreto, podem ser definidas como variáveis ??dentro da função. Métodos privados (como os passos do preparo do bolo) seriam funções internas. Variáveis ??públicas seriam devolvidas em um objeto que os define *.

Talvez, a melhor maneira de entender isso é ver cada um lado a lado:

Como você pode ver, o mecanismo JavaScript para variáveis e comportamentos escondidos aproveita funções ao invés de classes. Essa abordagem também usa um conceito muito poderoso de fechamentos. Sem entrar muito nisso, o closure é uma forma de funções internas (funções definidas dentro de outras funções) acessarem as variáveis ??da função externa.

Só para completar o quadro, a maneira que você cria Bob é usando esse módulo de boleiro, que é bastante similar em ambas linguagens:

Observe que em C# você tem que instanciar uma classe, enquanto que em JavaScript você cria um objeto e o atribui ao valor de retorno da função. Além disso, como C# possui classes, o objeto pode ser inicializado com um construtor, enquanto que o JavaScript requer uma chamada explícita para a função initialize().

A linha final

Assim, apesar de parecerem diferentes, à primeira vista os mecanismos que o JavaScript usa para obter os princípios OO implementados são definitivamente compreensíveis. Eles apenas demoram um pouco para se acostumar.

*Este padrão é apresentado no livro do lendário Doug Crackford, JavaScript: The Good Parts. Falando nisso, não há um livro melhor para realmente aprender JavaScript. Altamente recomendado!

 ***

Artigo original disponível em: http://tatiyants.com/groking-javascript-encapsulation/