2008-12-11 6 views
50

Ich hatte eine Klasse für eine Datei. Zum Beispiel car.cs hat die Klasse Auto. Aber während ich mehr Klassen programmiere, möchte ich sie zu derselben Datei hinzufügen. Zum Beispiel car.cs hat die Klasse Auto und die Tür Klasse usw.Ist es eine schlechte Übung, mehrere Klassen in derselben Datei zu haben?

Meine Frage für Java, C# gut, PHP oder eine andere Programmiersprache. Sollte ich versuchen, mehrere Klassen in der gleichen Datei zu haben oder ist es in Ordnung?

Antwort

60

Ich denke, Sie sollten versuchen, Ihren Code auf 1 Klasse pro Datei zu halten.

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

Die einzige Zeit, die ich denke, es ist richtig, mehr als eine Klasse pro Datei zu verwenden ist, wenn Sie interne Klassen verwenden ... aber interne Klassen sind innerhalb einer anderen Klasse und können daher in der gleichen Datei verlassen werden. Die Rollen der inneren Klassen sind stark mit den äußeren Klassen verbunden, daher ist es in Ordnung, sie in dieselbe Datei zu platzieren.

8

Ich habe festgestellt, dass, wenn ich mehrere Arten in einer einzigen Datei, habe ich immer am Ende gehen zurück und trennt sie einfach, weil es ihnen leichter macht zu finden zu verbinden versuchen. Immer wenn ich mich verbinde, gibt es immer einen Moment, in dem ich versuche herauszufinden, wie ich den Typ x definiert habe.

So, jetzt meine persönliche Regel ist, dass jeder einzelne Typ (außer vielleicht für Kind-Klassen, von denen eine eine Klasse innerhalb einer Klasse bedeuten, nicht eine vererbte Klasse) erhält eine eigene Datei.

4

Es kann aus der Perspektive der zukünftigen Entwicklung und Wartbarkeit schlecht sein. Es ist viel einfacher, sich zu erinnern, wo der Car-Kurs ist, wenn Sie eine Car.cs-Klasse haben. Wo würdest du 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.

+1

Wie in http://stackoverflow.com/questions/360643/is-it-a-bad-practice-to-have-multiple-classes-in-the-same-file/360675#360675 erwähnt, mit gemeinsamen Navigationstools müssen Sie sowieso nicht nach Dateien navigieren. Sie navigieren stattdessen nach Klassen/Mitgliedern. – Suma

6

Wenn Sie in einem Team arbeiten, Klassen in separaten Dateien zu halten es einfacher, die Quelle zu kontrollieren und reduziert das Risiko von Konflikten (mehrere Entwickler die gleiche Datei zur gleichen Zeit zu ändern). Ich denke, es macht es einfacher, den Code zu finden, nach dem Sie auch suchen.

5

Die nur Zeit Ich betrachte Dateistandorte ist, wenn ich neue Klassen erstellen muss. Ansonsten I nie navigieren nach Dateistruktur. I Verwenden Sie "Gehe zur Klasse" oder "Gehe zur Definition".

Ich weiß, dass dies ein Trainingsproblem ist; Befreiung von der physischen Dateistruktur von Projekten erfordert Übung. Es ist sehr lohnend, obwohl;)

Wenn es sich gut anfühlt, sie in der gleichen Datei zu setzen, sei mein Gast. Cant tun, wenn auch mit öffentlichen Klassen in Java;)

3

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

1

Eine Klasse pro Datei ist einfacher zu pflegen und vieles mehr klar für jemand anderes in Ihrem Code suchen. Es ist auch obligatorisch oder in einigen Sprachen sehr eingeschränkt.

In Java zum Beispiel können Sie nicht mehrere Top-Level-Klassen pro Datei erstellen, sie müssen sich in separaten Dateien befinden, in denen der Klassenname und der Dateiname identisch sind.

22

In Java ist eine öffentliche Klasse pro Datei ist die Art, wie die Sprache funktioniert. 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 Ebene der Gruppierung zwischen Klasse und Paket.

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

5

Die Regel, die ich immer gehe, ist eine Haupt Klasse in einer Datei mit dem gleichen Namen zu haben. Je nachdem, wie stark sie mit der Hauptklasse der Datei gekoppelt sind, kann ich Helper-Klassen in diese Datei aufnehmen oder nicht. Sind die Support-Klassen eigenständig oder sind sie alleine 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 zu bündeln wie die Methode, die sie verwendet. Ich würde nicht erwarten, es woanders zu verwenden, und es macht keinen Sinn, dass es für sich allein ist.

15

Eine Klasse pro Datei ist eine gute Regel, aber es ist angebracht, einige Ausnahmen zu machen. Zum Beispiel, wenn ich in einem Projekt zu arbeiten, wo ich die meisten Klassen Sammlung Typen zugeordnet haben, oft werde ich die Klasse halten und seine Sammlung in der gleichen Datei, zB:

public class Customer { /* whatever */ } 

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

Die beste Faustregel zu Behalten Sie eine Klasse pro Datei bei, außer wenn das anfängt, die Dinge schwieriger zu machen als einfacher. Da das Suchen in Dateien von Visual Studio so effektiv ist, werden Sie wahrscheinlich nicht viel Zeit damit verbringen müssen, die Dateistruktur durchzusehen.

+2

Nein. Das ist ein schlechter Rat. Nehmen Sie den Rat der angenommenen Antwort. Sie sollten das Objekt-Repository von der zu speichernden Klasse trennen. Es schafft einfach unnötige Verwirrung. – Hudson

2

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

Zum Beispiel, was ist die Kohäsion der Klassen in Frage? Sind sie eng gekoppelt? Sind sie vollständig orthogonal? Sind sie in der Funktionalität verwandt?

Es wäre nicht für einen Web-Framework aus der Reihe sein, einen Mehrzweck widgets.whatever Datei zu liefern, enthält BaseWidget, TextWidget, CharWidget usw.

Ein Benutzer des Rahmens würde nicht aus der Reihe sein, bei der Festlegung eine more_widgets-Datei, die die zusätzlichen Widgets enthält, die sie von den Framework-Widgets für ihren spezifischen Domänenbereich ableiten.

Wenn die Klassen orthogonal sind und nichts miteinander zu tun haben, wäre die Gruppierung in eine einzige Datei tatsächlich künstlich. Übernehmen Sie eine Anwendung zur Verwaltung einer Roboterfabrik, die Autos baut. Eine Datei, die Teile mit CarParts und RobotParts genannt wird, wäre sinnlos ... zwischen der Bestellung von Ersatzteilen für die Wartung und den Teilen, die die Fabrik herstellt, wird wahrscheinlich keine große Beziehung bestehen. Ein solcher Beitritt würde keine Informationen oder Kenntnisse über das System hinzufügen, das Sie entwerfen.

Vielleicht die beste Faustregel ist, beschränken Sie Ihre Entscheidungen nicht durch eine Faustregel. Faustregeln werden für eine erste Schnittanalyse erstellt oder um die Auswahl derjenigen einzuschränken, die keine guten Entscheidungen treffen können. Ich denke, die meisten Programmierer würden gerne glauben, dass sie in der Lage sind, gute Entscheidungen zu treffen.

14

Nein, ich denke nicht, dass es eine völlig schlechte Übung ist. Was ich damit meine, ist 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, eine Menge Klassen in einer Datei zu haben. Ein gutes Beispiel hierfür ist eine Gruppe von Exception-Klassen. Wenn Sie einige Dutzend für eine bestimmte Gruppe haben, macht es wirklich Sinn, eine separate Datei für jede Liner-Klasse zu haben? Ich würde nicht streiten. In diesem Fall ist eine Gruppe von Ausnahmen in einer Klasse viel weniger umständlich und einfach IMHO.

1

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

2

Sie sollten dies nicht tun, außer 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 Unionstypen zu simulieren, gibt es eine starke Beziehung zwischen jeder Klasse. Die Verwendung derselben Datei für mehrere Klassen hat den Vorteil, dass sie visuell für den Leser gruppiert werden.

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

2

Da Ihr IDE Bietet Ihnen mit einem „Navigieren Sie zu“ Funktionalität und Sie haben eine gewisse Kontrolle über Namensräume in Ihren Klassen dann die folgenden Vorteile mehrerer Klassen in derselben Datei haben, sind recht lohnt sich für mich .

Eltern - Kind Klassen

In vielen Fällen finde ich es sehr hilfreich Klassen innerhalb ihrer Basis Klassendatei geerbt haben.

Es ist ziemlich einfach zu sehen, welche Eigenschaften und Methoden Ihre Kindklasse erbt und die Datei bietet einen schnelleren Überblick über die gesamte Funktionalität.

öffentlich: Small - Helper - DTO Klassen

Wenn Sie mehr Ebene und kleine Klassen für eine spezifische Funktionalität ich finde es ziemlich überflüssig brauchen eine Datei mit allen Referenzen zu haben und nur eine 4-8 Liner Klasse umfasst für .....

-Code Navigation auch einfacher ist, etwas mehr als o Scrollen ne Datei anstelle des Umschaltens zwischen 10 Dateien ... Es ist auch einfacher zu refactor wenn man statt 10 nur eine Referenz bearbeiten .....

Insgesamt ist die Eisen Regel von 1 Klasse pro Datei zu brechen bietet einige zusätzliche Freiheit, um Ihren Code zu organisieren.

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

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