30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

460 14. Namespaces<br />

zu vermeiden. Durch solche Bezeichner besteht die große Gefahr, dass man<br />

irrtümlich Namespaces, die mite<strong>in</strong>ander nichts zu tun haben, zu e<strong>in</strong>em geme<strong>in</strong>samen<br />

größeren Namespace vere<strong>in</strong>t, bloß weil die Namen zufällig dieselben<br />

s<strong>in</strong>d. Das ist sicher nicht im S<strong>in</strong>ne des Erf<strong>in</strong>ders und vor allem s<strong>in</strong>d<br />

dadurch Name-Clashes praktisch vorprogrammiert. Nun gibt es aber Fälle,<br />

<strong>in</strong> denen man ke<strong>in</strong> explizites us<strong>in</strong>g für viele verschiedene Elemente aus e<strong>in</strong>em<br />

Namespace schreiben will, weil man jedes e<strong>in</strong>zelne für sich eigentlich nicht<br />

oft genug braucht, um das zu rechtfertigen. Andererseits aber braucht man<br />

trotzdem den Scope auf diesen Namespace ziemlich oft, weil man es eben<br />

mit vielen verschiedenen Namespaces zu tun hat. Für solche Fälle gibt es<br />

die Möglichkeit, e<strong>in</strong>em Namespace e<strong>in</strong> Alias zu geben. Wollte man z.B. das<br />

Alias DS für Datastructures_ im Code verwenden, so kann man folgendes<br />

Statement schreiben:<br />

namespace DS = Datastructures_;<br />

Ich würde jedoch wirklich zur Vorsicht mahnen, denn man kann Code dadurch<br />

ziemlich verwirrend und damit unlesbar machen.<br />

Zu guter Letzt möchte ich noch auf e<strong>in</strong>e Möglichkeit h<strong>in</strong>weisen, die man<br />

mit Namespaces hat und die eigentlich wie e<strong>in</strong> Paradoxon kl<strong>in</strong>gt: Es gibt<br />

auch sogenannte unnamed Namespaces. Man kann z.B. die folgenden Zeilen<br />

schreiben:<br />

1 namespace<br />

2 {<br />

3 void f ( )<br />

4 {<br />

5 // whatever code<br />

6 }<br />

7 // some code<br />

8 f ( ) ; // c a l l s the function f def<strong>in</strong>ed above<br />

9 }<br />

Hierdurch hat man e<strong>in</strong>en unnamed Namespace verwendet, der e<strong>in</strong>zig und<br />

alle<strong>in</strong> die Aufgabe hat, die Funktion mit dem glorreichen Namen f davor<br />

zu schützen, e<strong>in</strong>er anderen Funktion f <strong>in</strong> die Quere zu kommen, die an e<strong>in</strong>em<br />

anderen Ort def<strong>in</strong>iert se<strong>in</strong> könnte. Der Aufruf von f() <strong>in</strong> Zeile 8 f<strong>in</strong>det<br />

aufgrund der zuvor genannten Auflösungsstrategie sicher zuerst die im Namespace<br />

def<strong>in</strong>ierte Funktion f.<br />

Allerd<strong>in</strong>gs kann ich zu dieser Vorgehensweise wirklich nur noch sagen,<br />

dass es wohl ke<strong>in</strong>en schlimmeren Hack gibt als solche s<strong>in</strong>nlosen Funktionsnamen.<br />

Sollte man jemals <strong>in</strong> die Situation kommen, e<strong>in</strong>en unnamed Namespace<br />

zu brauchen, dann sollte man lieber e<strong>in</strong>mal stark darüber nachdenken, ob<br />

nicht e<strong>in</strong> Umschreiben des Codes dr<strong>in</strong>gend vonnöten wäre. Bei sauber geschriebenem<br />

Code ist die Wahrsche<strong>in</strong>lichkeit praktisch Null, dass man jemals<br />

unnamed Namespaces brauchen würde. Natürlich kann man jetzt auch das<br />

Argument br<strong>in</strong>gen, dass es ja z.B. alten Code gibt, den man wiederverwenden<br />

möchte und der eben leider e<strong>in</strong>mal nicht so toll ist. Aber auch dann würde<br />

ich sehr dr<strong>in</strong>gend (!) zu e<strong>in</strong>er Überarbeitung raten. Durch das Kaschieren<br />

von schlimmen Hacks hat man das Problem ja doch nur verschoben und nicht<br />

aus der Welt geschafft!

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!