Quand avons-nous une utilisation pratique des espaces de noms hiérarchiques en c ++?

StackOverflow https://stackoverflow.com/questions/117110

  •  02-07-2019
  •  | 
  •  

Question

Je peux comprendre l'utilisation d'un niveau d'espaces de noms. Mais 3 niveaux d'espaces de noms. Semble fou. Y at-il une utilisation pratique pour cela? Ou est-ce juste une idée fausse?

Était-ce utile?

La solution

Les espaces de noms hiérarchiques ont une utilité en ce qu'ils permettent des définitions progressivement plus fines. Un seul fournisseur peut certainement produire deux classes portant le même nom. Le premier niveau est souvent occupé par le nom de la société, le second spécifie le produit, le troisième (et éventuellement plus) peut fournir le domaine.

Il existe également d'autres utilisations de la ségrégation des espaces de noms. Une situation courante consiste à placer les classes de base d'un modèle de fabrique dans son propre espace de noms, puis à créer des fabriques dans leurs propres espaces de noms par fournisseur. Par exemple. System.Data , System.Data.SqlClient et System.Data.OleDbClient .

Autres conseils

Évidemment, c'est une question d'opinion. Mais cela se résume vraiment à l'organisation. Par exemple, j'ai un projet qui a un api de plugin qui a des fonctions / objets qui ressemblent à ceci:

plugins::v1::function

Lorsque la version 2.0 sera déployée, elle sera placée dans le sous-espace de noms v2. Je prévois seulement de déprécier, mais de ne jamais supprimer les membres de la v1, qui devraient bien prendre en charge la compatibilité ascendante à l'avenir. Ceci n’est qu’un exemple de "saine conscience". usage. J'imagine que certaines personnes différeront, mais comme je l'ai dit, c'est une question d'opinion.

Les grandes bases de code en auront besoin. Regardez boost pour un exemple. Je ne pense pas que quiconque qualifierait le code de rappel de "fou".

Si vous considérez le fait que, quel que soit le niveau de la hiérarchie, les utilisateurs ne peuvent comprendre que très grossièrement environ 10 éléments, alors deux niveaux ne vous donnent que 100 maximum. Un projet suffisamment volumineux aura besoin de plus, de sorte qu'il peut facilement se terminer sur 3 niveaux.

Je travaille sur une application XXX dans mon entreprise, et j'écris un sous-système graphique. J'utilise donc yyy :: xxx :: gui comme espace de noms.

Vous pouvez facilement vous retrouver dans une situation où vous avez besoin de plus d'un niveau. Par exemple, votre société dispose d'un espace de noms géant pour que tout son code le sépare du code tiers et vous écrivez une bibliothèque que vous souhaitez mettre dans son propre espace de noms. En règle générale, chaque fois que vous avez un système très volumineux et complexe, qui se décompose de manière hiérarchique, il est raisonnable d’utiliser plusieurs niveaux d’espace de nommage.

Cela dépend de vos besoins et de votre style de programmation. Mais l’un des avantages de namespace est d’aider à partitionner l’espace de noms (d’où le nom). Avec un seul espace de noms, la taille et la complexité de votre projet augmentent, de même que la probabilité de collision de noms.

Si vous écrivez du code destiné à être partagé ou réutilisé, cela devient encore plus important.

Je suis d'accord pour les applications. La plupart des personnes qui utilisent plusieurs niveaux d'espaces de noms (d'après mon expérience) viennent d'un environnement Java ou .NET où le bruit est nettement moindre. Je trouve que de bons préfixes de classe peuvent remplacer plusieurs niveaux d'espaces de noms.

Mais j’ai constaté une utilisation judicieuse de plusieurs niveaux d’espace de nom dans boost (et dans d’autres bibliothèques). Tout se trouve dans l'espace de noms boost, mais les bibliothèques sont autorisées (encouragées?) À se trouver dans leur propre espace de noms. Par exemple - boost :: this_thread namespace. Cela permet des choses comme ...

boost::this_thread::get_id()
boost::this_thread::interruption_requested()

" this_thread " est juste un espace de noms pour une collection de fonctions gratuites. Vous pouvez faire la même chose avec une classe et des fonctions statiques (c’est-à-dire la manière dont Java définit une fonction libre), mais pourquoi faire quelque chose de non naturel quand le langage a une façon naturelle de le faire?

Il suffit de regarder la bibliothèque de classes de base .Net pour voir une hiérarchie d’espaces de noms mise à profit. Il y a quatre ou cinq niveaux de profondeur dans quelques endroits, mais surtout deux ou trois, et l'organisation est très agréable pour trouver des choses.

Plus la base de code est grande, plus le besoin d'espaces de noms hiérarchiques est grand. Au fur et à mesure que votre projet prend de l'ampleur, vous devez trouver une solution pour le rendre plus facile à trouver.

Par exemple, nous utilisons actuellement une hiérarchie à 2 niveaux. Cependant, certaines des portions les plus importantes dont nous parlons sont réparties sur 3 niveaux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top