c++ Design (non-friend, non-member functions)



  • da ich mit java angefangen habe zu programmieren, sieht mein code noch sehr
    danach aus (grosse klassen, mit jedem mist drin)
    ich habe aber festgestellt, das sowas gelinde gesagt horror ist ...

    deshalb habe ich nun angefangen alles ein wenig auszulagern,
    ich möchte aber eigentlich nicht den globalen namespace vollmüllen
    (wobei es mir nicht ums vollmüllen geht, sondern eher darum,
    das man den functionen noch ansieht zu welcher klasse sie eigentlich
    gehören)

    ich wollte nun alles in diese richtung umschreiben :

    class DataSet
    {
    
      static const std::string TRAINDATA_BASE_DATASET_CLASSNAME;
    
    public:
    
      DataSet(  const std::string& SndFileName=std::string(""), 
                const std::string& LabFileName=std::string(""));
    ...
    private :
    
    ...
    };
    
    namespace DataSet_Funcs
    {
    Hier die functions rein
    }
    

    meine frage wäre nun, wie ihr das macht, alles in den globalen namespace?
    Wie nennt ihr solche namespaces, will mich da ein wenig an den standard halten.
    Oder gleich als static funcs in die klasse rein ...

    Würde mich über Anregungen freuen

    Treb



  • Hi,

    als erstes mal: Guter Ansatz !! 👍

    Ich würde die Teile einfach in denselben namespace packen wie auch die Klassen, zu denen sie "gehören". Letztlich sind sie genauso Bestandteil der Schnittstelle...

    Bei Dr.Dobbs gibt's übrigens (leider erst nach einer kurzen Werbepause) einen guten Artikel von Scott Meyers darüber, wann freie Funktionen sinnvoll sind.

    Gruß,

    Simon2.



  • Die Klasse DataSet und die freien Funktionen in einen Namespace. Generell sollte man IMMER Namespace benutzen. Ich mache das immer so: pro Projekt einen Namespace. Dieser KANN natürlich wieder andere Namespace haben. Aber meistens habe ich einen Namespace pro Projekt. Globale Namespaces sind bei mir tabu.

    namespace DataSetProjekt
    {
    
    class DataSet
    {
    
      static const std::string TRAINDATA_BASE_DATASET_CLASSNAME;
    
    public:
    
      DataSet(  const std::string& SndFileName=std::string(""),
                const std::string& LabFileName=std::string(""));
    ...
    private :
    
    ...
    };
    
    Hier die functions rein
    
    } // namespace end
    

    Namespaces sind übrigens offen, du kannst allso über mehrere Dateien alles in einen Namespace legen.


Anmelden zum Antworten