Ich liebe das Konzept von DRY (don't repeat yourself [oops]), doch das C++-Konzept der Header-Dateien verstößt gegen diese Regel der Programmierung. Gibt es einen Nachteil, wenn ein Klassenmitglied vollständig im Header definiert wird? Wenn es für Vorlagen richtig ist, warum dann nicht für normale Klassen? Ich habe einige Ideen für Nachteile und Vorteile, aber was sind Ihre?
Antworten
Zu viele Anzeigen?Mögliche Vorteile, alles in Header-Dateien zu packen:
- Weniger Redundanz (was zu einfacheren Änderungen, einfacherem Refactoring usw. führt)
- Kann dem Compiler/Linker bessere Möglichkeiten zur Optimierung bieten
- Oft leichter in ein bestehendes Projekt zu integrieren
Mögliche Nachteile, wenn man alles in Header-Dateien unterbringt:
- Längere Kompilier-/Link-Zyklen
- Verlust der Trennung von Schnittstelle und Implementierung
- Könnte zu schwer aufzulösenden zirkulären Abhängigkeiten führen
- Viel Inlining könnte die Größe der ausführbaren Datei erhöhen
- Verhindert die Binärkompatibilität von gemeinsam genutzten Bibliotheken/DLLs
- Verärgert Mitarbeiter, die die traditionellen Methoden der Verwendung von C++ bevorzugen
Der Hauptgrund, eine Klasse nicht in der Header-Datei zu implementieren, ist: Müssen die Konsumenten Ihrer Klasse die Details der Implementierung kennen? Die Antwort ist fast immer nein. Sie wollen nur wissen, welche Schnittstelle sie verwenden können, um mit der Klasse zu interagieren. Wenn die Implementierung der Klasse im Header sichtbar ist, wird es viel schwieriger zu verstehen, was diese Schnittstelle ist.
Neben Überlegungen zur Kompaktheit und zur Trennung von Schnittstelle und Implementierung gibt es auch kommerzielle Beweggründe. Wenn Sie eine Bibliothek entwickeln, um sie zu verkaufen, möchten Sie (wahrscheinlich) die Implementierungsdetails der Bibliothek, die Sie verkaufen, nicht weitergeben.
Du wiederholst dich nicht. Sie schreiben nur den Code einmal en un Kopfzeile. Er wird vom Präprozessor wiederholt, aber das ist nicht Ihr Problem und stellt keinen Verstoß gegen DRY dar.
Wenn es für Vorlagen richtig ist, warum nicht auch für normale Klassen?
Es geht nicht wirklich darum, dass es die rechts was man für Vorlagen tun kann. Es ist einfach die einzige Möglichkeit, die im Allgemeinen wirklich funktioniert.
Wie auch immer, wenn Sie eine Klasse in einem Header implementieren, haben Sie die folgenden Vor- und Nachteile:
- Die vollständige Implementierung ist überall sichtbar, wo sie verwendet wird, was es dem Compiler leicht macht, sie bei Bedarf einzubinden.
- Derselbe Code wird mehrfach geparst und kompiliert, was zu höheren Kompilierzeiten führt.
- Andererseits, wenn alles in den Headern steht, kann das zu weniger Übersetzungseinheiten führen, so dass der Compiler weniger oft laufen muss. Letztendlich könnte man mit einer einzigen Übersetzungseinheit enden, die alles nur einmal enthält, was zu sehr schnellen Kompilierungen führen kann.
Und... das war's, wirklich.
Der meiste Code befindet sich in den Kopfzeilen, aber das liegt daran, dass der meiste Code aus Vorlagen besteht.
- See previous answers
- Weitere Antworten anzeigen