mikrocontroller.net

Forum: Compiler & IDEs Kapselung durch namespace?


Autor: Michael Z. (incunabulum)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph __ (chris)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Michael Z. (incunabulum)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.