it-swarm-eu.dev

Mehrere Klassen in einer einzigen CS-Datei - gut oder schlecht?

Ist es ratsam, mehrere Klassen in einer CS-Datei zu erstellen, oder sollte jede CS-Datei eine eigene Klasse haben?

Zum Beispiel:

public class Items
{
    public class Animal
    {
    }

    public class Person
    {
    }

    public class Object
    {
    }
}

Wenn man für eine Minute der Tatsache ausweicht, dass dies ein schlechtes Beispiel für gute Architektur ist, riecht es dann nach mehr als einer Klasse in einer CS-Datei?

29
Sergio

Das Beispiel, das Sie gegeben haben, ist meiner Meinung nach in Ordnung. Sie deklarieren innere Klassen, daher ist es durchaus sinnvoll, sie in der gleiche Datei zu belassen. Die einzige Möglichkeit, dies zu umgehen, besteht darin, Ihre Items -Klasse zu einer Teilklasse zu machen und sie auf mehrere Dateien aufzuteilen. Ich würde diese schlechte Praxis in Betracht ziehen. Meine allgemeine Richtlinie für verschachtelte Klassen lautet, dass sie klein und privat sein sollten. Hiervon gibt es zwei Ausnahmen:

  • sie entwerfen einen Klassencluster (häufiger in Ziel-c), daher kann es sinnvoll sein, den Teilklassenansatz zu verwenden
  • sie benötigen eine Aufzählung, die nur mit der öffentlichen API der übergeordneten Klasse verwendet wird. In diesem Fall möchte ich lieber eine öffentliche Aufzählung innerhalb der übergeordneten Klasse deklarieren lassen, anstatt meinen Namespace zu verschmutzen. Die Aufzählung, die eine "innere Aufzählung" ist, führt effektiv zu einem genau definierten Umfang.

Wenn Sie die Frage etwas anders formulieren und nach "Soll ich jede Namespace - Level-Klasse in eine eigene Datei stellen" fragen, lautet meine Antwort "Ja".

Beim Entwerfen von Klassen respektieren wir das Prinzip der Einzelverantwortung. Das Lesen von Code wird viel einfacher, wenn seine Form seiner Semantik folgt. Daher ist es sinnvoll, Dateien nach Klassen aufzuteilen.

Aus mechanischer Sicht hat eine Datei pro Klasse mehrere Vorteile. Sie können mehrere Klassen gleichzeitig in verschiedenen Fenstern öffnen. Dies ist besonders wichtig, da kein seriöser Entwickler mit weniger als zwei Bildschirmen arbeitet. In der Lage zu sein, mehr Kontext in front meines Kopfes zu haben, bedeutet, dass ich mehr Kontext behalten kann in meinem Kopf. (Mit den meisten IDEs können Sie dieselbe Datei zweimal öffnen, aber ich finde das umständlich).

Der nächste wichtige Aspekt ist die Quellcodeverwaltung und das Zusammenführen. Indem Sie Ihre Klassen getrennt halten, vermeiden Sie viel Ärger, wenn Änderungen an derselben Datei vorgenommen werden, da separate Klassen geändert werden müssen.

30

Um brutal ehrlich zu sein, fügen Sie einer Datei bitte nicht mehr als eine Stammklasse hinzu. Bei meinem letzten Job gab es Dateien mit nicht nur mehreren Klassen, sondern auch mehreren Namespaces, und diese erstreckten sich über mehrere tausend Codezeilen. Sehr schwer zu folgen.

Wenn es Klassen gibt, die eng miteinander verbunden sind, benennen Sie ihre Dateien entweder ähnlich oder legen Sie sie in einem Unterordner ab.

Die physische Trennung von Klassendateien hilft (beachten Sie, nicht das Ende aller), die Trennung von Bedenken und eine lockere Kopplung zu bewirken.

Andererseits zeigt Ihr Beispiel nicht mehr als eine Stammklasse. Es gibt mehrere verschachtelte Klassen (Hinweis: Versuchen Sie, keine verschachtelten Klassen zu erstellen, außer private, wenn Sie dies entwerfen können), und dies ist vollkommen in Ordnung in einer Datei.

11
Jesse C. Slicer

Einfach ausgedrückt, es ist keine gute Form, dies zu tun, und ich werde Ihnen sagen, warum Sie etwas später, wenn Ihre Lösung groß wird, vergessen werden, wo sich die Klassen befinden, da der Dateiname nicht mehr den Inhalt und den Dateinamen darstellt AnimalPersonObject.cs das ist einfach nicht machbar.

Natürlich können Sie dies umgehen, indem Sie Funktionen in Tools wie Resharper verwenden, um zu Typen zu springen, aber 1 Klasse pro Datei (einschließlich Schnittstellen) ist wirklich das Rückgrat jedes Codestandards, den ich je gesehen habe, nicht nur in .net, sondern in Java und c ++ und viele andere Sprachen, die nicht oft Probleme mit der Wartung haben, und Junior-Entwickler werden Schwierigkeiten haben, den Code zu verstehen.

Fast alle Tools zur Codeoptimierung werden Ihnen sagen, dass Sie die Klassen in eine separate Datei verschieben sollen. Für mich ist dies also ein Codegeruch und muss etwas entfernt werden, um ihn zu neutralisieren :)

7
krystan honour

Wenn die Dateien sehr zusammenhängend sind, beispielsweise wenn es sich um eine Alternative zu mehreren sehr kurzen Dateien mit ähnlichen Namen handelt, kann dies eine gute Idee sein.

Ich finde zum Beispiel, dass es bei Verwendung von Fluent NHibernate einfacher ist, Entity und EntityMap in einer einzigen Datei zu speichern, ungeachtet dessen, was meine Tools dazu zu sagen haben.

In den meisten Fällen ist es nur schwieriger, Klassen zu finden. Gehen Sie sparsam und mit Vorsicht vor.

7
mootinator

Ein weiteres Problem ist, dass Sie bei sehr großen und ähnlichen Klassen in derselben Datei - wenn Sie die Klassendeklaration nicht jederzeit siehe - können - möglicherweise Haltepunkte in die falsche Klasse setzen und sich fragen, warum sie nicht verwendet werden nicht getroffen werden ... grrr! :) :)

3
Julia Hayward