Sortierung von Funktionen in Klassen



  • Ich lese gerade das Buch "Clean Code" und bin dort auf den Begriff "the step down rule" gestoßen. Wenn ich das richtig verstanden habe sollte eine Klasse so aussehen:

    class Foo //pseudocode 
    {
    public:
        void readFile()
        {
            auto file = openFile();
            parseFile( file );  
        }
        std::ifstream openFile()
        {
            ////
        }
        void parseFile( const std::ifstream& file )
        {
            ////
        }
    };
    

    Also wie in diesen Beispiel sind die "high level functions" oben und die "low level functions" unten. Bei den meisten C++ Biblioteken AFAIK sind die Funktionen aber nach Alphabet sortiert. Wie handhabt ihr das?



  • Soweit mir das mal beigebracht wurde sollen die Hot-Variables/Functions immer an erster Stelle stehen.
    Das bedeutet Reihenfolge nach Häufigkeit des Zugriffs.

    Das hat wohl mit dem Prozessor Cache zu tun.
    Es geht darum, soviele hot-"variables-functions" in eine Cache-Line zu stopfen.

    So ungefähr wurde mir das mal erklärt.



  • Es ist schlecht, wenn eine Klasse wie in deinem Beispiel Methoden zweier unterschiedlicher Abstraktionsebenen anbietet. Das ist verwirrend und bläht den Code auf.
    Low-Level-Funktionen sollten privat sein oder sich außerhalb der Klasse befinden.

    cleanCode schrieb:

    Bei den meisten C++ Biblioteken AFAIK sind die Funktionen aber nach Alphabet sortiert. Wie handhabt ihr das?

    Das habe ich noch nie gesehen.



  • cleanCode schrieb:

    Also wie in diesen Beispiel sind die "high level functions" oben und die "low level functions" unten. Bei den meisten C++ Biblioteken AFAIK sind die Funktionen aber nach Alphabet sortiert. Wie handhabt ihr das?

    Ich mache die low leveler oben hin und bastele dann aus denen tiefer die high leveler. Weil ich dann die ganze Klasse in einem Stück von oben nach unten lesen kann. Deswegen auch die Attribute ganz nach oben.

    Mit einem bescheidenen Interface kann und soll man die Interna verstecken. Leider gibt es viele, die ihren Code vor sich selber verstecken wollen. Das ist wohl dieser Abschnitt von Clean Code. Eine klare Fehlentwicklung.



  • cache schrieb:

    Soweit mir das mal beigebracht wurde sollen die Hot-Variables/Functions immer an erster Stelle stehen.

    Bei Attributen kanns was bringen, EINES davon als hot anzunehmen und vornehin zu schreiben. Dann ist die Adresse des Objekts evtl genau gleich der Adresse des ersten Attributs. Hängt aber noch vom Compiler ab.
    Bei Methoden kann ich mir nicht vorstellen, daß es was bringt, man müßte vielmehr die hot-Methoden aus dem ganzen Programm zusammenwerfen, die sind aber über die verschiedensten Klassen bunt verteilt.



  • volkard schrieb:

    cache schrieb:

    Soweit mir das mal beigebracht wurde sollen die Hot-Variables/Functions immer an erster Stelle stehen.

    Bei Attributen kanns was bringen, EINES davon als hot anzunehmen und vornehin zu schreiben. Dann ist die Adresse des Objekts evtl genau gleich der Adresse des ersten Attributs.

    Und? Inwiefern ist das schneller?

    Der einzige sichtbare Unterschied ist Caching, daher sollen gemeinsam benutzte Member zusammen stehen.



  • optimized_for_1977 schrieb:

    Und? Inwiefern ist das schneller?

    Naja, ob der Prozessor *(this) oder *(this+16Bytes) lesen soll, das macht keinen Unterschied. Da gibts sicherlich passende Addrssierungsmodi. Insofern ist das erste Attribut nicht bevorzugt.
    Was aber wenn ich den schon verbraucht hab für den Zugriff in ein Array von Klassenobjekten? Könnte mir vorstellen, daß es da noch was bringen könnte.



  • Es geht mir auch mehr um die Lesbarkeit.


Log in to reply