Design Frage



  • Hallo,

    ich habe desöfteren das Problem, dass ich enums und typedefs habe, die ich in mehreren Klassen benötige...
    Ich packe dann meistens die enums und typedefs in eine header datei, die ich überall dort inkludiere, wo ich sie brauche. Ich finde das aber äußerst unschön, da ich dann ich dann teilweise enums mitinkludiere, die ich in der klasse aber gar nicht brauche...
    was macht ihr denn in einem solchen Fall bzw was hat sich "bewährt"?
    Bin noch fleißig am Erfahrung sammeln...

    Vielen Dank euch!

    Gruß
    Klaus



  • Du hast dir die Antwort doch schon selbst gegeben:
    Entweder du hast eine grosse Headerdatei, in der alle typedefs und enums stehen. Natürlich wirst du mehr oder weniger häufig nicht alle Definitionen benutzen, aber dafür musst du ja nur eine Header Datei inkludieren.
    Wenn du wirklich nur das inkludieren möchtest, was du gerade brauchst, musst du deine Definitionen gruppieren und auf mehrere Include Dateien verteilen. Ob das unbedingt besser ist weiss ich auch nicht...



  • Grundsaetzlich: Teils auf mehrere Header auf.
    (bewaert sich spaetestens sobald du Header hast, die relativ viel Compilezeit fressen, da willst du so wenig wie moeglich includieren/nur genau das Inkludieren, was du auch brauchst).

    Wenn du feststellst, dass du dann relativ oft alle Header brauchst, kannst du ja noch einen gesamtheader schreiben, der nichts macht als die einzelheaders zu inkludieren.



  • Wenn du feststellst dass du die typedefs und vor allem die Enums immer an so vielen Stelle brauchst solltest du schauen ob du dein Design nicht grundsätzlich weiter entkoppeln solltest.



  • Im Allgemeinen versuche ich immer auch enum und typedef an Klassen zu binden. Oft ist es ja gerade bei enums so, dass sie verschiedenen Zustände eines Objekts darstellen. Und dann arbeitet man ja oft direkt mit dem Objekt, so dass der Header eh bekannt ist.

    Natürlich lässt sich das nicht immer so lösen (zumindets nicht mit überschaubaren Aufwand), aber für die globalen Elemente nehme ich dann eigene Headerdateien, die bestimmte Bereiche abdecken.



  • Ein möglicherweise nützlicher Tipp: Falls du verhindern möchtest, dass ein enum alle Konstanten in den globalen Namensraum ausleert, schreibe dir lokale Namensräume.

    // statt
    enum color
    {
        red,
        green,
        yellow,
    };
    
    red;
    
    // machst du es so:
    namespace color
    {
        enum type
        {
            red,
            green,
            yellow,
        };
    }
    
    color::red;
    

    Die zusätzliche Qualifizierung kann nützlich sein, wenn es viele Stati gibt, deren Zugehörigkeit im Code angedeutet werden soll. Ausserdem verhindert man damit allfällige Namenskonflikte.


Anmelden zum Antworten