Ist es eine schlechte Praxis, mehrere Klassen in derselben Datei zu haben?

79

Früher hatte ich eine Klasse für eine Datei. Zum Beispiel hat car.cs die Klasse car . Wenn ich jedoch mehr Klassen programmiere, möchte ich sie derselben Datei hinzufügen. Zum Beispiel car.cs hat die Klasse Auto und die Tür Klasse usw.

Meine Frage ist gut für Java, C #, PHP oder jede andere Programmiersprache. Sollte ich versuchen, nicht mehrere Klassen in derselben Datei zu haben, oder ist das in Ordnung?

Pokus
quelle

Antworten:

90

Ich denke, Sie sollten versuchen, Ihren Code auf 1 Klasse pro Datei zu beschränken.

Ich schlage dies vor, weil es später einfacher sein wird, Ihre Klasse zu finden. Außerdem funktioniert es besser mit Ihrem Versionsverwaltungssystem (wenn sich eine Datei ändert, wissen Sie, dass sich eine bestimmte Klasse geändert hat).

Das einzige Mal, wenn ich denke, dass es richtig ist, mehr als eine Klasse pro Datei zu verwenden, ist, wenn Sie interne Klassen verwenden ... aber interne Klassen befinden sich in einer anderen Klasse und können daher in derselben Datei belassen werden. Die Rollen der inneren Klassen sind stark mit den äußeren Klassen verbunden, daher ist es in Ordnung, sie in derselben Datei zu platzieren.

Patrick Desjardins
quelle
1
Nachdem ich gesehen habe, was Kotlin in einer Datei tun kann, glaube ich, dass einige Dinge wie DTOs in einer Datei enthalten sein könnten.
John Tribe
1
Hinzu kommt, dass die Klassen, die sich in derselben Datei befinden, normalerweise eng miteinander verbunden sind. Dies kann die Bearbeitung erschweren, da es nicht so einfach ist, mehrere Klassen gleichzeitig anzuzeigen. Sie müssen viel scrollen. Eine geteilte Ansicht hilft, aber es ist nicht so einfach, nur ein separates Fenster für jede Datei / Klasse zu haben.
Chad Hedgcock
Was ist mit Autoloading? Wenn Sie mehrere Klassen in einer Quelldatei definieren, wird die Funktion zum automatischen Laden komplexer. siehe stackoverflow.com/questions/37982012/…
Alexander Behling
26

In Java ist eine öffentliche Klasse pro Datei die Funktionsweise der Sprache. Eine Gruppe von Java-Dateien kann in einem Paket gesammelt werden.

In Python sind Dateien jedoch "Module" und haben normalerweise eine Reihe eng verwandter Klassen. Ein Python-Paket ist ein Verzeichnis, genau wie ein Java-Paket.

Dies gibt Python eine zusätzliche Gruppierungsebene zwischen Klasse und Paket.

Es gibt keine richtige Antwort, die sprachunabhängig ist. Es variiert mit der Sprache.

S.Lott
quelle
22

Eine Klasse pro Datei ist eine gute Regel, es ist jedoch angebracht, einige Ausnahmen zu machen. Wenn ich beispielsweise in einem Projekt arbeite, in dem den meisten Klassen Sammlungstypen zugeordnet sind, behalte ich die Klasse und ihre Sammlung häufig in derselben Datei, z.

public class Customer { /* whatever */ }

public class CustomerCollection : List<Customer> { /* whatever */ }

Die beste Faustregel ist, eine Klasse pro Datei beizubehalten, es sei denn, dies macht die Dinge eher schwieriger als einfacher. Da Visual Studios Suchen in Dateien so effektiv ist, müssen Sie wahrscheinlich sowieso nicht viel Zeit damit verbringen, die Dateistruktur zu durchsuchen.

Ryan Lundy
quelle
3
Nein, das ist ein schlechter Rat. Befolgen Sie den Rat der akzeptierten Antwort. Sie sollten das Objekt-Repository von der Klasse trennen, die Sie speichern. Es schafft einfach unnötige Verwirrung.
Hudson
4
@ Hudson Ich sehe oben keinen "Objekt-Repository" -Code.
Ryan Lundy
18

Nein, ich denke nicht, dass es eine ganz schlechte Praxis ist. Damit meine ich im Allgemeinen, dass es am besten ist, eine separate Datei pro Klasse zu haben, aber es gibt definitiv gute Ausnahmefälle, in denen es besser ist, mehrere Klassen in einer Datei zu haben. Ein gutes Beispiel hierfür ist eine Gruppe von Ausnahmeklassen. Wenn Sie ein paar Dutzend davon für eine bestimmte Gruppe haben, ist es wirklich sinnvoll, für jede Klasse mit zwei Zeilen eine separate Datei zu haben? Ich würde nicht streiten. In diesem Fall ist es meiner Meinung nach viel weniger umständlich und einfach, eine Gruppe von Ausnahmen in einer Klasse zu haben.

James
quelle
10

Ich habe festgestellt, dass ich immer dann, wenn ich versuche, mehrere Typen in einer einzigen Datei zu kombinieren, immer wieder zurück gehe und sie trenne, nur weil sie dadurch leichter zu finden sind. Wann immer ich kombiniere, gibt es letztendlich immer einen Moment, in dem ich versuche herauszufinden, ob ich Typ x definiert habe.

Meine persönliche Regel lautet nun, dass jeder einzelne Typ (außer vielleicht für untergeordnete Klassen, bei denen ein Mittelwert eine Klasse innerhalb einer Klasse ist, keine geerbte Klasse) eine eigene Datei erhält.

Daniel Schaffer
quelle
9

Da Ihre IDE Ihnen die Funktion " Navigieren zu " bietet und Sie die Kontrolle über den Namespace in Ihren Klassen haben, lohnen sich die folgenden Vorteile, mehrere Klassen in derselben Datei zu haben, für mich.

Eltern-Kind-Klassen

In vielen Fällen finde ich es sehr hilfreich, geerbte Klassen in ihrer Basis zu haben Basisklassendatei.

Es ist dann ziemlich einfach zu erkennen, welche Eigenschaften und Methoden Ihre untergeordnete Klasse erbt, und die Datei bietet einen schnelleren Überblick über die Gesamtfunktionalität.

Öffentlich: Small-Helper-DTO-Klassen

Wenn Sie mehrere einfache und kleine Klassen für eine bestimmte Funktionalität benötigen, finde ich es ziemlich überflüssig, eine Datei mit allen Referenzen und Einschlüssen für nur eine 4-8-Liner- Klasse zu haben .....

Die Code-Navigation ist auch einfacher, wenn Sie nur über eine Datei scrollen, anstatt zwischen 10 Dateien zu wechseln. Sie ist auch einfacher zu überarbeiten wenn Sie wenn Sie nur eine Referenz anstelle von 10 bearbeiten müssen.

Wenn Sie insgesamt gegen die Iron-Regel von 1 Klasse pro Datei verstoßen, haben Sie zusätzliche Freiheit beim Organisieren Ihres Codes.

Was dann passiert, hängt wirklich von Ihrer IDE, Ihrer Sprache, Ihrer Teamkommunikation und Ihren Organisationsfähigkeiten ab.

Aber wenn Sie diese Freiheit wollen, warum sollten Sie sie für eine eiserne Regel opfern?

Anestis Kivranoglou
quelle
7

Wenn Sie in einem Team arbeiten, erleichtert das Speichern von Klassen in separaten Dateien die Steuerung der Quelle und verringert das Risiko von Konflikten (mehrere Entwickler ändern dieselbe Datei gleichzeitig). Ich denke, es macht es einfacher, den Code zu finden, nach dem Sie auch suchen.

Jim Anderson
quelle
7

Die Regel, nach der ich immer gehe, ist, eine Hauptklasse in einer Datei mit demselben Namen zu haben. Ich kann Hilfsklassen in diese Datei aufnehmen oder nicht, je nachdem, wie eng sie mit der Hauptklasse der Datei verbunden sind. Sind die Support-Klassen eigenständig oder sind sie für sich allein nützlich? Wenn beispielsweise eine Methode in einer Klasse einen speziellen Vergleich zum Sortieren einiger Objekte benötigt, stört es mich nicht, die Vergleichsfunktorklasse in derselben Datei wie die Methode zu bündeln, die sie verwendet. Ich würde nicht erwarten, es woanders zu verwenden, und es macht keinen Sinn, wenn es alleine ist.

Boojum
quelle
6

Es kann aus Sicht der zukünftigen Entwicklung und Wartbarkeit schlecht sein. Es ist viel einfacher, sich zu merken, wo sich die Car-Klasse befindet, wenn Sie eine Car.cs-Klasse haben. Wo würden Sie nach der Widget-Klasse suchen, wenn Widget.cs nicht existiert? Ist es ein Auto-Widget? Ist es ein Engine-Widget? Oh, vielleicht ist es ein Bagel-Widget.

Steven Behnke
quelle
2
Wie unter stackoverflow.com/questions/360643/… erwähnt , müssen Sie mit gängigen Navigationswerkzeugen ohnehin nicht nach Dateien navigieren. Sie navigieren stattdessen nach Klassen / Mitgliedern.
Suma
6

Das einzige Mal, wenn ich Dateispeicherorte in Betracht ziehe, muss ich neue Klassen erstellen. Ansonsten navigiere ich nie nach Dateistruktur. Ich benutze "Gehe zur Klasse" oder "Gehe zur Definition".

Ich weiß, dass dies ein Trainingsproblem ist. Um sich von der physischen Dateistruktur von Projekten zu befreien, ist Übung erforderlich. Es ist aber sehr lohnend;)

Wenn es sich gut anfühlt, sie in dieselbe Datei zu legen, sei mein Gast. Kann das aber nicht mit öffentlichen Klassen in Java machen;)

Krosenvold
quelle
2

Als Faustregel gilt, dass eine Klasse / eine Datei der richtige Weg ist. Ich behalte jedoch oft mehrere Schnittstellendefinitionen in einer Datei. Mehrere Klassen in einer Datei? Nur wenn sie irgendwie sehr eng miteinander verwandt und sehr klein sind (<5 Methoden und Mitglieder)

Treb
quelle
2

Wie so oft in der Programmierung, hängt es stark von der Situation ab.

Wie ist zum Beispiel der Zusammenhalt der betreffenden Klassen? Sind sie eng miteinander verbunden? Sind sie vollständig orthogonal? Sind sie in ihrer Funktionalität verwandt?

Es wäre für ein Webframework nicht unangebracht, ein Allzweck-Widget bereitzustellen. Welche Datei auch immer BaseWidget, TextWidget, CharWidget usw. enthält.

Ein Benutzer des Frameworks würde beim Definieren einer more_widgets-Datei, die die zusätzlichen Widgets enthält, die er von den Framework-Widgets für seinen spezifischen Domänenbereich ableitet, nicht überfordert sein.

Wenn die Klassen orthogonal sind und nichts miteinander zu tun haben, wäre die Gruppierung in eine einzelne Datei tatsächlich künstlich. Angenommen, eine Anwendung zum Verwalten einer Roboterfabrik, in der Autos gebaut werden. Eine Datei mit dem Namen Teile, die CarParts und RobotParts enthalten, wäre sinnlos. Es besteht wahrscheinlich kein großer Zusammenhang zwischen der Bestellung von Ersatzteilen für die Wartung und den Teilen, die das Werk herstellt. Eine solche Verbindung würde keine Informationen oder Kenntnisse über das von Ihnen entworfene System hinzufügen.

Vielleicht ist die beste Faustregel, Ihre Auswahl nicht durch eine Faustregel einzuschränken. Faustregeln werden für eine First-Cut-Analyse erstellt oder um die Auswahl derer einzuschränken, die nicht in der Lage sind, gute Entscheidungen zu treffen. Ich denke, die meisten Programmierer würden gerne glauben, dass sie in der Lage sind, gute Entscheidungen zu treffen.

Wayne Werner
quelle
2

Sie sollten dies unterlassen, es sei denn, Sie haben einen guten Grund.

Eine Datei mit mehreren kleinen verwandten Klassen kann besser lesbar sein als mehrere Dateien. Wenn Sie beispielsweise 'Fallklassen' verwenden, um Vereinigungstypen zu simulieren, besteht eine starke Beziehung zwischen jeder Klasse. Die Verwendung derselben Datei für mehrere Klassen hat den Vorteil, dass sie für den Leser visuell gruppiert werden.

In Ihrem Fall scheinen ein Auto und eine Tür überhaupt nicht verwandt zu sein, und es wäre unerwartet, die Türklasse in der Datei car.cs zu finden.

Eldritch Rätsel
quelle
1

Eine Klasse pro Datei ist einfacher zu pflegen und für alle anderen, die sich Ihren Code ansehen, viel klarer. Es ist auch obligatorisch oder in einigen Sprachen sehr eingeschränkt.

In Java können Sie beispielsweise nicht mehrere Klassen der obersten Ebene pro Datei erstellen. Sie müssen sich in separaten Dateien befinden, in denen Klassenname und Dateiname identisch sind.

Robin
quelle
1

Die Smalltalk-Antwort lautet: Sie sollten keine Dateien haben (zum Programmieren). Sie machen die Versionierung und Navigation schmerzhaft.

Stephan Eggermont
quelle