V
Ich erzähle mal, wie es bei mir ist.
Oft gibt es private Methoden. Die werden ganz normal behandelt wie alle Methoden: Wenn deren Code so einfach ist, daß er selber die beste Dokumentation ist, bleibt er im Header, ansonsten wandert er raus. (Fußnote1)
Manchmal gibt es private Klassen. Die waren aber bisher immer so einfach, daß sie inklusive aller ihrer Methoden innerhalb der umgebenden Klasse inline leben durften.
Manchmal gibt es globale Funktionen, die man öffentlich machen darf. Davon gibt es zwei Sorten:
- "private reentrante Funktionen" wie string stripHtmlTags(string), die wandern regelmäßig in eine Datei wie globals.cpp nebst globals.hpp, vielleicht auch tools, utils oder so.
- "private böse Funktionen" wie rand(), die kriegen eine eigene *.cpp.
Und dann gibt es noch die globalen Funktionen, die einfach nur global sind, weil sie der Einfachheit oder Geschwindigkeit halber auf globale Variablen zugreifen. Extrem selten eigentlich. Bei mir zum Beispiel wo PageWithHead<head=DequeuHead,data=Foo> die Page (immer 8192 Bytes, am anfang der Header, danach eine Array) benutzt und die Page.cpp einfach darauf verzichten will, die ganzen Hilfsunktonen des Seitenallokators private in Page zu machen. Die sind dann global static in der Page.cpp (Fußnote2).
Fußnote1: Bei Primzahlenfunktionen ist isPrime(...) doch kompliziert und inline. Triviale Prüfungen wie ob die Zahl sehr klein ist oder gerade ist und ein wenig mehr, will ich inline haben, daß auch der dümmste Compiler es inlinisieren kann (nicht muss).
Fußnote2: So wenigstens in der Theorie. Kleinere Versuche mit Page und seitenbasierten Containern habe ich gemacht und die Geschwindigkeit war überzeugend. Nebenbei eröffnet das Konzept weitere spaßige Sachen. Ich werde alles auf seitenbasierte Container umstellen, koste es, was es wolle, um die Grenzen dieses Konzepts kennenzulernen. Da ich fast nie große Arrays verwende, sondern eh nur std::vector, und wenn ich große vectors verwende, weil sie so schnell sortierbar sind, und das seitenbasierte Speichern nach merge sort schreit und das auch schnell ist, unter umständen mit einem Acht-Takte-Allokator für Pages, und ich dann doch wieder selten sortiere, ... Leider bin ich zu doof, eine überzeugend schnelle Implementierung für eine seitenbasierte PriorityQueue zu finden, aber die ist KO-Kriterium. Alle anderen Container halte ich für trivial.