Espaço de nomes
Este artigo não cita fontes confiáveis. (Janeiro de 2017) |
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
editarEm 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 se utilizam duas bibliotecas de rotinas distintas em um mesmo projeto, pode acontecer que uma mesma função estaja declarada em ambas. Sem o uso de espaços de nomes, as bibliotecas não podem ser usadas ao mesmo tempo (em um mesmo módulo).
O escopo de uma função ou 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" também já 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 com a variável global do 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 através 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.