Desenvolvimento - Javascript

Namespace em Javascript é possível?

Aprenda como criar e utilizar seus namespaces e torne seu código altamente portável.

por Edjan Santos



Namespace em Javascript é possível? Não só possível como é muito fácil e eficaz.  

Primeiro precisamos compreender realmente a importância do namespace em aplicações orientadas a objeto, recomenda a leitura do excelente artigo do Matt DeClaire sobre essa importância.

Quando você desenvolve uma aplicação e/ou um serviço é preciso garantir que as classes, métodos, variáveis e etc., sejam realmente única e exclusivamente da sua aplicação, seus objetos não podem de maneira alguma entrar em conflito com qualquer outro objeto que ele possa (ou não) interagir.  Quando seu código interage com ele mesmo fica mais fácil detectar possíveis conflitos, mas quando ele é distribuído tudo começa a ficar mais complicado. O Namespace garante, em boa parte dos casos, exclusividade a um domínio de nomes de objetos no escopo da aplicação.

Vamos fazer uma analogia um pouco estranha, mas que vai poder ilustrar como conflitos de nome atrapalham o desenvolvimento de software. Creio que muitos que leem esse artigo já utilizaram ou pelo menos conhecem jQuery e sua clássica função seletora $(), só que essa função também existe no framework Prototype e no MooTools, ou seja, se você usar qualquer um desses frameworks juntos terá problemas ao trabalhar com a função $().

Vamos agora partir para a parte interessante, a prática.

O Nome

A escolha do nome para seu namespace é fundamental, não existe nenhuma regra, mas existem algumas recomendações:

· Utilizar nome próprio (Ex. Labirintorium, LinhaDeCodigo, AppJsLabirintorium);

· Utilizar nomes curtos e/ou abreviados (Ex. AppLDC, AppLab);

· Em hierarquia de Namespaces tente deixar claro no nome o que o namespace abrange (Ex. AppLab.Produtos);

Criando o Namespace

Javascript não é uma linguagem orientada a objetos, portanto a sintaxe de um namespace não é como em Java ou C#.

Existem várias maneiras de se criar um namespace em Javascript, explicarei aqui a que acredito ser a melhor, utilizando literais.

O namespace consiste em uma função que retorna um literal, e esse literal contém os métodos e propriedades do meu namespace, vamos ver um exemplo:

var AppLabirintorium = function() {

                return {

                               metodo01 : function() {

                                               alert("Método número 01");

                               },

                               metodo02 : function() {

                                               alert("Método número 02");

                               }

                };

}();

Criamos uma variável que recebe uma função que retorna um literal, esse literal contém N funções. O grande benefício do uso do literal é que podemos instanciar nossas propriedades e/ou métodos privados antes dos públicos, vejamos um exemplo:

var AppLabirintorium = function() {

        var propriedade01 = "Edjan";

                return {

                               metodo01 : function() {

                                               alert("Método número 01");

                               },

                               metodo02 : function() {

                                               alert("Método número 02");

                               },

                               edjan : function() {

                                               alert("Método "+propriedade01);

                               }

                };

}();

Para criarmos um namespace dentro de outro namespace basta colocarmos esse novo namespace como um item do literal do namespace pai, vide exemplo:

var AppLabirintorium = function() {

        var propriedade01 = "Edjan";

                return {

                               metodo01 : function() {

                                               alert("Método número 01");

                               },

                               metodo02 : function() {

                                               alert("Método número 02");

                               },

                               edjan : function() {

                                               alert("Método "+propriedade01);

                               },

                 SegundoNameSpace : function() {

                        return {

                                metodo01 : function() {

                                alert("Esse é o metodo01 do segundo namespace");

                                }

                        };

                }()

                    }; }();

Utilizando o Namespace

Para utilizar o namespace é simples, basta seguir a hierarquia de objetos, exemplo:

Utilizando os métodos do primeiro exemplo de namespace:

AppLabirintorium.metodo01();

AppLabirintorium.metodo02();

Utilizando os métodos do segundo exemplo de namespace(propriedades):

AppLabirintorium.metodo01();

AppLabirintorium.metodo02();

AppLabirintorium.edjan();

Utilizando os métodos do terceiro exemplo de namespace(hierarquia):

AppLabirintorium.metodo01();

AppLabirintorium.metodo02();

AppLabirintorium.edjan();

AppLabirintorium. SegundoNameSpace.metodo01();

Espero que esse artigo colabore com a organização e portabilidade dos seus códigos, estude e aplique namespaces em seus javascripts. Até o próximo artigo!

Edjan Santos

Edjan Santos - Desenvolvedor Web com mais de 6 anos de experiência, trabalha com a plataforma .NET desde 2006. Atualmente cursa bacharel de Sistemas de Informação e trabalha como coordenador de desenvolvimento. Vem se especializando em gerência de projetos e arquitetura de sistemas. Sócio Fundador da Labirintorium.