Espaço de nomes
Origem: Wikipédia, a enciclopédia livre.
Um espaço de nomes é um container abstrato que fornece contexto para os itens que armazena (nomes, termos técnicos, conceitos...), e que fornece desambiguação para itens que possuem o mesmo nome mas que residem em espaços de nomes diferentes. Tendo em vista que é fornecido um contexto distinto 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. A razão pelo qual João e José podem ser identificados pelo mesmo código é porque eles trabalham para empresas diferentes. As diferentes empresas representam espaços de nome distintos para o código de identificação de funcionário. Na empresa Z, o código 123 identifica uma das geladeiras sendo montada na linha de produção: nota-se que o contexto do mesmo identificador variou entre a empresa Z e as outras empresas.
[editar] 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 mesmo 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 embarcar espaços de nomes em 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 nomes de um programa de computador. Esse recurso é usado para organizar projetos de programas de computador de forma modular. Também é usado para evitar colisão de nomes: quando utilizam-se duas bibliotecas de rotinas distintas em um mesmo projeto, pode acontecer que uma mesma função está declarada em ambas. Sem o uso de espaço de nomes, as bibliotecas não podem ser usada em conjunto (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, acessiblidade 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 idéia 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.