7
votes

Éviter la surutilisation des espaces de noms

Ma bibliothèque utilise plusieurs espaces de noms imbriqués, disposés comme suit:

MyLibrary::MyContainer<int> Numbers = MyLibrary::Utilities::MyContainer::Insert(OtherContainer, 123, 456);
// Oh God, my eyes...


1 commentaires

Jamais utilisé boost . Fusion ? C'est beaucoup la même chose.


4 Réponses :


3
votes

Une déclaration dans un fichier d'en-tête nécessite la liste de noms de non polluer l'espace de noms global: xxx

mais dans le fichier source, vous pouvez utiliser des états: xxx


1 commentaires

J'évite habituellement en utilisant car dans mes projets, j'ai souvent l'impression que cela réduit la compréhension de ce qui vient d'où, mais dans un cas comme celui-ci, je le recommanderais fortement. C'est votre meilleur pari pour garder les choses propres si vous ne seriez pas à propos de l'ambiguïté.



2
votes

Le nom pleinement qualifié ne se ressemble pas vraiment aussi mauvais pour moi, mais j'aime être explicite dans la méthode et les noms de classe. Mais en utilisant peut aider les choses:

Vous pouvez probablement vous échapper avec un à l'aide d'un espace de noms Espace Mylibrary à la portée globale dans vos fichiers source, ce qui en fait: < Pré> xxx

et ensuite, vous pouvez importer les fonctions spécifiques dont vous avez besoin:

à l'aide de myLibrary :: utilitaires :: myContainer :: insérer

Et puis myContainer numéros = insert (autreContainer, 123, 456);


0 commentaires

7
votes

Si quelque chose fait mal, arrêtez de le faire. Il n'est absolument pas nécessaire d'utiliser des espaces de noms profondément imbriqués en C ++ - ils ne sont pas destinés à être des dispositifs architecturaux. Mon propre code utilise toujours un seul niveau d'espaces de noms.

Si vous insistez sur l'utilisation d'espaces de noms imbriqués, vous pouvez toujours créer des alias courts pour eux: P>

int x = Util::somefunc();   // calls Library::Utility::somefunc()


0 commentaires

14
votes

Regardez comment la bibliothèque standard (ou le boost) est organisée. Presque tout cela est dans le célibataire std code> Espace de noms. Il y a juste peu à gagner en mettant tout à l'intérieur de son espace de noms.

Boost met la plupart des choses em> les choses à l'intérieur boost code>, tandis que les bibliothèques em> Subnamespace unique ( Boost :: mpl code> ou boost :: Système de fichiers code>, par exemple). Et les bibliothèques définissent généralement un seul AUX code> Subnamespace pour les détails de la mise en œuvre interne. P>

Mais vous ne voyez pas généralement des hiérarchies de noms de noms profondes ou fines, car ils sont juste douloureux de travailler avec, et il y a peu de bénéfices à aucun bénéfice. p>

Voici quelques bonnes règles de pouce: p>

Les fonctions d'assistance liées à une classe spécifique doivent être dans la même espace de noms que la classe, permettre à ADL de fonctionner. Ensuite, vous n'avez pas besoin de qualifier le nom de la fonction d'assistance lorsque vous l'appelez. (J'aime comment vous pouvez appeler trier code> au lieu de std :: trier code> sur les itérateurs définis dans std code>). P>

pour tout Sinon, rappelez-vous que le but des espaces de noms est d'éviter les affrontements de nom et pas beaucoup d'autre. Donc, toute votre bibliothèque doit être dans un espace de noms em> pour éviter les affrontements avec le code d'utilisateur, mais dans cet espace de noms, il n'y a pas de besoin technique pour d'autres espaces de sous-noms à moins que vous ne prévoyez d'introduire des noms d'affichage. P>

Vous voudrez peut-être séparer les internes de votre bibliothèque dans un espace de sous-noms, de sorte que les utilisateurs ne les ramassent pas accidentellement à partir de l'espace de noms principal, similaire à Boost's AUX CODE>. P>

mais Généralement, je suggérerais que quelques espaces de noms imbriqués aussi possible. P>

et enfin, j'ai tendance à faire du point d'utiliser des noms courts, faciles à en tenir et facile à lire pour mes espaces de noms (à nouveau , std code> est un bon exemple à suivre. Court et au point, et presque toujours sans autres espaces de noms imbriqués, vous ne recevez donc pas une crampe de devoir l'écrire souvent, et donc il ne le fait pas. t encombrer trop votre code source.) p>

juste la première règle sur les fonctions d'assistance et ADL permettrait à votre exemple d'être réécrit comme ceci à la place: P>

Lib::MyContainer<int> Numbers = Insert(OtherContainer, 123, 456);


1 commentaires

Je veux upvouver C'est comme cinq fois. J'ai utilisé plus d'une bibliothèque avec un espace de noms superflu [ou similaire], et ils ont toujours l'impression que le développeur d'origine vient de détester la surcharge et l'ADL et souhaitait s'assurer que le compilateur ne pouvait pas utiliser de celui-ci.