Je suis passé de C++ à Java et C# et je pense que l'utilisation des espaces de noms/packages y est bien meilleure (bien structurée). Je suis ensuite revenu au C++ et j'ai essayé d'utiliser les espaces de noms de la même manière, mais la syntaxe requise est horrible dans le fichier d'en-tête.
namespace MyCompany
{
namespace MyModule
{
namespace MyModulePart //e.g. Input
{
namespace MySubModulePart
{
namespace ...
{
public class MyClass
Ce qui suit me semble également étrange (pour éviter l'indentation profonde) :
namespace MyCompany
{
namespace MyModule
{
namespace MyModulePart //e.g. Input
{
namespace MySubModulePart
{
namespace ...
{
public class MyClass
{
Existe-t-il une manière plus courte d'exprimer ce qui précède ? Il me manque quelque chose comme
namespace MyCompany::MyModule::MyModulePart::...
{
public class MyClass
Mise à jour
Ok, certains disent que le concept d'utilisation en Java/C# et C++ est différent. Vraiment ? Je pense que le chargement (dynamique) des classes n'est pas la seule raison d'être des espaces de noms (il s'agit d'un point de vue très technique et raisonné). Pourquoi ne pas l'utiliser pour la lisibilité et la structuration, par exemple en pensant à "IntelliSense".
Actuellement, il n'y a pas de logique ou de colle entre un espace de noms et ce que l'on peut y trouver. Java et C# font cela beaucoup mieux... Pourquoi inclure <iostream>
et ayant un espace de noms std
? Ok, si vous dites que la logique doit s'appuyer sur l'en-tête à inclure, pourquoi le #include n'utilise-t-il pas une syntaxe "IntelliSense" comme #include <std::io::stream>
ou <std/io/stream>
? Je pense que l'absence de structuration dans les librairies par défaut est une des faiblesses du C++ par rapport à Java/C#.
Si l'unicité pour éviter les conflits est un point (qui est aussi un point de C# et Java), une bonne idée est d'utiliser le nom du projet ou le nom de l'entreprise comme espace de noms, ne pensez-vous pas ?
D'un côté, on dit que le C++ est le plus flexible... mais tout le monde a dit "ne faites pas ça" ? Il me semble que le C++ peut faire beaucoup de choses mais a une syntaxe horrible même pour les choses les plus simples dans de nombreux cas par rapport au C#.
Mise à jour 2
La plupart des utilisateurs affirment qu'il est absurde de créer une imbrication plus profonde que deux niveaux. Ok, alors qu'en est-il des espaces de noms Windows::UI::Xaml et Windows::UI::Xaml::Controls::Primitives dans le développement Win8 ? Je pense que l'utilisation des espaces de noms par Microsoft est logique et qu'elle est en effet plus profonde que 2 niveaux. Je pense que les plus grandes bibliothèques / projets ont besoin d'une imbrication plus profonde (je déteste les noms de classe comme ExtraLongClassNameBecauseEveryTthingIsInTheSameNameSpace... alors vous pourriez tout mettre dans l'espace de noms global, aussi...).
Mise à jour 3 - Conclusion
La plupart des gens disent qu'il ne faut pas le faire, mais... même Boost a une imbrication plus profonde qu'un ou deux niveaux. Oui, c'est une bibliothèque, mais : Si vous voulez du code réutilisable, traitez votre propre code comme une bibliothèque que vous donneriez à quelqu'un d'autre. J'utilise également une imbrication plus profonde à des fins de découverte en utilisant des espaces de noms.