Espaço de nomes
Orientação a objetos |
---|
Objeto / Instância |
Classe |
Abstração |
Atributo |
Métodos |
Mensagem |
Encapsulamento |
Herança / Herança múltipla |
Associação |
Polimorfismo |
Interface |
Outras referências |
Paradigma de programação |
Padrões de projeto |
UML / RUP |
Engenharia OO |
|
Um espaço de nomes ("namespace" em inglês) é um delimitador abstrato (container) que fornece um contexto para os itens que ele armazena (nomes, termos técnicos, conceitos...), o que permite uma desambiguação para itens que possuem o mesmo nome mas que residem em espaços de nomes diferentes. Como um contexto distinto é fornecido para cada container, o significado de um nome pode variar de acordo com o espaço de nomes o qual ele pertence.
Por definição, dois conceitos de um espaço de nomes não podem compartilhar o mesmo nome. Entretanto, um mesmo conceito pode existir em mais de um espaço de nomes. Por exemplo, João trabalha para a empresa X e seu código é 123. José trabalha para a empresa Y e seu código também é 123. O João e o José podem ser identificados pelo mesmo código porque eles trabalham para empresas diferentes. As empresas representam espaços de nome distintos para o código de identificação de funcionário. Na empresa Z, o código 123 pode identificar uma geladeira sendo montada em uma linha de produção. Nota-se que o contexto do mesmo identificador variou entre a empresa Z e as outras empresas.
Ciência da computação
Em um sistema operacional, um exemplo de espaço de nomes é um diretório, que possui arquivos e sub-diretórios que devem ter nomes distintos entre si.
Em várias linguagens de programação, um espaço de nomes é um contexto para identificadores. Um espaço de nomes não pode possuir duas funções ou variáveis com o mesmo nome. No entanto, é permitido em linguagens de programação abrir espaços de nomes dentro de outros espaços de nomes, formando uma árvore de espaços de nomes. A raiz da árvore é conhecida como o espaço de nomes global, que é visível para todos os outros espaços de um programa de computador. Esse recurso é usado para organizar projetos de programas de computador de forma modular. Ele também é usado para evitar uma colisão de nomes: quando utilizam-se duas bibliotecas de rotinas distintas em um mesmo projeto, pode acontecer de uma mesma função estar declarada em ambas. Sem o uso de espaço de nomes, as bibliotecas não podem ser usadas ao mesmo tempo (em um mesmo módulo).
O escopo de uma função ou de uma classe pode ser entendido como um espaço de nomes implícito, associado com a visibilidade, acessibilidade e tempo de vida dos identificadores membros.
Em C++, um espaço de nomes é declarado através de um bloco. Para utilizar um identificador de um espaço de nomes em outro, deve-se especificar o prefixo do identificador, isto é, o caminho em profundidade desde o espaço de nomes global até o espaço de nomes o qual o identificador pertence (separados por ::
).
namespace foo { int var; } namespace bar { int var; // note que "var" já também foi declarado no espaço de nomes acima namespace embarcado // embarcando um espaço de nomes em outro { int i; } } int valor; // variável declarada no espaço de nomes global void func() { int valor; // uma função pode ser entendida como um espaço de nomes: // não há colisão de nomes como a variável global de mesmo nome bar::embarcado::i = 3; // utilizando um identificador de um espaço de nomes em outro }
Em Java, a ideia de espaço de nomes é embarcada na funcionalidade de pacotes. Todo o código pertence a um pacote, e identificadores de pacotes diferentes são utilizados atráves da especificação por prefixos. Diferente de C++, os espaços de nomes em Java não possuem hierarquia que a sintaxe da linguagem conheça. Entretanto, a nomeação de pacotes é feita de forma hierárquica.
Ver também
- Classificação decimal de Dewey
- Digital object identifier
- Domain Name System
- Domínio
- Endereço IP
- Nomenclatura binomial
- Portal das tecnologias de informação