Richtlinien für Namespace- und Klassennamen

15

Ich habe Probleme, meine Klassen und Dienste richtig zu benennen, wenn Utils und andere Hilfeklassen beteiligt sind.

Wie würden Sie Folgendes strukturieren:

EventService.cs
EventServiceUtils.cs
EventServiceValidators.cs
EventServiceCoordinator.cs

etc...

Ich habe mehrere Dienste mit den gleichen Anforderungen wie der oben genannte Dienst. Ein Gedanke ist, all dies in einen geeigneten Namespace zu unterteilen, so dass es ungefähr so ​​aussieht:

Services.EventService.EventService.cs //(the actual service)
Services.EventService.Validators.DateValidator.cs
Services.EventService.Validators.ParticipantValidator.cs
Services.EventService.Coordinators.ParticipantCoordinator.cs
Services.EventService.ExtensionMethods.Extensions.cs

und so weiter. Jeder Namespace ist natürlich ein eigener Ordner. Dies fühlt sich jedoch nicht 100% ig an, da es wahrscheinlich mehr DateValidatorsin den anderen Diensten gibt, was leicht zu einem unerwünschten Verweis führen kann.

Und das Services.EventService.EventService.csschließt auch den Klassennamen in den Namespace ein, was auch nicht gut ist. Sie könnten verwenden Services.Event.EventService.cs, aber es gibt natürlich bereits eine Entität mit diesem Namen.

Dies ist das Domain-Modell.

Mattias
quelle
"Ich habe mehrere Dienste mit den gleichen Anforderungen wie der oben genannte Dienst." Bedeutet dies, dass mehrere Dienste den obigen Code verwenden oder dass mehrere Dienste ihre eigene Version nach demselben Muster bereitstellen müssen?
Nathanael
Dass sie ihre eigene Version des gleichen Musters zur Verfügung stellen
Mattias

Antworten:

5

Ich denke, das Beste, was Sie tun können, um Ihren Namespace zu verbessern, ist, ihn Serviceaus Ihrem EventServiceNamespace zu entfernen . Ich würde die Namespaces auch so anpassen:

Services.Events.EventService.cs //(the actual service)
Services.Events.EventExtensions.cs
Services.Events.ParticipantCoordinator.cs
Services.Validators.DateValidator.cs
Services.Validators.ParticipantValidator.cs

Ich denke immer noch, dass dies eine Verbesserung gebrauchen könnte.

Früher mochte ich Namespaces, aber heute denke ich, dass weniger mehr ist. Wenn Sie Ihre Namespaces tief verschachteln, wird der Code möglicherweise zu ausführlich, und die Aufschlüsselung der Elemente führt zu einer weitaus geringeren Vererbbarkeit. In Ihrem Code DateValidatorkönnte eine Klasse beispielsweise problemlos an anderer Stelle verwendet werden, sodass sich nicht viele Namespaces darüber befinden sollten, da andere Dienste als der EventService jetzt eine DateValidator-Klasse nutzen können. Gleiches gilt für die Erweiterungsmethoden. Es gibt keine Zeit (die ich sehen kann), in der Sie alle Ihre Erweiterungsmethoden gleichzeitig sehen müssen, daher ist es sinnvoller, sie mit der Sache zu gruppieren, auf die sie sich bezieht. In diesem Fall sind EventExtensionswahrscheinlich Links zu Ihrer EventService, also logischerweise sollten sie meiner Meinung nach zusammen sitzen.

Karl Nicoll
quelle
Das Projekt ist zu groß, um es nicht auf eine bestimmte Ebene herunterzubrechen. Der DateValidator unter dem Ereignis-Namespace verarbeitet nur ereignisspezifische Fälle und kann daher nicht an anderer Stelle verwendet werden. Ich mag Dienstleistungen. Veranstaltungen .EventService. Wie könnte ich nicht daran denken. Ich denke, es ist Zeit für ein Refactoring!
Mattias
@Mattias - Das ist fair. Soweit ich sehen kann, ist der Namensraum (jenseits der grundlegenden Richtlinien, wie sie Saeed weiter unten nennt) so ziemlich nur Geschmackssache.
Karl Nicoll
2

Das richtige Namespace-Design berücksichtigt sowohl das logische als auch das physische Design.

Obwohl die ursprüngliche Begründung für Namespaces in erster Linie darin bestand, Namenskonflikte zwischen Objekt- und Methodennamen zu vermeiden, ist sie zu einem wichtigen Element der gesamten Lösungsarchitektur und -gestaltung geworden. Sie möchten nicht nur, dass Ihre konzeptionelle Hierarchie und Ihr logisches Design sinnvoll sind, sondern auch, dass Ihr Code ordentlich in gut gestalteten und leicht wiederverwendbaren Bibliotheken verpackt wird, die später problemlos in andere Projekte und Produkte integriert werden können. Das ist vielleicht eher das gewünschte Ergebnis eines guten physischen Designs.

Sehen Sie sich das .NET Framework an und erfahren Sie, wie Einheiten verwandter Funktionen in Assemblys mit angemessener Größe bereitgestellt werden. Sie können eine Referenz und eine using-Anweisung einfügen und haben plötzlich relevante Funktionen zur Verfügung, ohne eine beliebige Anzahl von Küchenspülen einziehen zu müssen. Dies liegt daran, dass das physische Design von .NET Framework - einschließlich des intelligenten Namespaces - logisch zusammengehörigen Code in physisch zusammengehörigen bereitstellbaren Einheiten gepackt hat. Durch das Erstellen einer hervorragenden Zuordnung zwischen Namespaces und Assemblys haben die Architekten und Entwickler des .NET-Frameworks von Microsoft Ihre Arbeit erheblich erleichtert (einige mögen sich vielleicht anders auseinandersetzen, aber ich bin ziemlich zufrieden mit dem, was sie getan haben).

Namespaceing in C # ist eigentlich eher willkürlich. Sie können Namespaces an den ungewöhnlichsten Stellen platzieren, in Assemblys, die weit voneinander entfernt sind. Jede hilfreiche Disziplin in diesem Bereich ist wirklich Ihr persönlicher Beitrag zu einem gut organisierten Softwareprodukt. Ich würde es nicht wagen, Ihnen genau zu sagen, was in jedem Fall zu tun ist. Mit dieser Antwort möchte ich Sie dazu bringen, sich bei der Definition Ihrer Namespaces Gedanken über das physische und das logische Design zu machen. Je mehr Sie die Dinge logisch miteinander verknüpfen und (physisch) bereitstellen, desto einfacher wird es später, sowohl für Sie als auch für andere, die sich eines Tages mit Ihrem Code befassen müssen.

Denken Sie also bitte darüber nach, wie Ihr Code in Baugruppen und Komponenten verpackt wird, wenn Sie Ihre Namespace-Probleme lösen!

John Tobler
quelle