30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

14. Namespaces 459<br />

tion stehen, also <strong>in</strong> unserem Fall z.B. <strong>in</strong> Zeile 15, dann würde sich die Verwendung<br />

von cout ohne Scope Operator auf die ma<strong>in</strong> Funktion beschränken.<br />

Sp<strong>in</strong>nt man diesen Gedanken mit der Sichtbarkeit weiter, so kann man<br />

sich leicht vorstellen, dass e<strong>in</strong>e us<strong>in</strong>g Direktive, die <strong>in</strong>nerhalb e<strong>in</strong>es Namespaces<br />

steht, für den gesamten Namespace gilt. Dieses Feature wird gerne<br />

verwendet, wenn e<strong>in</strong> großes Modul mit mehreren kle<strong>in</strong>en Submodulen arbeitet.<br />

Alle Teile des Namespaces können hierbei auf die Submodule ohne<br />

besonderen Scope zugreifen, die Programmteile, die außerhalb des Namespaces<br />

stehen, aber nicht. Durch diesen Mechanismus kann man sehr gut<br />

gewisse Implementationsdetails vor den Benutzern e<strong>in</strong>er Library verstecken.<br />

Neben der Verwendung von us<strong>in</strong>g für e<strong>in</strong>zelne Teile e<strong>in</strong>es Namespaces<br />

gibt es auch noch die Möglichkeit mit e<strong>in</strong>er e<strong>in</strong>zigen Anweisung gleich den<br />

gesamten Namespace sichtbar zu machen. Wollten wir unseren gesamten<br />

Namespace Datastructures_ sichtbar machen, würden wir Folgendes schreiben:<br />

us<strong>in</strong>g namespace Datastructures_;<br />

Damit wären alle Elemente aus unserem Namespace ohne expliziten Scope<br />

ansprechbar. Ich möchte jedoch darauf h<strong>in</strong>weisen, dass diese Vorgehensweise<br />

wirklich nur <strong>in</strong> besonderen Fällen s<strong>in</strong>nvoll ist. Im Normalfall ist es besser, e<strong>in</strong>zelne<br />

Elemente aus e<strong>in</strong>zelnen Namespaces e<strong>in</strong>zub<strong>in</strong>den um Überraschungen<br />

zu verh<strong>in</strong>dern. Es könnte ja se<strong>in</strong>, dass <strong>in</strong> e<strong>in</strong>em Namespace gewisse Elemente<br />

enthalten s<strong>in</strong>d, die eigentlich nur für den privaten Gebrauch <strong>in</strong>nerhalb der<br />

Implementation dieses Namespaces gedacht s<strong>in</strong>d. Mir ist schon klar, dass<br />

das eigentlich nur aufgrund von eher mangelhaftem Design von Namespaces<br />

passieren kann, aber man soll niemanden <strong>in</strong> Versuchung führen :-).<br />

Es gibt auch noch e<strong>in</strong>en anderen Grund, warum man nicht gleich ganze<br />

Namespaces automatisch sichtbar machen soll: Was passiert, wenn <strong>in</strong> zwei<br />

Namespaces zufällig Elemente unter demselben Namen existieren? Dann<br />

kann sich der Compiler beim Aufruf ohne Scope nicht wirklich entscheiden,<br />

welches Element denn nun geme<strong>in</strong>t ist. In e<strong>in</strong>em solchen Fall wird man also<br />

dann erst recht wieder gezwungen, mit e<strong>in</strong>em expliziten Scope zu arbeiten,<br />

um den Compiler zu beruhigen.<br />

E<strong>in</strong>en Fall allerd<strong>in</strong>gs gibt es, <strong>in</strong> dem der Compiler e<strong>in</strong>en Name-Clash selbst<br />

auflöst: Nehmen wir an, wir hätten <strong>in</strong> unserem Namespace Datastructures_<br />

die Direktive<br />

us<strong>in</strong>g namespace SomeStacks_;<br />

und im Namespace SomeStacks_ hätten wir, so wie <strong>in</strong> Datastructures_, e<strong>in</strong>e<br />

Funktion doSometh<strong>in</strong>g mit denselben Parametern. Ruft man <strong>in</strong> e<strong>in</strong>em Codestück<br />

<strong>in</strong>nerhalb des Namespaces Datastructures_ nun doSometh<strong>in</strong>g auf,<br />

so wird automatisch die Implementation aus dem eigenen Namespace genommen<br />

und nicht die sichtbar gemachte Implementation aus SomeStacks_.<br />

Aus gutem Grund möchte ich allen Lesern raten, die Bezeichner von<br />

Namespaces immer sprechend und nicht zu kurz zu machen. Namespaces<br />

mit Bezeichnern wie z.B. DS (für Datastructures_) s<strong>in</strong>d um jeden Preis

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!