Ich programmiere jetzt seit ungefähr 10 Jahren in verschiedenen Sprachen. Und ich habe immer noch nicht herausgefunden, wann es eine gute Idee ist, etwas in den globalen Namespace zu importieren ( using x::y
in C ++, from x import y
in Python usw.), also mache ich es kaum jemals.
Es scheint mir fast immer eine schlechte Idee zu sein, schon allein deshalb, weil es die Menge der Variablennamen einschränkt, die ich verwenden kann. Zum Beispiel: Wo ich using namespace std;
oder using std::string;
in C ++ verwenden soll, konnte ich nicht mehr string
als Variablennamen verwenden, was ich gelegentlich tue (z. B. für String-Dienstprogrammfunktionen).
Aber ich frage mich: Gibt es Situationen, in denen das Importieren eines Namens in den globalen Namespace wirklich Sinn macht? Faustregeln?
Antworten:
In C ++ ist es im Allgemeinen verpönt - besonders
using namespace std
. Dieserstd
Namespace hat so viele Namen, von denen viele sehr generische Algorithmen sind, dass Sie einige äußerst böse Überraschungen erleben können, wennusing namespace std
. So etwasusing std::cout;
ist nicht so schlimm. Aber niemalsusing
etwas in den globalen Namespace einer Header-Datei. Das ist eine Straftat.quelle
Sie sollten es tun, wenn es Ihren Code vereinfacht. Sie sollten dies nicht tun, wenn dies zu Namenskonflikten führen würde oder wenn es später in Bereiche gebracht werden könnte, in denen Namenskonflikte auftreten würden, z. B. eine Header-Datei.
Einige Leute denken, dass es selten sein sollte. Ich denke , (außerhalb von Header - Dateien) nicht verwenden sollte es selten sein, weil der Namespacepräfix im Allgemeinen keine nützlichen Informationen hinzufügen, wie jemand der vollen Namen man sie anspricht jedes Mal verwenden.
Lassen Sie es mich so sagen. Wenn Sie
string
als Klassenname sehen, denken Sie automatischstd::string
odermycustom::string
? Es ist wie das alte Sprichwort. Wenn Sie das Geräusch von Hufen hören, denken Sie an Pferde, nicht an Zebras. Mit anderen Worten,using namespace std
ist fast immer keine große Sache.using namespace mycustom
ist normalerweise auch keine große Sache, es sei denn, es enthält einen Konflikt mitstd
. In diesem Fall ist Ihr benutzerdefinierter Namespace derjenige, für den Sie immer das Präfix benötigen.quelle
mycustom
einestring
Klasse enthalten ist ? Oben duusing namespace mycustom;
. Durch den Rest des Codes, den Sie jetzt verwendenstring
. Alle anderen, die den Code lesen, denken, dassstd::string
nur Sie (und einige sehr aufmerksame Personen) denkenmycustom::string
. Hier haben Sie die Zebras in die Pferdekoppel gelegt. Siehe auch stackoverflow.com/q/1452721/14065mycustom
Konflikte mitstd
Ihnen immer dasmycustom::
Präfix erfordern sollten .doStuff(int)
. Und eine neuere Version vonmycustom
fügtdoStuff(double)
dann die gesamte Bedeutung eines Aufrufs zudoStuff(5.5);
Änderungen hinzu (möglicherweise ohne dass Sie es bemerken).Wenn ich in Python arbeite, verwende ich ständig von x import y (als z), um klare, präzise Namen für Referenzimporte zu haben.
Importe sind in einer Codebasis mit einer tiefen Namespace-Hierarchie von unschätzbarem Wert. Dies gilt insbesondere dann, wenn der Stilstandard für die Codebasis PEP 8 ist , wodurch die Zeilenlänge auf unter 80 Zeichen begrenzt wird.
Betrachten Sie zum Beispiel:
Was stattdessen geschrieben werden könnte:
Da bei Python-Bezeichnern zwischen Groß- und Kleinschreibung unterschieden wird und die Länge unbegrenzt ist , gehen uns nicht die Namen aus, unabhängig davon, wie viele wir importieren.
Wenn wir in unserem Modul denselben Namen wie eines der Module verwenden möchten, die wir importieren möchten, können wir einen Alias für den Import verwenden:
quelle
Es liegt am Programmierer, wann er es verwenden soll. IMHO ist es besser, sie überhaupt nicht zu verwenden, besonders in Header-Dateien. Aber es gibt mehrere Fälle, in denen ich es benutze
Wenn ich etwas in einen anderen Namespace einführen möchte, z
So aktivieren Sie ADL für einige Algorithmen aus einem anderen Namespace
Wenn ich keine langen Namen von Namespaces bei .cpp schreiben möchte, kann ich immer einen Alias erstellen
quelle