IT Mídia
Notícias em destaque

Módulos como namespaces

30 de setembro de 2011 19:54

Módulos em Ruby são grupos de métodos, constantes e variáveis de classes. Os módulos não podem ser instanciados e não existe herança de módulos.

Há duas maneiras de usar os módulos:

  • Como namespaces
  • Como mixin, onde os métodos de instância de um módulo podem ser “misturados” em outras classes

Nest post falarei somente sobre o uso de módulos como namespaces.

Bons motivos para usar namespaces são:

  • Previnir o conflito de nomes, seja de classes e/ou métodos
  • Organizar seu código de maneira lógica

Então vamos a um exemplo.

Imagine uma loja virtual que utiliza duas empresas de envio de mercadorias: Correios e FedEx. Para essas duas empresas é feito o cálculo de frete, utilizando as informações dos produtos nos pedidos dos clientes, no carrinho de compras da loja.

Então teríamos duas classes de cálculo de frete, uma para os Correios e outra para FedEx. Não podemos ter duas classes com o mesmo nome, por exemplo uma classe chamada Frete, então criamos dessa forma:

Com namespaces, você consegue uma maneira mais organizada de nomear essas classes:

No código acima, criamos o módulo Frete e dentro do módulo as classes Correios e Fedex.

Para instanciar uma classe com namespace, utilize o sintaxe NomeDoModulo::NomeDaClasse.new, como no código abaixo:

Os módulos podem também ter constantes. Vamos criar um constante de peso mínimo no nosso módulo Frete:

Uma constante em um módulo é acessível fora do módulo utilizando a sintaxe NomeDoModulo::NOME_DA_CONSTANTE. Dentro do módulo, e consequentemente das classes que estão no módulo, pode-se usar a constante sem o prefixo do nome do módulo. Vejo exemplo da constante PESO_MINIMO:

Não necessariamente você precisa criar todas as classes aninhadas de um módulo em um arquivo só. Para o nosso exemplo, poderíamos ter um arquivo para o módulo e também um arquivo para cada classe.


Outra maneira de declarar namespaces é colocar o nome do módulo, seguido de :: (4 pontos), antes do nome da classe.

No próximo post falarei sobre o uso de módulos como mixin.

  • http://twitter.com/seufagner seufagner

    Essa dica está presente no livro Eloquent Ruby, do Olsen. Modules como namespaces e se aplica, também, a outras linguagens – no Java, por exemplo, você pode usar pacotes como namespaces. -. 

    Indo um pouco mais além, vejam como é possível implementar Bounded Contexts, do DDD, através de modules.

    Abs

Sobre Fernando Hamasaki de Amorim

Desenvolvedor sênior na Locaweb, Fernando Hamasaki de Amorim atua em projetos utilizando Ruby e Rails. Pós-graduado em Tecnologias Web Fiap, trabalha desde 2000 com desenvolvimento web, onde já desenvolveu em várias plataformas e linguagens, como .NET, Java, JavaScript, PHP e ASP. Também foi palestrante do FISL e da RubyConf Brasil. Neste espaço, abordará temas envolvendo o desenvolvimento por meio da linguagem Ruby.

Entre em contato com Fernando Hamasaki de Amorim

Parceiros

Portais: IT Mídia | IT Web | Saúde Web

Publicações: InformationWeek Brasil | CRN Brasil | FH

Fóruns: IT Forum | IT Forum + | IT Business Forum | Saúde Business Forum