Aikido

Warum Sie eine Klasse pro Datei verwenden sollten: zur Verbesserung der Code-Organisation 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+

Einleitung

Das Ablegen mehrerer Klassen in einer einzigen Datei erschwert das Auffinden spezifischer Klassen beim Navigieren durch eine Codebasis. Entwickelnde, die nach UserRepository findet es nicht schnell, wenn es in einer Datei namens vergraben ist database.js neben fünf anderen Klassen. Dies verstößt gegen das Prinzip der geringsten Überraschung und verlangsamt die Entwicklung, da Teammitglieder Zeit mit der Suche nach Klassendefinitionen verschwenden.

Warum es wichtig ist

Code-Wartbarkeit: Mehrere Klassen pro Datei schaffen unklare Grenzen zwischen Verantwortlichkeiten. Wenn eine Klasse geändert werden muss, müssen Entwickelnde eine Datei öffnen, die nicht verwandte Klassen enthält, was die kognitive Belastung und das Risiko erhöht, versehentlich falschen Code zu ändern.

Navigation und Auffindbarkeit: IDEs und Texteditoren haben Schwierigkeiten, eine präzise „Gehe zu Definition“-Funktion bereitzustellen, wenn mehrere Klassen eine Datei teilen. Entwickelnde verbringen Zeit mit der Suche innerhalb von Dateien, anstatt direkt zu der benötigten Klasse zu springen. Dies verstärkt sich in großen Codebasen mit Hunderten von Klassen.

Versionskontrollkonflikte: Wenn mehrere Klassen eine Datei teilen, führen Änderungen an verschiedenen Klassen durch unterschiedliche Entwickelnde zu Merge-Konflikten. Separate Dateien ermöglichen parallele Entwicklung ohne Koordinationsaufwand, da jede*r Entwickelnde in der 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 es falsch ist: Drei unabhängige Repository-Klassen in einer Datei namens database.js. Suche nach OrderRepository erfordert das Wissen, dass es sich in... database.js anstatt OrderRepository.js. Dateiänderungen betreffen mehrere Klassen, was zu unnötigen Merge-Konflikten führt.

✅ 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 dies wichtig ist: Jede Klasse in einer 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 eliminiert werden.

Fazit

Benennen Sie Dateien nach der Klasse, die sie enthalten, für eine vorhersehbare Navigation. Diese Konvention skaliert gut für große Codebasen, bei denen das schnelle Auffinden spezifischer Klassen wichtig ist. Die zusätzlichen Dateien sind die organisatorische Klarheit wert, die sie bieten.

FAQs

Haben Sie Fragen?

Was ist mit kleinen Hilfsklassen oder privaten Klassen?

Kleine Hilfsklassen, die nur von einer übergeordneten Klasse verwendet werden, können in derselben Datei verbleiben, wenn sie wirklich Implementierungsdetails sind. Werden Hilfsklassen jedoch wiederverwendet oder überschreiten sie 20-30 Zeilen, sollten sie extrahiert werden. Private Klassen, die nur zur Unterstützung einer öffentlichen Klasse existieren, sind vernünftige Ausnahmen.

Gilt dies für TypeScript-Interfaces und -Typen?

Typen und Interfaces, die von einer Klasse verwendet werden, können in derselben Datei liegen. Gemeinsam genutzte Typen, die über mehrere Dateien hinweg verwendet werden, gehören jedoch in eigene Typdefinitionsdateien. Entscheidend ist, ob die Definition nur von dieser Datei verwendet wird oder anderswo benötigt wird.

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

Python-Konventionen unterscheiden sich, aber das Prinzip bleibt bestehen: Gruppieren Sie verwandte Klassen, wenn sie ein kohärentes Modul bilden, vermeiden Sie jedoch das Mischen nicht verwandter Klassen. Eine models.py mit User und UserProfile ist sinnvoll. Eine utils.py mit zwanzig nicht verwandten Klassen ist es nicht.

Wie organisiere ich verwandte Klassen wie Eltern- und Kindklassen?

Legen Sie sie in separate Dateien innerhalb desselben Verzeichnisses ab. Für Animal und Dog verwenden Sie animals/Animal.js und animals/Dog.js. Die Verzeichnisstruktur zeigt Beziehungen auf, während pro Datei eine Klasse beibehalten wird. Dies skaliert besser, als verwandte Klassen in einer Datei zu bündeln.

Was, wenn das Extrahieren von Klassen viele kleine Dateien erzeugt?

Viele kleine Dateien sind wenigen großen Dateien vorzuziehen. Moderne IDEs verarbeiten Tausende von Dateien effizient. Die Navigation im Dateisystem ist schneller als die Suche innerhalb großer Dateien. Die Klarheit, genau zu wissen, wo jede Klasse liegt, überwiegt die Wahrnehmung von „zu vielen Dateien“.

Werden Sie jetzt sicher.

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

Keine Kreditkarte erforderlich | Scan-Ergebnisse in 32 Sek.