14 Stimmen

Was sind die Vor- und Nachteile der Implementierung von Klassen in Header-Dateien?

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?

26voto

Kristopher Johnson Punkte 78933

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

17voto

Aaron Punkte 8935

Nun - ein Problem ist, dass sich Implementierungen in der Regel viel häufiger ändern als Klassendefinitionen - so dass man bei einem großen Projekt am Ende bei jeder kleinen Änderung die ganze Welt neu kompilieren muss.

6voto

Eric Punkte 6166

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.

5voto

jalf Punkte 235501

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.

2voto

Steven Keith Punkte 1759

Der größte Nachteil (abgesehen von den langwierigen Builds) ist, dass es keine klare Trennung von Schnittstelle und Implementierung gibt.

Idealerweise sollten Sie die Implementierung einer intuitiven und gut dokumentierten Schnittstelle nicht sehen müssen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X