Implementation im Headerfile



  • Beim Lernen, was schönes Design ist, habe ich mir die Boostbibliothek angeschaut. Nun sieht das so aus, dass meine Headerfiles eine Mischung aus Templates, "normalen" Klassen und Klassen mit virtuellen Funktionen/Destruktoren sind, deren Funktionen gleich implementiert wurden. Die sind meistens eine oder zwei, maximal acht Zeilen, lang. Dazu kommen noch ein paar inline-Funktionen. Das führt dazu, dass bei halbwegs trivialen Klassen das cpp-File, falls vorhanden, viel kleiner als der Header ist.

    Jetzt bin ich über den Coding Style von Chromium gestolpert und da ist es geradezu ein No-Go das zu machen, selbst bei den einfachsten Destruktoren.
    Begründet wird es mit der Performanz.

    Ich finde es übersichtlicher, alles gleich im Header zu implementieren, aber das bringt mich zum Zweifeln. Daher die Frage: Wie handhabt ihr die Trennung von Header und Code?



  • Kann man nicht pauschal sagen. Ist die Klasse kein Template und erzeugen die Funktionen mehr als nur ein wenig Code, dann pack ichs meistens in die cpp. templates packe ich ganz gerne in irgendwelche Dateien die ich am Ende inline. Das empfinde ich als lesbarer, wenn ich nur mal eben die Datei öffnen will, um schnell ein Detail nachzuschauen.



  • Definitionen tut man aus mindestens zwei Gründen nicht in Header:

    Ein Header muss bei jedem #include desselben geparst werden, alles wird N-mal statt einmal kompiliert. Das dauert einfach länger bei größeren Projekten.

    Wenn zwei Klassen einander benützen, müssen sie die Definition der anderen kennen. Zwei Header können sich aber nicht gegenseitig einbinden.

    In anderen Sprachen wie C# gibt es das Problem nicht, weil Klassen automatisch überall im Projekt bekannt sind und sich gegenseitig verwenden können. Trennung von Header und Source nicht nötig und von vornherein nicht gewollt.



  • Ich finde es übersichtlicher, alles gleich im Header zu implementieren, aber das bringt mich zum Zweifeln.

    Tja, ich nicht. Dann nimm doch gleich Java, da ist es so. Einfach alles in eine Datei kloppen.

    Das führt dazu, dass bei halbwegs trivialen Klassen das cpp-File, falls vorhanden, viel kleiner als der Header ist.

    Kleine Klassen fasse ich in einem Header bzw. einer cpp-Datei zusammen, sofern sie semantisch zusammengehoeren.



  • designatius schrieb:

    Jetzt bin ich über den Coding Style von Chromium gestolpert und da ist es geradezu ein No-Go das zu machen, selbst bei den einfachsten Destruktoren.
    Begründet wird es mit der Performanz.

    Das halte ich für Unsinn. Wie so oft in Styleguides.



  • designatius schrieb:

    Das führt dazu, dass bei halbwegs trivialen Klassen das cpp-File, falls vorhanden, viel kleiner als der Header ist.

    Ja. Einige sind außer dem #include "header" völlig leer. (Die prüfen dann nur noch, daß ihre zugehörigen Header self-sufficient sind.)



  • knivil schrieb:

    Kleine Klassen fasse ich in einem Header bzw. einer cpp-Datei zusammen, sofern sie semantisch zusammengehoeren.

    Das mache ich eigentlich nur bei Template-Meta-Zeugs.



  • otze schrieb:

    Das empfinde ich als lesbarer, wenn ich nur mal eben die Datei öffnen will, um schnell ein Detail nachzuschauen.

    Meine (inline-)Klassen sind nie grösser als eine Bildschirmhöhe und ein {} beim Konstruktor anstelle eines Semikolons sehe ich als gleich lesbar an. Bei Einzeilern wie { v.visit(*this); } sehe ich das ähnlich, dann weiss ich auch gleich wie die Funktion gemeint ist.

    @TyRoXx: Bei mir wird nicht jeder Header von jedem anderen Header eingebunden und die Kompilationsdauer ist mir nicht so wichtig wie klarer Code.
    Bitte: Überzeuge mich, aber mit anderen Argumenten.

    knivil schrieb:

    Dann nimm doch gleich Java, da ist es so. Einfach alles in eine Datei kloppen.

    Wenn der Zwang von einer strikten Trennung von Header und Code der einzige Unterschied zwischen C++ und Java wäre ... dann würde ich vielleicht sogar auf Java umsteigen.

    Das mit dem self-sufficient ist ein guter Tipp, volkard.

    volkard schrieb:

    knivil schrieb:

    Kleine Klassen fasse ich in einem Header bzw. einer cpp-Datei zusammen, sofern sie semantisch zusammengehoeren.

    Das mache ich eigentlich nur bei Template-Meta-Zeugs.

    Hmm volkard, müsste man dich damit der Java-Programmierung bezichtigen?
    Unter gewissen Umständen sind bei mir ganze Vererbungshierarchien in einem Header.


Anmelden zum Antworten