Skip to content

Instantly share code, notes, and snippets.

@gildemberg-santos
Last active October 22, 2024 15:35
Show Gist options
  • Save gildemberg-santos/3d87a1ae69efad78d3c0c22b12b951d0 to your computer and use it in GitHub Desktop.
Save gildemberg-santos/3d87a1ae69efad78d3c0c22b12b951d0 to your computer and use it in GitHub Desktop.

Documentação para o código de alias de namespace

Introdução

Este código define uma extensão da classe Class para criar um método que permite fazer um "alias" (apelido) de um namespace para outro namespace em Ruby. Com isso, é possível referenciar uma classe ou módulo de forma simplificada, renomeando-os conforme necessário. Essa funcionalidade pode ser útil para criar atalhos para classes ou módulos que estão em caminhos de namespace longos.

Descrição Geral

1. Extensão da Classe Class

A classe Class foi estendida para incluir dois métodos:

  • alias_namespace: Faz o mapeamento de um namespace para um novo nome, mas suprime erros caso o namespace não exista.
  • alias_namespace!: Faz o mapeamento de um namespace para um novo nome, gerando um erro se o namespace não for encontrado.

2. Definição do Método alias_namespace

class Class
  def alias_namespace(namespace, as:)
    alias_namespace!(namespace, as: as)
  rescue NameError
    nil
  end

  def alias_namespace!(namespace, as:)
    const_set(as, const_get(namespace))
  end
end
  • alias_namespace: Este método tenta criar um alias para um namespace usando o método alias_namespace!. Se ocorrer um NameError, o erro é capturado e suprimido (retornando nil).
  • alias_namespace!: Este é o método principal que realiza o alias. Ele utiliza o método const_get para acessar a constante do namespace original e o método const_set para definir a nova constante (alias) com o nome especificado.

3. Exemplo de Uso com Módulos e Classes

module Animais
  module Maniferos
    class Humano
      def self.nome(value)
        puts 'Meu nome é: ' << value
      end
    end
  end
end

Neste exemplo, temos um módulo chamado Animais com um submódulo Maniferos, que contém uma classe Humano. Essa classe define um método de classe nome que imprime o nome recebido como argumento.

4. Exemplo de Aplicação do Alias

class Pessoa
  alias_namespace 'Animais::Maniferos::Humano', as: 'Gildemberg'
  alias_namespace 'Animais::Maniferos::Humano', as: 'Lucas'
  alias_namespace 'Animais::Maniferos::Humano', as: 'Gomes'
  alias_namespace 'Animais::Maniferos::Humano', as: 'Joathan'
  alias_namespace 'Animais::Maniferos::Humano', as: 'Felipe'
  alias_namespace 'Animais::Maniferos::Humano', as: 'Andre'
  alias_namespace 'Animais::Maniferos::Humano', as: 'Vagner'
  alias_namespace 'Animais::Maniferos::Humano', as: 'Agostinho'

  def initialize
    Gildemberg.nome('Gildemberg')
    Lucas.nome('Lucas')
    Gomes.nome('Gomes')
    Joathan.nome('Joathan')
    Felipe.nome('Felipe')
    Andre.nome('Andre')
    Vagner.nome('Vagner')
    Agostinho.nome('Agostinho')
  end
end

Neste exemplo, a classe Pessoa utiliza o método alias_namespace para criar aliases para a classe Humano com vários nomes diferentes. Esses aliases (Gildemberg, Lucas, Gomes, etc.) são referenciados no método initialize, onde o método nome de cada alias é chamado para imprimir o nome correspondente.

5. Instanciando a Classe Pessoa

Pessoa.new

Ao instanciar a classe Pessoa, o método initialize será executado, resultando na impressão dos nomes correspondentes para cada alias criado.

Funcionamento Detalhado

  1. alias_namespace!:

    • O método const_get(namespace) procura pela constante referenciada pela string do namespace, como 'Animais::Maniferos::Humano', retornando a classe Humano.
    • O método const_set(as, const) define uma nova constante com o nome fornecido pelo parâmetro as, associando-a à constante original (Humano).
  2. alias_namespace:

    • Tenta executar o alias_namespace!. Caso a constante namespace não exista, o erro NameError é capturado e suprimido, retornando nil sem interromper a execução.
  3. Uso dos Aliases:

    • Cada alias é um novo nome para a classe Humano. Quando o alias é utilizado, ele se comporta exatamente como a classe original. Assim, quando Gildemberg.nome('Gildemberg') é chamado, é o método Humano.nome que está sendo invocado, mas através do alias.

Exemplo de Saída

Quando Pessoa.new é chamado, a saída será:

Meu nome é: Gildemberg
Meu nome é: Lucas
Meu nome é: Gomes
Meu nome é: Joathan
Meu nome é: Felipe
Meu nome é: Andre
Meu nome é: Vagner
Meu nome é: Agostinho

Vantagens do Alias de Namespace

  • Legibilidade: Facilita a leitura do código quando o nome completo do namespace é muito longo ou não semântico.
  • Flexibilidade: Permite renomear classes ou módulos de forma local, sem modificar o código-fonte original.
  • Reutilização: Torna o código mais dinâmico ao permitir o uso de várias referências ao mesmo namespace sob diferentes nomes.

Possíveis Melhoria e Extensões

  • Verificação de Existência: Poderia ser adicionado um método para verificar a existência do namespace antes de criar o alias.
  • Suporte para Namespaces Aninhados: Caso o alias seja necessário para um namespace mais complexo, o método poderia ser estendido para lidar com múltiplos níveis de alias.

Conclusão

Este código exemplifica como criar um alias de namespace utilizando uma extensão da classe Class em Ruby. Ele oferece uma maneira conveniente e flexível de renomear classes ou módulos, mantendo o código mais limpo e legível.

# Exterder a classe Class para criar um método que faz alias de um namespace para outro namespace
class Class
def alias_namespace(namespace, as:)
alias_namespace!(namespace, as: as)
rescue NameError
nil
end
def alias_namespace!(namespace, as:)
const_set(as, const_get(namespace))
end
end
# Exemplo de namespace que será usado para fazer o alias
module Animais
module Maniferos
class Humano
def self.nome(value)
puts 'Meu nome é: ' << value
end
end
end
end
# Exemplo de uso do alias_namespace
class Pessoa
alias_namespace 'Animais::Maniferos::Humano', as: 'Gildemberg'
alias_namespace 'Animais::Maniferos::Humano', as: 'Lucas'
alias_namespace 'Animais::Maniferos::Humano', as: 'Gomes'
alias_namespace 'Animais::Maniferos::Humano', as: 'Joathan'
alias_namespace 'Animais::Maniferos::Humano', as: 'Felipe'
alias_namespace 'Animais::Maniferos::Humano', as: 'Andre'
alias_namespace 'Animais::Maniferos::Humano', as: 'Vagner'
alias_namespace 'Animais::Maniferos::Humano', as: 'Agostinho'
def initialize
Gildemberg.nome('Gildemberg')
Lucas.nome('Lucas')
Gomes.nome('Gomes')
Joathan.nome('Joathan')
Felipe.nome('Felipe')
Andre.nome('Andre')
Vagner.nome('Vagner')
Agostinho.nome('Agostinho')
end
end
# Instanciando a classe Pessoa
Pessoa.new
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment