Aufteilen in Dateien - wie viel Aufteilen?

9

Wenn ich sage, ich habe eher ein hierarchisches Entitätsframework als ein Komponentenmodell. So etwas wie:
(Ja, das ist erfunden)

Waffe-> Waffe-> Automatische Waffe-> MP44
Oder eher ein klassisches Beispiel:
Entität-> Bewegliche Entität-> Feind-> Gehender Feind

Wie weit würden Sie die Quell- / Header-Dateien für Lesbarkeit und Organisation aufteilen? Ist es am besten, etwas wie Entity.cpp, MovableEntity.cpp, Enemy.cpp usw. zu wählen, oder wäre ein Ansatz wie Entity.cpp [mit Entity und MovableEntity] und Enemy.cpp [mit Enemy und WalkingEnemy] besser? (Oder auf eine sprachunabhängigere Weise eine Enemy-Datei und eine Entity-Datei im Vergleich zu einer Datei für jede Klasse?)
Würde dies auch etwas anderes als Lesbarkeit und Organisation beeinflussen?

Die kommunistische Ente
quelle
1
Nitpicky, aber ich denke nicht, dass language-agnostices ein geeignetes Tag ist, da es stark von der Sprache abhängt, die Sie hinsichtlich der Nebenwirkungen verwenden.
Tetrad
Guter Punkt, ich denke ich kann retag.
Die kommunistische Ente

Antworten:

12

Dies ist völlig eine Frage der Präferenz. Ich persönlich glaube jedoch, dass es am besten ist, auf der Seite von mehr Dateien zu irren. Java erfordert eine Klasse pro Datei , wobei der Dateiname beispielsweise mit dem Klassennamen identisch ist. Sie tun dies nach Richtlinien, um diese bewährte Methode durchzusetzen (obwohl Sie Unterklassen haben können, die dies im Grunde umgehen).

Außerdem können Quellcodeverwaltungssysteme Änderungen in einer Datei ziemlich gut zusammenführen, aber es ist weniger problematisch, wenn Sie nur in völlig separaten Dateien arbeiten. Sie können auch leichter sehen, wer welche Klasse geändert hat. Angenommen, ein anderer Entwickler ändert die Datei AllEntities.h. Sie haben keine Ahnung, welche Entität (oder Entitäten) er geändert hat, bis Sie die Datei öffnen und die Diff-Ausgabe betrachten.

Es ist jedoch großartig, kleine Strukturen und Aufzählungen, die sich auf die Klasse beziehen, in der Datei einer Klasse zu gruppieren . Wenn Sie eine Aufzählung haben, die nur von einer einzelnen Klasse verwendet wird, warum sollten Sie sie dann in eine eigene Datei aufteilen? Setzen Sie sie einfach zusammen. Wenn es jedoch von einer anderen Klasse verwendet wird (dh ein anderes Klassenmitglied ist vom Typ dieser Aufzählung), ist es an der Zeit, ihm eine eigene Datei zu geben.

Ricket
quelle
Einverstanden. Die Komplexität Ihrer Typen sollte auf jeden Fall ein Faktor sein. Wenn Ihre Sprache Teilklassen unterstützt (oder wenn Mitgliedsimplementierungen ähnlich wie in C ++ organisiert werden können), würde ich sogar empfehlen, besonders komplexe Typen in mehrere Dateien aufzuteilen. Wenn Ihre Klasse beispielsweise eine (große) Schnittstelle implementieren muss, der Code jedoch ziemlich allgemein und für den Rest nicht besonders relevant ist, können Sie diesen Code in eine separate Datei / Teilklasse aufteilen. Ich denke, bei Aufzählungstypen können Sie alle Aufzählungen für einen bestimmten Namespace in einer einzigen Datei platzieren.
Mike Strobel
1
Bedeutet das Gruppieren Ihrer Aufzählungen nicht, dass das Ändern eines einzelnen Werts eine Neukompilierung jeder Datei bewirkt, die eine Aufzählung in diesem Namespace verwendet?
Die kommunistische Ente
Nun, das hängt wirklich von der Sprache ab, aber ja, es könnte sicherlich diesen Effekt haben. Es ist kein wirkliches Problem für mich, da ich hauptsächlich in C # entwickle (keine Datei-für-Datei-Kompilierung), aber es könnte in C ++ und anderen Sprachen problematisch sein. Wie immer sind sprachspezifische Faktoren zu berücksichtigen, und das wäre einer von ihnen :).
Mike Strobel
2

Viele Sprachen außerhalb von C / C ++ legen Einschränkungen für Dateien fest. Ricket erwähnte Javas 'eine Klasse pro Datei'; Python verwendet Dateien als Namespaces. andere Sprachen kopieren oft den Geist dieser.

Wenn Sie C oder C ++ verwenden, bedeuten mehr enthaltene Dateien im Allgemeinen längere Kompilierungszeiten pro Datei. Andererseits bedeutet weniger mehr Kompilierung, wenn kleine Änderungen vorgenommen werden. Da Aufzählungen in C nicht vorwärts deklariert werden können, sollten Sie sie aus Gründen der Abhängigkeit immer in Header-Dateien ablegen, die nur andere Aufzählungen enthalten.

Ansonsten ist Javas "eine Datei pro Klasse" vernünftig, aber Java unterstützt seit langem innere Klassen - wie einen Container und eine innere Klasse seines Iterators. In ähnlicher Weise möchten Sie in jeder anderen Sprache wahrscheinlich einen dominanten Datensatz / Struktur / Klasse / Typ / Schnittstelle / Blorb pro Header, können aber auch verwandte Helfer oder Container einbeziehen.

(Sie müssen kein Komponentenmodell verwenden, aber wenn Sie eine solche tiefe und spezifische Klassenhierarchie haben, werden Sie sich später selbst hassen.)


quelle
Ich habe die Hierarchie als Beispiel verwendet; Ich hatte das Gefühl, es betonte, was ich besser meinte. Im eigentlichen Code strebe ich nach Komponenten.
Die kommunistische Ente