Aikido

Warum Sie eine Klasse pro Datei verwenden sollten: bessere Codeorganisation und Navigation

Lesbarkeit

Regel

Eine Klasse pro Datei.
Mehrere Klassen in a einzelnen Datei machen Code
Organisation unübersichtlich und schwieriger zu navigieren.

Unterstützte Sprachen: 45+

Einführung

Wenn mehrere Klassen in einer einzigen Datei zusammengefasst werden, ist es schwierig, bestimmte Klassen zu finden, wenn man in einer Codebasis navigiert. Entwickler, die nach UserRepository wird es nicht schnell finden, wenn es in einer Datei namens datenbank.js neben fünf anderen Klassen. Dies verstößt gegen das Prinzip der geringsten Überraschung und verlangsamt die Entwicklung, da die Teammitglieder Zeit mit der Suche nach Klassendefinitionen verschwenden.

Warum das wichtig ist

Wartbarkeit des Codes: Mehrere Klassen pro Datei schaffen unklare Grenzen zwischen den Zuständigkeiten. Wenn eine Klasse geändert werden muss, müssen die Entwickler eine Datei mit nicht verwandten Klassen öffnen, was die kognitive Belastung erhöht und das Risiko erhöht, versehentlich den falschen Code zu ändern.

Navigation und Auffindbarkeit: IDEs und Texteditoren haben Schwierigkeiten, eine genaue "Go-to-Definition" zu liefern, wenn mehrere Klassen eine Datei gemeinsam nutzen. Die Entwickler verbringen viel Zeit mit der Suche in den Dateien, anstatt direkt zu der benötigten Klasse zu springen. Dies wird bei großen Codebasen mit Hunderten von Klassen noch verstärkt.

Konflikte bei der Versionskontrolle: Wenn sich mehrere Klassen eine Datei teilen, führen Änderungen an verschiedenen Klassen durch verschiedene Entwickler zu Konflikten bei der Zusammenführung. Separate Dateien ermöglichen eine parallele Entwicklung ohne Koordinationsaufwand, da jeder Entwickler in seiner eigenen Datei arbeitet.

Code-Beispiele

❌ Nicht konform:

// database.js
class UserRepository {
    async findById(id) {
        return db.users.findOne({ id });
    }
}

class OrderRepository {
    async findByUser(userId) {
        return db.orders.find({ userId });
    }
}

class ProductRepository {
    async findInStock() {
        return db.products.find({ stock: { $gt: 0 } });
    }
}

module.exports = { UserRepository, OrderRepository, ProductRepository };

Warum das falsch ist: Drei voneinander unabhängige Repository-Klassen in einer Datei mit dem Namen datenbank.js. Auf der Suche nach OrderRepository erfordert das Wissen, dass es in datenbank.js statt OrderRepository.js. Datei-Änderungen betreffen mehrere Klassen und führen zu unnötigen Konflikten beim Zusammenführen.

✅ Konform:

// UserRepository.js
class UserRepository {
    async findById(id) {
        return db.users.findOne({ id });
    }
}
module.exports = UserRepository;

// OrderRepository.js
class OrderRepository {
    async findByUser(userId) {
        return db.orders.find({ userId });
    }
}
module.exports = OrderRepository;

// ProductRepository.js
class ProductRepository {
    async findInStock() {
        return db.products.find({ stock: { $gt: 0 } });
    }
}
module.exports = ProductRepository;

Warum das wichtig ist: Jede Klasse in ihrer eigenen Datei macht die Navigation vorhersehbar. IDEs können direkt springen zu OrderRepository.js bei der Suche nach der Klasse. Änderungen an einem Repository wirken sich nicht auf andere aus, wodurch unnötige Merge-Konflikte vermieden werden.

Schlussfolgerung

Benennen Sie Dateien nach der Klasse, die sie enthalten, um eine vorhersehbare Navigation zu ermöglichen. Diese Konvention eignet sich für große Codebasen, in denen es wichtig ist, bestimmte Klassen schnell zu finden. Die zusätzlichen Dateien sind die organisatorische Klarheit wert, die sie bieten.

FAQs

Haben Sie Fragen?

Wie sieht es mit kleinen Helferklassen oder Privatunterricht aus?

Kleine Hilfsklassen, die nur von einer übergeordneten Klasse verwendet werden, können in derselben Datei bleiben, wenn es sich wirklich um Implementierungsdetails handelt. Wenn Hilfsklassen jedoch wiederverwendet werden oder über 20-30 Zeilen hinausgehen, sollten sie extrahiert werden. Private Klassen, die nur dazu dienen, eine öffentliche Klasse zu unterstützen, sind sinnvolle Ausnahmen.

Gilt das auch für TypeScript-Schnittstellen und -Typen?

Typen und Schnittstellen, die von einer Klasse verwendet werden, können sich in derselben Datei befinden. Gemeinsame Typen, die in mehreren Dateien verwendet werden, gehören jedoch in ihre eigenen Typdefinitionsdateien. Entscheidend ist, ob die Definition nur in dieser Datei verwendet oder auch anderswo benötigt wird.

Was ist mit Sprachen wie Python mit mehreren Klassen in der Standardpraxis?

Die Python-Konventionen unterscheiden sich, aber das Prinzip gilt immer noch: gruppieren Sie verwandte Klassen, wenn sie ein zusammenhängendes Modul bilden, aber vermeiden Sie es, nicht verwandte Klassen zu mischen. Eine models.py mit User und UserProfile ist sinnvoll. Eine utils.py mit zwanzig nicht verwandten Klassen nicht.

Wie organisiere ich verwandte Klassen wie Eltern- und Kindklassen?

Legen Sie sie in getrennten Dateien im selben Verzeichnis ab. Für Animal und Dog verwenden Sie animals/Animal.js und animals/Dog.js. Die Verzeichnisstruktur zeigt die Zusammenhänge auf, während eine Klasse pro Datei beibehalten wird. Dies ist besser skalierbar als die Bündelung verwandter Klassen in einer Datei.

Was ist, wenn beim Extrahieren von Klassen viele kleine Dateien entstehen?

Viele kleine Dateien sind besser als wenige große Dateien. Moderne IDEs handhaben Tausende von Dateien effizient. Die Navigation im Dateisystem ist schneller als die Suche in großen Dateien. Die Klarheit, genau zu wissen, wo sich jede Klasse befindet, überwiegt die Wahrnehmung von "zu vielen Dateien".

Starten Sie kostenlos

Sichern Sie Ihren Code, Cloud und die Laufzeit in einem zentralen System.
Finden und beheben Sie Schwachstellen schnell  automatisch.

Keine Kreditkarte erforderlich | Scanergebnisse in 32 Sekunden.