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

editar

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 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.

Ver também

editar