Venho programando em várias linguagens há cerca de 10 anos. E ainda não descobri quando é uma boa ideia importar algo para o espaço de nomes global ( using x::y
em C ++, from x import y
em Python etc.), por isso quase nunca faço isso.
Quase sempre parece uma má idéia para mim, mesmo que apenas porque limita o conjunto de nomes de variáveis que posso usar. Por exemplo: Onde eu devo usar using namespace std;
ou using std::string;
em C ++, não posso mais usar string
como nome de variável, o que ocasionalmente faço (por exemplo, para funções de utilitário de string).
Mas estou me perguntando: há algumas situações em que a importação de um nome para o espaço de nome global realmente faz sentido? Alguma regra de ouro?
Respostas:
Em C ++, geralmente é desaprovado - especialmente
using namespace std
. Essestd
espaço para nome tem muitos nomes, muitos dos quais são algoritmos muito genéricos, e você pode obter algumas surpresas extremamente desagradáveis quandousing namespace std
. Algo comousing std::cout;
não é tão ruim. Mas nunca, nunca,using
nada no espaço de nomes global em um arquivo de cabeçalho. Isso é uma ofensa do esquadrão de tiro.fonte
Você deve fazer isso quando simplificar seu código. Você não deve fazer isso quando isso causa conflitos de nomenclatura ou quando pode ser trazido posteriormente para escopos nos quais causa conflitos de nomenclatura, como um arquivo de cabeçalho.
Algumas pessoas pensam que isso deve ser raro. Eu acho que (fora dos arquivos de cabeçalho) não usá-lo deve ser raro, porque o prefixo do espaço para nome geralmente não adiciona nenhuma informação útil, como usar o nome completo de alguém toda vez que você os endereça.
Deixe-me colocar deste jeito. Quando você vê
string
como um nome de classe, você pensa automaticamentestd::string
oumycustom::string
? É como o velho ditado. Quando você ouve o som de cascos, pensa em cavalos, não em zebras. Em outras palavras,using namespace std
quase sempre não é grande coisa.using namespace mycustom
da mesma forma, geralmente não é um grande problema, a menos que contenha um conflitostd
; nesse caso, seu namespace personalizado é aquele para o qual você deseja sempre exigir o prefixo.fonte
mycustom
contiver umastring
classe. No topo vocêusing namespace mycustom;
. Através do restante do código que você usa agorastring
. Todo mundo que lê o código está pensando questd::string
apenas você (e algumas pessoas muito observadoras) estão pensandomycustom::string
. Aqui você colocou as zebras no piquete. Consulte também stackoverflow.com/q/1452721/14065mycustom
conflitos comstd
você sempre devem exigir omycustom::
prefixo.doStuff(int)
. E uma versão mais recente domycustom
adicionadoStuff(double)
todo o significado de qualquer chamada paradoStuff(5.5);
alterações (potencialmente sem você perceber).Trabalhando em Python, uso x import y (como z) constantemente, para ter nomes claros e concisos para fazer referência às importações.
As importações são inestimáveis em uma base de código com uma hierarquia profunda de namespace. Isso ocorre especialmente quando o padrão de estilo da base de código é o PEP 8 , que limita o comprimento da linha a menos de 80 caracteres.
Por exemplo, considere:
O que poderia ser escrito:
Como os identificadores Python fazem distinção entre maiúsculas e minúsculas e tamanho ilimitado , não ficaremos sem nomes, independentemente de quantos importamos.
Se queremos usar o mesmo nome em nosso módulo como um dos módulos que desejamos importar, podemos usar um alias para a importação:
fonte
Cabe ao programador quando usá-lo. IMHO é melhor não usá-los, especialmente em arquivos de cabeçalho. Mas há vários casos em que eu uso
Quando quero introduzir algo em outro espaço para nome, por exemplo
Para habilitar o ADL para alguns algoritmos de outro espaço para nome
Se não quiser escrever nomes longos de espaços para nome em .cpp, sempre posso criar um alias
fonte