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

30

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

Beispielsweise:

public class Items
{
    public class Animal
    {
    }

    public class Person
    {
    }

    public class Object
    {
    }
}

Weicht man für eine Minute der Tatsache aus, dass dies ein schlechtes Beispiel für eine gute Architektur ist, hat mehr als eine einzelne Klasse in einer CS-Datei einen Codegeruch?


quelle

Antworten:

30

Das Beispiel, das Sie gegeben haben, ist meiner Meinung nach in Ordnung. Sie deklarieren innere Klassen , daher ist es durchaus sinnvoll, sie in derselben Datei zu belassen . Der einzige Weg, dies zu umgehen, wäre, Ihre ItemsKlasse 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 Objective-c), daher kann es sinnvoll sein, den partiellen Klassenansatz zu verwenden
  • Sie benötigen eine Aufzählung, die nur mit der öffentlichen API der übergeordneten Klasse verwendet wird. In diesem Fall ist es mir lieber, eine öffentliche Enumeration in der übergeordneten Klasse zu deklarieren, als meinen Namespace zu verschmutzen. Die Aufzählung als "innere Aufzählung" führt effektiv dazu, dass ihr ein genau definierter Geltungsbereich zugewiesen wird.

Wenn Sie die Frage etwas anders formulieren und fragen, ob jede Namespace- Klasse in einer eigenen Datei abgelegt werden soll, lautet die Antwort "Ja".

Bei der Gestaltung des Unterrichts respektieren wir das Prinzip der Einzelverantwortung. Das Lesen von Code wird viel einfacher, wenn seine Form der Semantik folgt. Daher ist es sinnvoll, Dateien nach Klassen zu unterteilen.

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. Die Möglichkeit , mehr Kontext in hat vorne meinem Kopf zu haben, bedeutet, dass ich mehr Kontext in meinem Kopf behalten kann . (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.

Johannes Rudolph
quelle
1
Ich stimme zu, aber innere Klassen sind meiner Erfahrung nach sehr ungewöhnlich. Um ehrlich zu sein, es gibt nicht wirklich viel, was innere Klassen rechtfertigen kann. Der einzige mir bekannte Fall sind IEnumerable-Klassen, bei denen es nicht wirklich um die tatsächliche Klasse geht, solange Sie sie aufzählen können. In allen anderen Fällen sollte jede Klasse eine eigene Datei erhalten. Wenn aus keinem anderen Grund aufgrund von Problemen mit der Quellcodeverwaltung.
Homde
2
Ich würde hinzufügen, dass innere Klassen eine seltene Ausnahme sein sollten und fast nie öffentlich sein sollten.
Josh
Yup lehrt mich, dass ich so schnell vom Fleck bin, innere Klassen sind in Ordnung, aber die Frage, ob Sie innere Klassen verwenden sollten, ist eine andere Frage :)
krystan honor
11

Um ehrlich zu sein, fügen Sie einer Datei nicht mehr als eine Root-Klasse hinzu. Bei meinem letzten Job gab es Dateien mit nicht nur mehreren Klassen, sondern auch mehreren Namespaces, und dies erstreckte sich über mehrere tausend Codezeilen. Sehr schwer zu versuchen, zu folgen.

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

Die physische Trennung von Klassendateien trägt zur Trennung von Bedenken und zu einer lockeren Kopplung bei (beachten Sie, dass nicht das Ende alles ist).

In Ihrem Beispiel wird jedoch nicht mehr als eine Stammklasse angezeigt. Es gibt mehrere verschachtelte Klassen (Anmerkung: Versuchen Sie, keine verschachtelten Klassen zu erstellen , außer privatewenn Sie dies entwerfen können), und dies ist in einer Datei vollkommen in Ordnung .

Jesse C. Slicer
quelle
3
Oh Gott - das hört sich schrecklich an.
Warum fragst du? Hat dich jemand abgewählt und du wolltest fragen warum?
Warten Sie ... haben Sie sich auf die kleine Anekdote über meinen letzten Job bezogen? Wenn ja, verstehe ich das falsch und entschuldige mich dafür.
Jesse C. Slicer
Stimme voll und ganz zu. Ich arbeite an einem Projekt, in dem die meisten Dateien mindestens 4 Klassen pro Datei haben. Und einige haben bis zu 22 Klassen + 1 Schnittstelle pro Datei.
L_7337
7

Wenn die Dateien einen hohen Zusammenhalt aufweisen, z. B. wenn es sich um eine Alternative zu mehreren sehr kurzen Dateien mit ähnlichen Namen handelt, kann dies eine gute Idee sein.

Zum Beispiel finde ich, dass es bei der Verwendung von Fluent NHibernate einfacher ist, wenn ich Entityund behalteEntityMap in einer einzigen Datei, trotz allem , was meine Werkzeuge haben , darüber zu sagen.

In den meisten Fällen ist es nur schwieriger, Klassen zu finden. Vorsichtig und sparsam verwenden.

Mootinator
quelle
1
Speziell für Fluent NHibernate fand ich es nützlich, sie nicht nur in derselben Datei, sondern auch in derselben Klasse zu speichern. Alle meine Entitäten haben eine verschachtelte Klasse namens Map.
James Beninger
7

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

Sicher 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, bei denen es nicht oft zu Wartungsproblemen kommt, und bei Junior-Entwicklern ist es schwierig, den Code zu verstehen.

Fast alle Tools zur Codeoptimierung schreiben vor, dass Sie die Klassen in eine separate Datei verschieben müssen. Für mich ist dies also ein Code-Geruch, für dessen Neutralisierung einige E-Mails erforderlich sind :)

krystan Ehre
quelle
3

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

Julia Hayward
quelle
-3

Wenn Sie diese Klasse nur innerhalb der "Eltern" -Klasse (in Bezug auf den Umfang) verwenden müssen, ist es normalerweise angebracht, sie als verschachtelte Klasse zu definieren.

hjdjdg
quelle