„Namensraum“ – Versionsunterschied
[ungesichtete Version] | [gesichtete Version] |
Keine Bearbeitungszusammenfassung |
RM2026 (Diskussion | Beiträge) Siehe Disk |
||
(138 dazwischenliegende Versionen von mehr als 100 Benutzern, die nicht angezeigt werden) | |||
Zeile 1: | Zeile 1: | ||
Der '''Namensraum''' ({{enS|''namespace''}}) ist ein Begriff aus der [[Programmierung]]. Dabei werden – vor allem bei der [[Objektorientierte Programmierung|objektorientierten Programmierung]] – die Namen für [[Objekt (Programmierung)|Objekte]] in einer Art [[Baumstruktur]] angeordnet und über entsprechende [[Pfadname]]n eindeutig angesprochen. |
|||
Ein [[Name]] identifiziert ein [[Objekt]]. Zur eindeutigen Zuordnung ist jedoch der entsprechende [[Kontext]] - eben der '''Namensraum''' zu beachten. Die Beschreibung geschieht üblichweise durch die "Punkt"-Notation. |
|||
Vereinfacht bedeutet dies, dass innerhalb eines solchen Raumes jeder Name eindeutig ein Objekt bezeichnet. Der gleiche Name kann jedoch in einem anderen Namensraum wieder frei zur Bezeichnung eines anderen Objekts benutzt werden. Außerdem können diese unabhängigen Namensräume innerhalb einer Hierarchie verbunden werden. |
|||
''Beispiele:'' |
|||
Auch [[MediaWiki]]-Wikis wie eine Wikipedia sind in Namensräume aufgeteilt. |
|||
*Person: Familie.Mutter, Clique.Vorname |
|||
*Telekommunikation: Land.Vorwahl.Telefonnummer |
|||
*[[Computer]]: Netz.Rechner |
|||
*[[Web]]-Adresse: Seite.Benutzer.Unternehmen.Domain |
|||
== Technische Details == |
|||
Bei [[Programmiersprache]]n versteht man unter ''Namensraum'' einen (meist durch ein [[Präfix]] gekennzeichneten) Bereich für Namen. Das führt dann zu mehrteiligen Namen: Eine Druckfunktion könnte z.B. ''mylib.print()'' heißen. Hier wäre ''mylib'' der Namensraum und ''print()'' der eigentliche Name der Funktion. |
|||
Ein [[Name]] identifiziert ein Element der Programmiersprache (z. B. ein [[Objekt (Programmierung)|Objekt]], eine [[Klasse (Objektorientierung)|Klasse]] oder eine [[Funktion (Programmierung)|Funktion]]). Zur eindeutigen Zuordnung ist jedoch der entsprechende [[Kontext (Sprachwissenschaft)|Kontext]] – der ''Namensraum'' – zu beachten. Die Beschreibung geschieht in der [[Programmierung]] üblicherweise durch die sogenannte „Punktnotation“, wobei analog zu einer [[Baumstruktur]] die einzelnen Objekte, mit ihren Eigenschaften ([[Attribut (Programmierung)|Attribute]]) und [[Methode (Programmierung)|Methoden]], angesprochen werden. Neben der Punktnotation sind aber auch andere Zeichen gebräuchlich, so wie z. B. bei Dateinamen mit [[Schrägstrich]]en („<code>/</code>“) oder [[Umgekehrter Schrägstrich|umgekehrten Schrägstrichen]] („<code>\</code>“). Die meisten Namensräume, z. B. [[Dateisystem]]e, sind hierarchisch aufgebaut, d. h., sie können selbst wieder aus Namensräumen bestehen. Namensräume werden dazu verwendet, Konflikte bei der Namensvergabe zu verhindern. Graphisch sind Namensräume mit [[Baum (Graphentheorie)|Bäumen]] äquivalent, d. h., sie haben eine Wurzel (einen festen, definierten Ausgangspunkt), Knoten (Verzeichnisse) und Blätter (Objekte). |
|||
Mit Namensräumen kann ein Autor große Programmpakete mit vielen definierten Namen schreiben, ohne sich Gedanken machen zu müssen, ob die neu eingeführten Namen in Konflikt zu andere Namen stehen. Im Gegensatz zu der Situation ohne Namensräume wird hier nicht der ganze Namen neu eingeführt, sondern nur ein Teil des Namens, nämlich der des Namensraumes (im Beispiel oben: ''mylib''). |
|||
Die Idee von Namensräumen wird auch in anderen Bereichen unter anderen Namen verwendet, z. B. in der [[Telefonie]]. Jeder Teilnehmer erhält eine individuelle [[Rufnummer]], z. B. 4711, und diese wird lokal vergeben. Das [[Telefonnetz]] ist hierbei in Unternetze unterteilt und die Identifikation erfolgt über die [[Telefonvorwahl|Vorwahl]]. Somit kann jede Rufnummer mehrfach vergeben werden, sie muss nur innerhalb des Unternetzes eindeutig sein. Bei einem Anruf im selben Vorwahlbereich reicht somit die Angabe der Rufnummer 4711. Soll ein Teilnehmer aus dem Vorwahlbereich 0815 kontaktiert werden, der ebenfalls die Rufnummer 4711 besitzt, so wählt man die 0815 vor. Durch diese Technik können mehrere Teilnehmer die gleiche Rufnummer 4711 besitzen. In diesem Beispiel wäre die 0815 der Namensraum, 4711 der eigentliche Name und der Ziel-Telefonanschluss das identifizierte Objekt. |
|||
Die meisten modernen Programmiersprachen unterstützen Namensräume. |
|||
Beim Erstellen von [[Computerprogramm|Programmen]] kann ein Autor unter Benutzung von Namensräumen große [[Programmpaket]]e mit vielen definierten Namen schreiben, ohne sich Gedanken machen zu müssen, ob die neu eingeführten Namen in Konflikt mit anderen Namen stehen. Im Unterschied zu der Situation ohne Namensräume wird hier nicht der ganze Name neu eingeführt, sondern nur ein Teil des Namens, nämlich der des Namensraumes. |
|||
Ein Namensraum ist ein deklaratorischer Bereich, der einen zusätzlichen Bezeichner an jeden Namen anheftet, der darin deklariert wurde. Dieser zusätzliche Bezeichner macht es weniger wahrscheinlich, dass ein Namenskonflikt auftritt mit Namen, die anderswo im [[Computerprogramm|Programm]] [[Deklaration (Programmierung)|deklariert]] wurden. Es ist möglich, den gleichen Namen in unterschiedlichen Namensräumen ohne Konflikt zu verwenden, auch wenn der gleiche Name in derselben Übersetzungseinheit vorkommt. Solange er in unterschiedlichen Namensräumen erscheint, ist jeder Name eindeutig aufgrund des zugefügten Namensraumbezeichners. |
|||
---- |
|||
Die meisten modernen [[Programmiersprache]]n unterstützen Namensräume. Die [[Auszeichnungssprache]] [[Extensible Markup Language|XML]] unterstützt ebenfalls Namensräume, wobei das Präfix durch einen [[Doppelpunkt]] vom lokalen Namen getrennt wird. |
|||
''Informationen zu Wikipedias Gebrauch von Namensräumen unter [[Wikipedia:Namensraum]].'' |
|||
Für viele [[Programmiersprache]]n ist der Namensraum ein Kontext für ihre [[Bezeichner]]. In einem [[Betriebssystem]] ist ein Beispiel für einen Namensraum ein Verzeichnis. Jeder Name in einem Verzeichnis identifiziert eine [[Datei]] oder ein Unterverzeichnis eindeutig. |
|||
[[en:Namespace]] |
|||
[[ja:名前空間]] |
|||
Namen in einem Namensraum können in der Regel nicht mehr als eine Bedeutung haben. Das heißt, verschiedene Bedeutungen können nicht denselben Namen im selben Namensraum haben. Ein Namensraum wird auch als Kontext bezeichnet, da derselbe Name in verschiedenen Namensräumen unterschiedliche Bedeutungen haben kann, die jeweils für seinen Namensraum geeignet sind. |
|||
[[nl:Naamruimte]] |
|||
[[pl:Przestrzeń nazw]] |
|||
In der [[Programmiersprache]] [[Java (Programmiersprache)|Java]] haben Bezeichner, die in Namensräumen angezeigt werden, einen kurzen lokalen Namen und einen eindeutigen langen „qualifizierten“ Namen für die Verwendung außerhalb des Namensraums. |
|||
Einige [[Compiler]] für Sprachen wie [[C++]] kombinieren Namensräume und Namen für den internen Gebrauch im Compiler in einem Prozess, der ''name mangling'' genannt wird. |
|||
Neben der oben beschriebenen technischen Verwendung der abstrakten Sprache verfügen einige [[Programmiersprache]]n unter anderem über ein bestimmtes [[Schlüsselwort (Programmierung)|Schlüsselwort]], das zur expliziten Steuerung von Namensräumen verwendet wird. |
|||
== Beispiele == |
|||
=== [[C++]] === |
|||
<syntaxhighlight lang="cpp"> |
|||
namespace Germany |
|||
{ |
|||
string anthemTitle = "Das Lied der Deutschen"; |
|||
} |
|||
namespace Austria |
|||
{ |
|||
string anthemTitle = "Land der Berge"; |
|||
} |
|||
void output1() |
|||
{ |
|||
string anthemTitle = "Schweizerpsalm"; |
|||
cout << Germany::anthemTitle << endl; // Ausgabe: Das Lied der Deutschen |
|||
cout << Austria::anthemTitle << endl; // Ausgabe: Land der Berge |
|||
cout << anthemTitle << endl; // Ausgabe: Schweizerpsalm |
|||
} |
|||
void output2() |
|||
{ |
|||
using namespace Germany; |
|||
cout << anthemTitle << endl; // Ausgabe: Das Lied der Deutschen |
|||
cout << Austria::anthemTitle << endl; // Ausgabe: Land der Berge |
|||
} |
|||
void output3() |
|||
{ |
|||
using namespace Austria; |
|||
cout << Germany::anthemTitle << endl; // Ausgabe: Das Lied der Deutschen |
|||
cout << anthemTitle << endl; // Ausgabe: Land der Berge |
|||
} |
|||
void output4() |
|||
{ |
|||
using namespace Germany; |
|||
using namespace Austria; |
|||
cout << anthemTitle << endl; // Fehler: Referenz auf anthemTitle ist mehrdeutig |
|||
} |
|||
</syntaxhighlight> |
|||
Namensräume dürfen in C++ auch geschachtelt werden: |
|||
<syntaxhighlight lang="cpp"> |
|||
namespace nested1 |
|||
{ |
|||
namespace nested2 |
|||
{ |
|||
namespace nested3 { /* ... */ } |
|||
} |
|||
} |
|||
</syntaxhighlight> |
|||
=== [[C-Sharp|C#]] === |
|||
Namensräume werden in der [[Programmiersprache]] [[C-Sharp|C#]] häufig verwendet. Alle [[Klasse (Objektorientierung)|Klassen]] des [[.Net-Framework]] sind in Namensräumen organisiert. Darüber hinaus werden benutzerdefinierte Namensräume von [[Programmierer]]n häufig verwendet, um ihre Arbeit zu organisieren und Namenskollisionen zu vermeiden. Wenn sie auf eine Klasse verweisen, sollten sie entweder ihren vollständig qualifizierten Namen angeben, d. h. den Namensraum gefolgt vom Klassennamen, oder eine ''using''-Anweisung hinzufügen. Dadurch entfällt die Notwendigkeit, den vollständigen Namen aller Klassen in diesem Namensraum anzugeben. Im folgenden Beispiel ist ''System'' ein Namensraum und ''Console'' und ''Convert'' sind Klassen, die dort definiert sind.<syntaxhighlight lang="csharp"> |
|||
namespace Space |
|||
{ |
|||
class Program |
|||
{ |
|||
public static void Main(string[] args) |
|||
{ |
|||
Console.WriteLine("Hallo Europa! Hallo Amerika!"); |
|||
int number = Convert.ToInt32("3"); |
|||
Console.WriteLine("Hallo " + number + ". Welt!"); |
|||
} |
|||
} |
|||
} |
|||
</syntaxhighlight> |
|||
=== [[PHP]] === |
|||
<syntaxhighlight lang="php"> |
|||
namespace Fahrzeug\PKW; |
|||
use Antrieb\Motor; |
|||
class Kleinwagen { |
|||
protected $motor; |
|||
public function __construct(Motor $motor) { |
|||
$this->motor = $motor; |
|||
} |
|||
} |
|||
</syntaxhighlight> |
|||
== Öffentliche Namensräume == |
|||
* [[Domain Name System]] (DNS) |
|||
* [[IPv4]]-Adressen |
|||
* [[IPv6]]-Adressen |
|||
* [[Network Service Access Point|NSAP]]-Adressen |
|||
* [[Internetwork Packet Exchange|IPX]]-Adressen |
|||
* [[Rufnummer]]n |
|||
* [[International Mobile Equipment Identity|IMEI]] |
|||
* Ethernet [[MAC-Adresse]]n |
|||
* UUID ([[Universally Unique Identifier]]) |
|||
* EPC ([[Elektronischer Produktcode]]) |
|||
** EAN ([[European Article Number]]) |
|||
*** ISBN ([[Internationale Standardbuchnummer]]) |
|||
*** ISSN ([[Internationale Standardnummer für fortlaufende Sammelwerke|International Standard Serial Number]]) |
|||
* [[Object Identifier]] (OID) |
|||
Bei öffentlichen Namensräumen gibt es besonders das Problem der Verwaltung, denn alle (Markt-)Teilnehmer müssen sich einigen, so dass kein Name zwei unterschiedliche Dinge bezeichnet. Aus diesem Grund gibt es in der Regel Verwaltungsorganisationen, die ''Namensräume'' oder Teilbereiche davon verwalten und Ausschnitte davon für einzelne Teilnehmer reservieren. Hier wiederum gibt es das Problem, dass diese Verwaltungsorganisationen in der Regel selbst eine [[Monopol]]-Stellung haben, so dass sie bei Gewinnorientierung Monopolpreise zum Nachteil der Teilnehmer erzielen könnten. Zudem stellt ein solches Monopol eine Schwachstelle dar, denn bei Ausfall der Verwaltungsorganisation kann je nach Integration der Teilnehmer der Geschäftsbetrieb dieser Teilnehmer erheblich gestört werden. Dies gilt nicht nur, aber auch für das [[Domain Name System]], denn die [[Namensauflösung]] muss in diesem Fall [[online]] geschehen. |
|||
== Siehe auch == |
|||
* [[Adressraum]] |
|||
* [[Namensraum (UML)]] – Namensraum in der Unified Modeling Language 2.0 |
|||
* [[Namensraum (XML)]] – Namensräume in XML |
|||
== Weblinks == |
|||
{{Wiktionary}} |
|||
[[Kategorie:Programmiersprachelement]] |
Aktuelle Version vom 14. Juni 2024, 12:51 Uhr
Der Namensraum (englisch namespace) ist ein Begriff aus der Programmierung. Dabei werden – vor allem bei der objektorientierten Programmierung – die Namen für Objekte in einer Art Baumstruktur angeordnet und über entsprechende Pfadnamen eindeutig angesprochen.
Vereinfacht bedeutet dies, dass innerhalb eines solchen Raumes jeder Name eindeutig ein Objekt bezeichnet. Der gleiche Name kann jedoch in einem anderen Namensraum wieder frei zur Bezeichnung eines anderen Objekts benutzt werden. Außerdem können diese unabhängigen Namensräume innerhalb einer Hierarchie verbunden werden.
Auch MediaWiki-Wikis wie eine Wikipedia sind in Namensräume aufgeteilt.
Technische Details
[Bearbeiten | Quelltext bearbeiten]Ein Name identifiziert ein Element der Programmiersprache (z. B. ein Objekt, eine Klasse oder eine Funktion). Zur eindeutigen Zuordnung ist jedoch der entsprechende Kontext – der Namensraum – zu beachten. Die Beschreibung geschieht in der Programmierung üblicherweise durch die sogenannte „Punktnotation“, wobei analog zu einer Baumstruktur die einzelnen Objekte, mit ihren Eigenschaften (Attribute) und Methoden, angesprochen werden. Neben der Punktnotation sind aber auch andere Zeichen gebräuchlich, so wie z. B. bei Dateinamen mit Schrägstrichen („/
“) oder umgekehrten Schrägstrichen („\
“). Die meisten Namensräume, z. B. Dateisysteme, sind hierarchisch aufgebaut, d. h., sie können selbst wieder aus Namensräumen bestehen. Namensräume werden dazu verwendet, Konflikte bei der Namensvergabe zu verhindern. Graphisch sind Namensräume mit Bäumen äquivalent, d. h., sie haben eine Wurzel (einen festen, definierten Ausgangspunkt), Knoten (Verzeichnisse) und Blätter (Objekte).
Die Idee von Namensräumen wird auch in anderen Bereichen unter anderen Namen verwendet, z. B. in der Telefonie. Jeder Teilnehmer erhält eine individuelle Rufnummer, z. B. 4711, und diese wird lokal vergeben. Das Telefonnetz ist hierbei in Unternetze unterteilt und die Identifikation erfolgt über die Vorwahl. Somit kann jede Rufnummer mehrfach vergeben werden, sie muss nur innerhalb des Unternetzes eindeutig sein. Bei einem Anruf im selben Vorwahlbereich reicht somit die Angabe der Rufnummer 4711. Soll ein Teilnehmer aus dem Vorwahlbereich 0815 kontaktiert werden, der ebenfalls die Rufnummer 4711 besitzt, so wählt man die 0815 vor. Durch diese Technik können mehrere Teilnehmer die gleiche Rufnummer 4711 besitzen. In diesem Beispiel wäre die 0815 der Namensraum, 4711 der eigentliche Name und der Ziel-Telefonanschluss das identifizierte Objekt.
Beim Erstellen von Programmen kann ein Autor unter Benutzung von Namensräumen große Programmpakete mit vielen definierten Namen schreiben, ohne sich Gedanken machen zu müssen, ob die neu eingeführten Namen in Konflikt mit anderen Namen stehen. Im Unterschied zu der Situation ohne Namensräume wird hier nicht der ganze Name neu eingeführt, sondern nur ein Teil des Namens, nämlich der des Namensraumes.
Ein Namensraum ist ein deklaratorischer Bereich, der einen zusätzlichen Bezeichner an jeden Namen anheftet, der darin deklariert wurde. Dieser zusätzliche Bezeichner macht es weniger wahrscheinlich, dass ein Namenskonflikt auftritt mit Namen, die anderswo im Programm deklariert wurden. Es ist möglich, den gleichen Namen in unterschiedlichen Namensräumen ohne Konflikt zu verwenden, auch wenn der gleiche Name in derselben Übersetzungseinheit vorkommt. Solange er in unterschiedlichen Namensräumen erscheint, ist jeder Name eindeutig aufgrund des zugefügten Namensraumbezeichners.
Die meisten modernen Programmiersprachen unterstützen Namensräume. Die Auszeichnungssprache XML unterstützt ebenfalls Namensräume, wobei das Präfix durch einen Doppelpunkt vom lokalen Namen getrennt wird.
Für viele Programmiersprachen ist der Namensraum ein Kontext für ihre Bezeichner. In einem Betriebssystem ist ein Beispiel für einen Namensraum ein Verzeichnis. Jeder Name in einem Verzeichnis identifiziert eine Datei oder ein Unterverzeichnis eindeutig.
Namen in einem Namensraum können in der Regel nicht mehr als eine Bedeutung haben. Das heißt, verschiedene Bedeutungen können nicht denselben Namen im selben Namensraum haben. Ein Namensraum wird auch als Kontext bezeichnet, da derselbe Name in verschiedenen Namensräumen unterschiedliche Bedeutungen haben kann, die jeweils für seinen Namensraum geeignet sind.
In der Programmiersprache Java haben Bezeichner, die in Namensräumen angezeigt werden, einen kurzen lokalen Namen und einen eindeutigen langen „qualifizierten“ Namen für die Verwendung außerhalb des Namensraums.
Einige Compiler für Sprachen wie C++ kombinieren Namensräume und Namen für den internen Gebrauch im Compiler in einem Prozess, der name mangling genannt wird.
Neben der oben beschriebenen technischen Verwendung der abstrakten Sprache verfügen einige Programmiersprachen unter anderem über ein bestimmtes Schlüsselwort, das zur expliziten Steuerung von Namensräumen verwendet wird.
Beispiele
[Bearbeiten | Quelltext bearbeiten]namespace Germany
{
string anthemTitle = "Das Lied der Deutschen";
}
namespace Austria
{
string anthemTitle = "Land der Berge";
}
void output1()
{
string anthemTitle = "Schweizerpsalm";
cout << Germany::anthemTitle << endl; // Ausgabe: Das Lied der Deutschen
cout << Austria::anthemTitle << endl; // Ausgabe: Land der Berge
cout << anthemTitle << endl; // Ausgabe: Schweizerpsalm
}
void output2()
{
using namespace Germany;
cout << anthemTitle << endl; // Ausgabe: Das Lied der Deutschen
cout << Austria::anthemTitle << endl; // Ausgabe: Land der Berge
}
void output3()
{
using namespace Austria;
cout << Germany::anthemTitle << endl; // Ausgabe: Das Lied der Deutschen
cout << anthemTitle << endl; // Ausgabe: Land der Berge
}
void output4()
{
using namespace Germany;
using namespace Austria;
cout << anthemTitle << endl; // Fehler: Referenz auf anthemTitle ist mehrdeutig
}
Namensräume dürfen in C++ auch geschachtelt werden:
namespace nested1
{
namespace nested2
{
namespace nested3 { /* ... */ }
}
}
Namensräume werden in der Programmiersprache C# häufig verwendet. Alle Klassen des .Net-Framework sind in Namensräumen organisiert. Darüber hinaus werden benutzerdefinierte Namensräume von Programmierern häufig verwendet, um ihre Arbeit zu organisieren und Namenskollisionen zu vermeiden. Wenn sie auf eine Klasse verweisen, sollten sie entweder ihren vollständig qualifizierten Namen angeben, d. h. den Namensraum gefolgt vom Klassennamen, oder eine using-Anweisung hinzufügen. Dadurch entfällt die Notwendigkeit, den vollständigen Namen aller Klassen in diesem Namensraum anzugeben. Im folgenden Beispiel ist System ein Namensraum und Console und Convert sind Klassen, die dort definiert sind.
namespace Space
{
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Hallo Europa! Hallo Amerika!");
int number = Convert.ToInt32("3");
Console.WriteLine("Hallo " + number + ". Welt!");
}
}
}
namespace Fahrzeug\PKW;
use Antrieb\Motor;
class Kleinwagen {
protected $motor;
public function __construct(Motor $motor) {
$this->motor = $motor;
}
}
Öffentliche Namensräume
[Bearbeiten | Quelltext bearbeiten]- Domain Name System (DNS)
- IPv4-Adressen
- IPv6-Adressen
- NSAP-Adressen
- IPX-Adressen
- Rufnummern
- IMEI
- Ethernet MAC-Adressen
- UUID (Universally Unique Identifier)
- EPC (Elektronischer Produktcode)
- Object Identifier (OID)
Bei öffentlichen Namensräumen gibt es besonders das Problem der Verwaltung, denn alle (Markt-)Teilnehmer müssen sich einigen, so dass kein Name zwei unterschiedliche Dinge bezeichnet. Aus diesem Grund gibt es in der Regel Verwaltungsorganisationen, die Namensräume oder Teilbereiche davon verwalten und Ausschnitte davon für einzelne Teilnehmer reservieren. Hier wiederum gibt es das Problem, dass diese Verwaltungsorganisationen in der Regel selbst eine Monopol-Stellung haben, so dass sie bei Gewinnorientierung Monopolpreise zum Nachteil der Teilnehmer erzielen könnten. Zudem stellt ein solches Monopol eine Schwachstelle dar, denn bei Ausfall der Verwaltungsorganisation kann je nach Integration der Teilnehmer der Geschäftsbetrieb dieser Teilnehmer erheblich gestört werden. Dies gilt nicht nur, aber auch für das Domain Name System, denn die Namensauflösung muss in diesem Fall online geschehen.
Siehe auch
[Bearbeiten | Quelltext bearbeiten]- Adressraum
- Namensraum (UML) – Namensraum in der Unified Modeling Language 2.0
- Namensraum (XML) – Namensräume in XML