Frage

Sollten die Ordner in einer Lösung mit dem Namespace übereinstimmen?

In einem meiner Teamprojekte haben wir eine Klassenbibliothek mit vielen Unterordnern im Projekt.

Projektname und Namespace: MyCompany.Project.Section.

Innerhalb dieses Projekts gibt es mehrere Ordner, die dem Namespace-Abschnitt entsprechen:

  • Ordner Vehicles hat Kurse in der MyCompany.Project.Section.Vehicles Namensraum
  • Ordner Clothing hat Kurse in derMyCompany.Project.Section.Clothing Namensraum
  • usw.

Innerhalb desselben Projekts befindet sich ein weiterer Rogue-Ordner

  • Ordner BusinessObjects hat Kurse in der MyCompany.Project.Section Namensraum

Es gibt einige Fälle wie diesen, in denen Ordner aus „organisatorischen Gründen“ erstellt werden.

Meine Frage ist:Was ist der Standard?Stimmen die Ordner in Klassenbibliotheken normalerweise mit der Namensraumstruktur überein oder handelt es sich um eine gemischte Mischung?

War es hilfreich?

Lösung

Beachten Sie außerdem, dass, wenn Sie die integrierten Vorlagen zum Hinzufügen von Klassen zu einem Ordner verwenden, diese standardmäßig in einem Namespace abgelegt werden, der die Ordnerhierarchie widerspiegelt.

Die Kurse werden leichter zu finden sein und das allein sollte schon gute Gründe sein.

Die Regeln, die wir befolgen, sind:

  • Der Projekt-/Assemblyname ist bis auf die Endung .dll derselbe wie der Root-Namespace
  • Die einzige Ausnahme von der oben genannten Regel ist ein Projekt mit einer .Core-Endung, das .Core wird entfernt
  • Ordner entsprechen Namespaces
  • Ein Typ pro Datei (Klasse, Struktur, Aufzählung, Delegat usw.) erleichtert das Auffinden der richtigen Datei

Andere Tipps

NEIN.

Ich habe beide Methoden bei kleinen und großen Projekten ausprobiert, sowohl mit einzelnen (mir) als auch mit einem Team von Entwicklern.

Ich fand, dass der einfachste und produktivste Weg darin bestand, einen einzigen Namespace pro Projekt zu haben und alle Klassen in diesen Namespace zu gehen.Anschließend können Sie die Klassendateien in den gewünschten Projektordnern ablegen.Da es nur einen einzigen Namespace gibt, ist es kein Problem, ständig using-Anweisungen am Anfang von Dateien hinzuzufügen.

Es ist wichtig, Quelldateien in Ordnern zu organisieren, und meiner Meinung nach sollten alle Ordner dafür verwendet werden.Die Anforderung, dass diese Ordner auch Namespaces zugeordnet werden müssen, ist unnötig, verursacht mehr Arbeit und ist meiner Meinung nach tatsächlich schädlich für die Organisation, da die zusätzliche Belastung die Desorganisation fördert.

Nehmen Sie zum Beispiel diese FxCop-Warnung:

CA1020:Vermeiden Sie Namespaces mit wenigen Typen
Ursache:Ein anderer Namespace als der globale Namespace enthält weniger als fünf Typen https://msdn.microsoft.com/en-gb/library/ms182130.aspx

Diese Warnung regt dazu an, neue Dateien in einem generischen Project.General-Ordner oder sogar im Projektstammverzeichnis abzulegen, bis Sie über vier ähnliche Klassen verfügen, die die Erstellung eines neuen Ordners rechtfertigen.Wird das jemals passieren?

Dateien finden

Die akzeptierte Antwort lautet: „Die Kurse werden leichter zu finden sein und das allein sollte gute Gründe sein.“

Ich vermute, die Antwort bezieht sich auf mehrere Namespaces in einem Projekt, die nicht der Ordnerstruktur zugeordnet sind, und nicht auf das, was ich vorschlage, nämlich ein Projekt mit einem einzigen Namespace.

Auch wenn Sie anhand des Namespace nicht ermitteln können, in welchem ​​Ordner sich eine Klassendatei befindet, können Sie sie mithilfe von „Gehe zu Definition“ oder über das Feld „Suchlösungs-Explorer“ in Visual Studio finden.Auch das ist meiner Meinung nach kein wirklich großes Problem.Ich verbringe nicht einmal 0,1 % meiner Entwicklungszeit mit dem Problem, Dateien zu finden, um eine Optimierung zu rechtfertigen.

Namenskonflikte

Durch das Erstellen mehrerer Namespaces kann das Projekt sicher zwei Klassen mit demselben Namen haben.Aber ist das wirklich eine gute Sache?Ist es vielleicht einfacher, dies einfach auszuschließen?Das Zulassen von zwei Klassen mit demselben Namen führt zu einer komplexeren Situation, in der die Dinge in 90 % der Fälle auf eine bestimmte Weise funktionieren und Sie dann plötzlich feststellen, dass Sie einen Sonderfall haben.Angenommen, Sie haben zwei Rechteckklassen in separaten Namespaces definiert:

  • Klasse Project1.Image.Rectangle
  • Klasse Project1.Window.Rectangle

Es kann vorkommen, dass eine Quelldatei beide Namespaces enthalten muss.Jetzt müssen Sie den vollständigen Namespace überall in dieser Datei ausschreiben:

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

Oder spielen Sie mit einer fiesen using-Anweisung herum:

using Rectangle = Project1.Window.Rectangle;

Mit einem einzigen Namespace in Ihrem Projekt sind Sie gezwungen, sich andere, und ich würde behaupten, aussagekräftigere Namen wie diesen auszudenken:

  • Klasse Project1.ImageRectangle
  • Klasse Project1.WindowRectangle

Und die Verwendung ist überall gleich. Sie müssen sich nicht mit einem Sonderfall befassen, wenn eine Datei beide Typen verwendet.

Anweisungen verwenden

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

vs

using Project1;

Die Leichtigkeit, beim Schreiben von Code nicht ständig Namespaces hinzufügen zu müssen.Es ist nicht wirklich die Zeit, die dafür benötigt wird, sondern die Unterbrechung im Fluss, die dadurch entsteht, dass man es tun muss und einfach Dateien mit vielen Verwendungsanweisungen füllt – wofür?Ist es das wert?

Projektordnerstruktur ändern

Wenn Ordner Namespaces zugeordnet sind, ist der Projektordnerpfad effektiv in jeder Quelldatei fest codiert.Das bedeutet, dass bei jedem Umbenennen oder Verschieben einer Datei oder eines Ordners im Projekt eine Änderung des tatsächlichen Dateiinhalts erforderlich ist.Sowohl die Namespace-Deklaration von Dateien in diesem Ordner als auch die Verwendung von Anweisungen in einer ganzen Reihe anderer Dateien, die auf Klassen in diesem Ordner verweisen.Während die Änderungen selbst mit Tools trivial sind, führt dies normalerweise zu einem großen Commit, der aus vielen Dateien besteht, deren Klassen sich nicht einmal geändert haben.

Mit einem einzigen Namespace im Projekt können Sie die Ordnerstruktur des Projekts beliebig ändern, ohne dass die Quelldateien selbst geändert werden.

Visual Studio ordnet den Namespace einer neuen Datei automatisch dem Projektordner zu, in dem sie erstellt wurde

Schade, aber ich finde, dass der Aufwand, den Namespace zu korrigieren, geringer ist als der Aufwand, sich damit zu befassen.Außerdem habe ich mir angewöhnt, eine vorhandene Datei zu kopieren und einzufügen, anstatt „Hinzufügen->Neu“ zu verwenden.

Intellisense und Objektbrowser

Meiner Meinung nach besteht der größte Vorteil der Verwendung mehrerer Namespaces in großen Projekten in der zusätzlichen Organisation beim Anzeigen von Klassen in allen Tools, die Klassen in einer Namespace-Hierarchie anzeigen.Sogar Dokumentation.Offensichtlich führt die Anwesenheit nur eines Namensraums im Projekt dazu, dass alle Klassen in einer einzigen Liste angezeigt werden und nicht in Kategorien unterteilt sind.Persönlich war ich jedoch noch nie ratlos oder verzögerte mich aufgrund eines Mangels daran, daher halte ich es nicht für einen ausreichend großen Vorteil, um mehrere Namensräume zu rechtfertigen.

Wenn ich jedoch eine große öffentliche Klassenbibliothek schreiben würde, dann würde ich würde Verwenden Sie wahrscheinlich mehrere Namespaces im Projekt, damit die Baugruppe in den Werkzeugen und in der Dokumentation ordentlich aussieht.

Ich denke, der Standard innerhalb von .NET besteht darin, zu versuchen, dies nach Möglichkeit zu tun, aber keine unnötig tiefen Strukturen zu erstellen, nur um sich daran als strenge Regel zu halten.Keines meiner Projekte folgt zu 100 % der Strukturregel namespace ==, manchmal ist es einfach sauberer/besser, von solchen Regeln auszubrechen.

In Java haben Sie keine Wahl.Ich würde das als einen klassischen Fall bezeichnen, bei dem es darum geht, was in der Theorie funktioniert und was in der Praxis funktioniert.

@lassevk:Ich stimme diesen Regeln zu und möchte noch eine hinzufügen.

Wenn ich verschachtelte Klassen habe, teile ich sie immer noch auf, eine pro Datei.So was:

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

Und

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

Ich würde ja sagen.

Erstens wird es einfacher sein, die eigentlichen Codedateien zu finden, indem man den Namespaces folgt (z. B. wenn Ihnen jemand per E-Mail einen nackten Ausnahmeaufrufstapel sendet).Wenn Sie zulassen, dass Ihre Ordner nicht mehr mit Namespaces synchronisiert sind, wird das Suchen von Dateien in großen Codebasen ermüdend.

Zweitens generiert VS neue Klassen, die Sie in Ordnern mit demselben Namespace wie die übergeordnete Ordnerstruktur erstellen.Wenn Sie dagegen vorgehen, müssen Sie beim Hinzufügen neuer Dateien nur noch eine zusätzliche Klempnerarbeit leisten.

Es versteht sich von selbst, dass man bei der Tiefe der xis-Ordner-/Namespace-Hierarchie konservativ sein sollte.

Ja, das sollten sie, sonst führt es nur zu Verwirrung.

Was ist der Standard?

Es gibt keinen offiziellen Standard, aber üblicherweise wird das Ordner-zu-Namespace-Zuordnungsmuster am häufigsten verwendet.

In Klassenbibliotheken stimmen die Ordner normalerweise mit der Namespace -Struktur überein oder ist es eine gemischte Tasche?

Ja, in den meisten Klassenbibliotheken stimmen die Ordner zur Vereinfachung der Organisation mit dem Namespace überein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top