Forum: Compiler & IDEs Kapselung durch namespace?


von Michael Z. (incunabulum)


Lesenswert?

Moin!

in einem kleinen Projekt entwickel ich zur Zeit in C++ (WinAvr,
Eclipse), wobei hier Klassen nur zum Einsatz kommen, wenn diese
wirklich sinnvoll sind (Fifo, Stack...). Die Treiber zu SPI, I2C etc.
sind in plain-c geschrieben.

Um nun dennoch die Übersichtlichkeit nicht zu verlieren und nicht zu
viele globale Variablen zu haben.... hat schon jemand mal versucht,
mittels Namespaces eine Modularisierung und Kapselung durchzuführen?
Macht es Sinn, unnamed namespaces zu verwenden, um "quasi-private"
Variablen etc. zu definieren?

Also in etwa so:

namespace mymodule {
  namespace {
    int privateVar;
    void privateMethod(void) {};
  }

 int publicVar;
 void publicMethod(void) {};
}

cu, mz

von Christoph _. (chris)


Lesenswert?

IMHO schreit dieses Vorgehen nach einer Klasse. Der Overhead einer
Klasse im Vergleich zu deiner manuellen Lösung dürfte vermutlich bei
0,0 liegen (wenn man darauf achtet, keine Methoden unnötig "virtual"
zu deklarieren).

von Michael Z. (incunabulum)


Lesenswert?

Wieso 0 Overhead? Namespaces belegen keinerlei zusätzlichen
Speicherplatz! Eine Klasse jeweils einige Byte in der vtable. Da die
größeren Atmels doch einige Funktionen haben, würde ich so schnell auf
einige Klassen und dementsprechend Speicherverbrauch kommen.

Ok, das könnte ich noch verschmerzen.... so eng ist es noch nicht. Nur
stört es mich eben, eine Klasse zu verwenden, die dann ausschließlich
static members hat. Wozu? (virtual static geht eh nicht!).

Bei statischen Klassen kann ich die Vorteile von objektorientierter
Programmierung irgendwie nicht ausnutzen. Vererbung? Brauch ich nicht
bzw. funktioniert nicht, wie ich es brauche. Einzig die Kapselung find
ich hier sinnvoll und die kann ich mit weniger Speicherplatz auch über
namespaces hinbekommen.

Die Verwendung ist dann identisch zu statischen Methoden.
NAMESPACE::function().

Ich komm halt aus der Python-Ecke... deren Philosophie ist eben "use
the best tool for the job". Und wenn das mal ne einfache Funktion ist,
warum nicht! (Namespaces gibt es dort über die Imports auch)

cu, mz

PS: Bei meiner Frage ging es mir auch darum, abzuklären, ob dies schon
jemand einsetzt :)

von Rolf Magnus (Gast)


Lesenswert?

> Eine Klasse jeweils einige Byte in der vtable.

Nur dann, wenn sie virtuelle Memberfunktionen hat. Sonst gibt's keine
vtable.

> Nur stört es mich eben, eine Klasse zu verwenden, die dann
> ausschließlich static members hat. Wozu? (virtual static geht eh
> nicht!).

Das stimmt. Es ist auch ein Vorteil von C++ gegenüber z.B. Java, daß
man für Sachen, bei denen Klassen eigentlich nicht sinnvoll sind, auch
keine einsetzen muß.

> Einzig die Kapselung find ich hier sinnvoll und die kann ich mit
> weniger Speicherplatz auch über namespaces hinbekommen.

Der Speicherverbrauch dürfte exakt derselbe sein.

> PS: Bei meiner Frage ging es mir auch darum, abzuklären, ob dies
> schon jemand einsetzt :)

Ich benutze Namespaces schon mit avr-g++, allerdings keine anonymen
solchen. Ich habe z.B. meine ganzen UART-Funktionen in den Namespace
uart gepackt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.