2010-09-12 3 views
3

Si on a un fichier d'en-tête, disons "test.h" dontespace de noms dans la définition et la mise en œuvre

namespace test 
{ 
    enum ids 
    { 
     a = 1, 
     b = 2, 
     c = 3, 
     d = 30 
    }; 

    char *names[50]; 
}; 

et un fichier source, "test.cc" essentiellement incluant seulement

test::names[test::a] = "yum yum"; 
test::names[test::c] = "pum pum"; 
// ... 

Cela n'aurait-il pas plus de sens d'encapsuler l'implémentation dans l'espace de noms? Je dirais que ce serait, comme c'est après tout l'implémentation du fichier d'en-tête, il serait donc logique d'inclure l'implémentation dans le même espace de noms que l'en-tête sans préfixer manuellement toutes les variables avec test::, et le préfixe lors de l'utilisation valeurs de l'extérieur.

C'est l'avis d'une recrue en C++, que diraient les gens les plus intelligents ici?

Répondre

4

Vous pouvez également spécifier l'espace de noms dans test.cc. Pour ce faire, vous feriez quelque chose comme:

#include "test.h" 

namespace test 
{ 
    ... 
    names[a] = "yum yum"; 
    names[c] = "pum pum"; 
    ... 
} 

Vous pouvez utiliser alternativement using comme dans:

#include "test.h" 

using test; 

... 
names[a] = "yum yum"; 
names[c] = "pum pum"; 
... 

J'utilise généralement la première méthode.

+0

Oui, je sais que vous pourriez faire cela ... c'était simplement une question de "Est-ce une bonne pratique de le faire ou préférez-vous préfixer manuellement" :) – LukeN

+0

@LukeN: Comme Lima Beans mentionné ci-dessous, c'est une question de préférence et de cohérence. Je préfère, et voudrais penser que j'utilise toujours la première méthode. Je pourrais faire valoir que le fait d'être explicite (comme vous l'étiez dans votre code) est probablement le plus solide puisqu'il exige explicitement que le développeur écrive ce qu'il veut dire plutôt que d'être plus implicite. L'inconvénient est qu'il nécessite plus de dactylographie et en tant que tel pourrait provoquer une arthrite précoce du poignet et des doigts ou éventuellement syndrome du canal carpien;) – andand

+1

@LukeN: Je préfère aussi l'emballage, notez que la méthode «using» est désapprobatrice (même dans fichiers source). –

2

Je ne pense pas que vraiment importe, et je ne pense pas qu'il existe une norme globale dans un sens ou dans l'autre. L'important est de rester cohérent avec le reste de votre code et de le faire de la même manière.

Personnellement, je préfère envelopper la mise en œuvre dans l'espace comme ceci:

namespace test 
{ 
    names[a] = "yum yum"; 
    names[c] = "pum pum"; 
} 

Cela me semble communiquer que je suis en train de définir et mettre en œuvre l'espace de noms de test, et non pas seulement « en utilisant » il.