Library mit nested Namespaces nutzen



  • Hallo zusammen,

    ich nutze einige Libraries in denen das Theme Namespaces etwas unterschiedlich gehandelt wird. Von gar keinen Namespaces über Projektnamen bis hin zu Namespaces als Organisation ist alles dabei.

    Ich finde ja die std ganz angenehm mit std::cout etc.. Hilft hier auch bei der Lesbarkeit tatsächlich finde ich. Man weiß direkt vorher es kommt, aber trotzdem schön kurz.

    Jetzt habe ich aber so libs mit gefühlt 10 nested namespaces Projektname::Unterordner::Unterordner::Unterordner. Das hat zwar durchaus auch positive Seiten in Bezug auf die Lesbarkeit, aber im Allgemeinen stört es dann doch irgendwie schon im Code, wenn jeder Typ meinen ganzen Bildschirm einnimmt.

    In einem anderen Projekt habe ich zwar keine 10 nested namespace, aber dafür extrem lange Namen. Fast noch schlimmer. Nicht klarer, aber trotzdem genauso lang.

    Die erste Diskussionsfrage vlt.: Wie handhabt ihr das eigentlich in euren Libs bzw. was ihr eure Meinung dazu?
    Ich bin da eig. bei http://open-std.org/JTC1/SC22/WG21/docs/papers/2017/p0816r0.pdf
    Nested Namespaces sollten Ausnahme und nicht Regel sein. Praktisch finde ich die für die automatisch generierte Dokumentation, da ist alles schön sortiert. Da hört es dann aber auch auf.

    Und die wichtige Frage. Kann ich das irgendwie fixen?? Ich dachte da an sowas:

    namespace projekt_name = projekt_name::*
    

    Glaube aber nicht das es das gibt. Soweit ich weiß geht darf ich den namespace namen ja auch nicht nochmal verwenden.
    Was ich auch versucht habe ist halt irgendwie mir ne eigene Abkürzung für jeden Namespace auszudenken, aber Spaß macht das keinen.

    Und klar, ich kann natürlich einfach using namespace::namespace2::... nutzen. Aber so ganz gefällt mir das auch nicht. Ich finde es ja gut, dass die Sachen in einem Namespace mit dem Library Namen sind. Auf die Subnamespaces würde ich gerne verzichten 😕



  • namespace my_foo {
    using namespace foo;
    using namespace foo::bar;
    using namespace foo::baz;
    using namespace foo::baz::qux;
    }
    

    Sonst fällt mir da auch nix ein.

    Was theoretisch auch geht, aber irgendwie ziemlich hacky ist:

    namespace foo {
    using namespace foo::bar;
    using namespace foo::baz;
    using namespace foo::baz::qux;
    }
    

    Davon abgesehen musst du bei Libraries die so viele verschachtelte Namespaces haben halt mit Kollisionen rechnen.



  • Hi @Leon0402,
    ich hatte mal das Problem, dass ich mit Klassen aus dem Namespace "filesystem" arbeiten musste und dieser bei verschiedenen Compilern einmal "std::filesystem" und "std::experimental::filesystem" war.

    Damit ich auf die Klassen einheitlich zugreifen konnte habe ich einen eigenen kurzen Namespace, einmal

    namespace fs = std::filesystem;
    

    und

    namespace fs = std::experimental::filesystem;
    

    definiert.
    Damit habe ich z.B auf Funktionen folgendermaßen zugegriffen:

    bool retVal = fs::create_directory(...);
    

    Definiere doch einmal für jeden zu nutzenden Namespace einen eigenen Namespace, mit einem für dich sprechenden Namen.

    z.B:

     namespace MyLongNmSp = Projektname::Unterordner::Unterordner::Unterordner;
    


  • @hustbaer Die Idee finde ich nicht schlecht. Nutzt du das auch in deinen Projekten so? Oder wie gehst du oder andere mit so lange namespace Namen um?

    @Helmut-Jakoby Ja mit dem umbennen der Namespaces habe ich es auch schon versucht. Aber irgendwie fand ich das doch auch anstrengend, mir da immer eigene Namen auszudecken.

    Allgemein ist vermutlich auch die Sache, dass man beide Varianten in nen header packen möchte, damit man das nicht in jeder Datei immer wieder deifnieren muss. (Mit der Gefahr es jedes mal anders zu nennen). Das ist vor allem auch in einer Library natürlich nicht so schön.

    @hustbaer sagte in Library mit nested Namespaces nutzen:

    Davon abgesehen musst du bei Libraries die so viele verschachtelte Namespaces haben halt mit Kollisionen rechnen.

    Und das hier kann natürlich auch passieren.

    Das sauberste und einfachste ist vermutlich echt die ganzen namespaces komplett auszuschreiben. Den Code finde ich nur einfach super anstrengend zu lesen dann.



  • @Leon0402 sagte in Library mit nested Namespaces nutzen:

    @hustbaer Die Idee finde ich nicht schlecht. Nutzt du das auch in deinen Projekten so? Oder wie gehst du oder andere mit so lange namespace Namen um?

    Nein, verwenden wir nicht.

    Wir haben wenig so lange namespace Namen.

    In Header-Files schreiben wir die Bezeichner von fremden Libraries immer voll qualifiziert. Bzw. ist das die Guideline, an die sich dann natürlich nicht alle halten - was aber z.T. einfach ein Kommunikationsproblem ist (grosse Firma, viele Standorte, noch mehr Teams). Innerhalb von Klassen sind using foo::bar::something erlaubt, was auch öfter verwendet wird.

    In den .cpp Files wird es unterschiedlich gehandhabt. Meist werden dort auch voll qualifizierte Namen verwendet. Öfters sieht man auch using namespace foo; und auch using foo::bar::something. In manchen Files sind auch Namespace-Aliase zu finden. Ist aber eher unüblich und ich empfehle es nicht wenn ich gefragt werde. Ist halt doof wenn man erst die lokalen Aliase lernen muss um ein File zu lesen. Es gibt einige Libraries wie z.B. Boost.Beast die Namespace-Aliase in ihren Beispielen verwenden. Die wurden dann auch an mehreren Stellen so übernommen. Was ich noch halbwegs OK finde.


Log in to reply