Les dossiers d’une solution doivent-ils correspondre à l’espace de noms ?

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

  •  08-06-2019
  •  | 
  •  

Question

Les dossiers d’une solution doivent-ils correspondre à l’espace de noms ?

Dans l'un des projets de mon équipe, nous avons une bibliothèque de classes qui contient de nombreux sous-dossiers dans le projet.

Nom du projet et espace de noms : MyCompany.Project.Section.

Dans ce projet, plusieurs dossiers correspondent à la section d'espace de noms :

  • Dossier Vehicles a des cours dans le MyCompany.Project.Section.Vehicles espace de noms
  • Dossier Clothing a des cours dans leMyCompany.Project.Section.Clothing espace de noms
  • etc.

Dans ce même projet, se trouve un autre dossier malveillant

  • Dossier BusinessObjects a des cours dans le MyCompany.Project.Section espace de noms

Il existe quelques cas comme celui-ci où les dossiers sont créés pour des raisons de « commodité organisationnelle ».

Ma question est:Quelle est la norme ?Dans les bibliothèques de classes, les dossiers correspondent-ils généralement à la structure de l'espace de noms ou s'agit-il d'un mélange ?

Était-ce utile?

La solution

Notez également que si vous utilisez les modèles intégrés pour ajouter des classes à un dossier, celui-ci sera par défaut placé dans un espace de noms qui reflète la hiérarchie des dossiers.

Les cours seront plus faciles à trouver et cela seul devrait être une raison suffisante.

Les règles que nous suivons sont :

  • Le nom du projet/assembly est le même que l'espace de noms racine, à l'exception de la terminaison .dll
  • La seule exception à la règle ci-dessus est un projet avec une terminaison .Core, le .Core est supprimé
  • Les dossiers sont équivalents aux espaces de noms
  • Un type par fichier (classe, structure, énumération, délégué, etc.) facilite la recherche du bon fichier

Autres conseils

Non.

J'ai essayé les deux méthodes sur des petits et grands projets, avec un seul (moi) et une équipe de développeurs.

J'ai trouvé que la solution la plus simple et la plus productive consistait à avoir un seul espace de noms par projet et que toutes les classes allaient dans cet espace de noms.Vous êtes ensuite libre de placer les fichiers de classe dans les dossiers de projet de votre choix.Il n'y a aucun problème à ajouter des instructions using en haut des fichiers à tout moment car il n'y a qu'un seul espace de noms.

Il est important d'organiser les fichiers sources dans des dossiers et, à mon avis, c'est pour cela que tous les dossiers doivent être utilisés.Exiger que ces dossiers soient également mappés sur des espaces de noms n'est pas nécessaire, cela crée plus de travail et j'ai trouvé que cela était en fait préjudiciable à l'organisation, car la charge supplémentaire encourage la désorganisation.

Prenez cet avertissement FxCop par exemple :

CA1020 :Évitez les espaces de noms avec peu de types
cause:Un espace de noms autre que l'espace de noms global contient moins de cinq types https://msdn.microsoft.com/en-gb/library/ms182130.aspx

Cet avertissement encourage le dumping de nouveaux fichiers dans un dossier générique Project.General, ou même à la racine du projet jusqu'à ce que vous disposiez de quatre classes similaires pour justifier la création d'un nouveau dossier.Est-ce que cela arrivera un jour ?

Recherche de fichiers

La réponse acceptée dit "Les cours seront plus faciles à trouver et cela seul devrait être une raison suffisante."

Je soupçonne que la réponse fait référence à la présence de plusieurs espaces de noms dans un projet qui ne correspondent pas à la structure des dossiers, plutôt qu'à ce que je suggère, à savoir un projet avec un seul espace de noms.

Dans tous les cas, même si vous ne pouvez pas déterminer dans quel dossier se trouve un fichier de classe à partir de l’espace de noms, vous pouvez le trouver en utilisant Go To Definition ou la zone de recherche de l’explorateur de solutions dans Visual Studio.De plus, ce n'est pas vraiment un gros problème à mon avis.Je ne consacre même pas 0,1% de mon temps de développement au problème de la recherche de fichiers pour justifier son optimisation.

Conflits de noms

Bien sûr, la création de plusieurs espaces de noms permet au projet d'avoir deux classes portant le même nom.Mais est-ce vraiment une bonne chose ?Est-il peut-être plus facile de simplement interdire que cela soit possible ?Autoriser deux classes portant le même nom crée une situation plus complexe dans laquelle 90 % du temps, les choses fonctionnent d'une certaine manière et vous découvrez soudain que vous avez un cas particulier.Supposons que vous ayez deux classes Rectangle définies dans des espaces de noms distincts :

  • classe Projet1.Image.Rectangle
  • classe Projet1.Fenêtre.Rectangle

Il est possible de rencontrer un problème selon lequel un fichier source doit inclure les deux espaces de noms.Vous devez maintenant écrire l'espace de noms complet partout dans ce fichier :

var rectangle = new Project1.Window.Rectangle();

Ou jouer avec une instruction using désagréable :

using Rectangle = Project1.Window.Rectangle;

Avec un seul espace de noms dans votre projet, vous êtes obligé de proposer des noms différents, et je dirais plus descriptifs, comme celui-ci :

  • classe Projet1.ImageRectangle
  • classe Projet1.WindowRectangle

Et l'usage est le même partout, vous n'avez pas à faire face à un cas particulier lorsqu'un fichier utilise les deux types.

utiliser des instructions

using Project1.General;  
using Project1.Image;  
using Project1.Window;  
using Project1.Window.Controls;  
using Project1.Shapes;  
using Project1.Input;  
using Project1.Data;  

contre

using Project1;

La facilité de ne pas avoir à ajouter des espaces de noms à tout moment lors de l’écriture du code.Ce n'est pas vraiment le temps que cela prend, c'est l'interruption du flux de devoir le faire et de simplement remplir des fichiers avec beaucoup d'instructions using - pour quoi faire ?Est-ce que ça vaut le coup?

Modification de la structure des dossiers du projet

Si les dossiers sont mappés à des espaces de noms, le chemin du dossier du projet est effectivement codé en dur dans chaque fichier source.Cela signifie que tout changement de nom ou déplacement d'un fichier ou d'un dossier dans le projet nécessite la modification du contenu réel du fichier.À la fois la déclaration d'espace de noms des fichiers de ce dossier et l'utilisation d'instructions dans tout un tas d'autres fichiers faisant référence aux classes de ce dossier.Bien que les modifications elles-mêmes soient triviales avec les outils, elles aboutissent généralement à un commit volumineux composé de nombreux fichiers dont les classes n'ont même pas changé.

Avec un seul espace de noms dans le projet, vous pouvez modifier la structure des dossiers du projet comme vous le souhaitez sans qu'aucun fichier source lui-même ne soit modifié.

Visual Studio mappe automatiquement l'espace de noms d'un nouveau fichier au dossier de projet dans lequel il est créé

Malheureusement, mais je trouve que les tracas liés à la correction de l'espace de noms sont moindres que ceux liés à leur gestion.De plus, j'ai pris l'habitude de copier-coller un fichier existant plutôt que d'utiliser Ajouter->Nouveau.

Intellisense et navigateur d'objets

À mon avis, le plus grand avantage de l'utilisation de plusieurs espaces de noms dans de grands projets est de disposer d'une organisation supplémentaire lors de l'affichage des classes dans tout outil affichant les classes dans une hiérarchie d'espaces de noms.Même la documentation.Évidemment, le fait de n'avoir qu'un seul espace de noms dans le projet entraîne l'affichage de toutes les classes dans une seule liste plutôt que de les diviser en catégories.Cependant, personnellement, je n'ai jamais été perplexe ou retardé à cause d'un manque de cela, donc je ne trouve pas que cela soit un avantage suffisamment important pour justifier plusieurs espaces de noms.

Bien que si j'écrivais une grande bibliothèque de classes publiques, alors je serait utilisez probablement plusieurs espaces de noms dans le projet afin que l'assembly ait l'air soigné dans l'outillage et la documentation.

Je pense que la norme, au sein de .NET, est d'essayer de le faire lorsque cela est possible, mais de ne pas créer de structures inutilement profondes simplement pour y adhérer comme une règle stricte.Aucun de mes projets ne suit la règle de structure namespace == 100% du temps, parfois il est juste plus propre/mieux de s'écarter de ces règles.

En Java, vous n'avez pas le choix.J’appellerais cela un cas classique de ce qui fonctionne en théorie par rapport à ce qui fonctionne en pratique.

@lassevk :Je suis d'accord avec ces règles et j'en ai une de plus à ajouter.

Lorsque j'ai des classes imbriquées, je les divise toujours, une par fichier.Comme ça:

// ----- Foo.cs
partial class Foo
{
    // Foo implementation here
}

et

// ----- Foo.Bar.cs
partial class Foo
{
    class Bar
    {
        // Foo.Bar implementation here
    }
}

Je dirais oui.

Premièrement, il sera plus facile de trouver les fichiers de code réels en suivant les espaces de noms (par exemple, lorsque quelqu'un vous envoie par e-mail une pile d'appels d'exception nue).Si vous laissez vos dossiers se désynchroniser avec les espaces de noms, trouver des fichiers dans de grandes bases de code devient fatigant.

Deuxièmement, VS générera de nouvelles classes que vous créez dans des dossiers avec le même espace de noms que sa structure de dossiers parent.Si vous décidez de nager contre cela, ce ne sera qu'un travail de plomberie supplémentaire à effectuer quotidiennement lors de l'ajout de nouveaux fichiers.

Bien sûr, cela va sans dire qu’il faut être prudent quant à la profondeur de la hiérarchie des dossiers/espaces de noms xis.

Oui, ils devraient le faire, sinon cela ne ferait que prêter à confusion.

Quelle est la norme ?

Il n'existe pas de norme officielle, mais classiquement, le modèle de mappage dossier-espace de noms est le plus largement utilisé.

Dans les bibliothèques de classe, les dossiers correspondent généralement à la structure de l'espace de noms ou est-ce un sac mixte?

Oui, dans la plupart des bibliothèques de classes, les dossiers correspondent à l'espace de noms pour faciliter l'organisation.

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