Jmenný prostor - Namespace
V oblasti výpočetní techniky je obor názvů sada znaků ( jmen ), které se používají k identifikaci a odkazování na objekty různého druhu. Obor jmen zajišťuje, že všechny dané sady objektů mají jedinečná jména, takže je lze snadno identifikovat .
Jmenné prostory jsou obvykle strukturovány jako hierarchie, které umožňují opětovné použití jmen v různých kontextech. Jako analogii zvažte systém pojmenování lidí, kde má každá osoba křestní jméno, stejně jako příjmení sdílené s jejich příbuznými. Pokud jsou křestní jména členů rodiny jedinečná pouze v rámci každé rodiny, pak lze každou osobu jednoznačně identifikovat kombinací křestního jména a příjmení; Jane Doe je jen jedna, i když Janes může být mnoho. V oboru názvů rodiny Doe stačí k jednoznačnému označení této osoby pouze „Jane“, zatímco v „globálním“ oboru názvů všech lidí musí být použito celé jméno.
Mezi prominentní příklady pro obory názvů patří souborové systémy , které přiřazují názvy souborů. Některé programovací jazyky organizují své proměnné a podprogramy v oborech názvů. Počítačové sítě a distribuované systémy přiřazují názvy prostředkům, jako jsou počítače, tiskárny, webové stránky a vzdálené soubory. Operační systémy mohou rozdělovat prostředky jádra izolovanými obory názvů na podporu virtualizačních kontejnerů .
Podobně hierarchické systémy souborů organizují soubory v adresářích. Každý adresář je samostatný obor názvů, takže adresáře „písmena“ a „faktury“ mohou obsahovat soubor „to_jane“.
V počítačovém programování se obory názvů obvykle používají za účelem seskupování symbolů a identifikátorů kolem konkrétní funkce a aby se předešlo kolizím názvů mezi více identifikátory, které sdílejí stejný název.
V síti organizuje systém názvů domén weby (a další prostředky) do hierarchických jmenných prostorů .
Konflikty jmen
Názvy prvků jsou definovány vývojářem. Při pokusu o smíchání dokumentů XML z různých aplikací XML to často vede ke konfliktu.
Tento XML nese informace o tabulce HTML :
<table>
<tr>
<td>Apples</td>
<td>Oranges</td>
</tr>
</table>
Tento XML nese informace o stole (tj. Kusu nábytku):
<table>
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
Pokud by byly tyto fragmenty XML sečteny, došlo by ke konfliktu názvů. Oba obsahují <table>...</table>
prvek, ale prvky mají odlišný obsah a význam.
Analyzátor XML nebude vědět, jak tyto rozdíly zpracovat.
Řešení pomocí předpony
Konfliktům názvů v XML lze snadno zabránit pomocí předpony jména.
Následující XML rozlišuje mezi informacemi o tabulce HTML a nábytku předponou „h“ a „f“ na začátku prvků.
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Oranges</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
Pojmenovací systém
Název v oboru názvů se skládá z názvu oboru názvů a místního názvu. Název oboru názvů se obvykle používá jako předpona místního názvu.
V rozšířené formě Backus – Naur :
name = <namespace name> separator <local name>
Pokud jsou místní názvy používány samy o sobě, rozlišení názvů se používá k rozhodnutí, ke kterému (pokud existuje) konkrétnímu jménu zmiňuje nějaký konkrétní místní název.
Příklady
Kontext | název | Název oboru názvů | Místní název | |
---|---|---|---|---|
Cesta | /home/user/readme.txt | readme.txt (název souboru) | ||
Doménové jméno | www.example.com | www (název domény listu) | ||
C ++ | std :: pole | pole | ||
UN/LOCODE | USA NYC | NYC (lokalita) | ||
XML | xmlns: xhtml = " http://www.w3.org/1999/xhtml " <xhtml: body> |
tělo | ||
Perl | $ DBI :: chyba | $ errstr | ||
Jáva | java.util.Date | datum | ||
Jednotný název zdroje (URN) | urn: nbn: fi-fe19991055 | urn: nbn (národní bibliografická čísla) | fi-fe19991055 | |
Systém rukojeti | 10,1000/182 | 10 (zpracovat oprávnění k pojmenování) | 1000/182 (zpracovat místní název) | |
Identifikátor digitálních objektů | 10,1000/182 | 10.1000 (vydavatel) | 182 (publikace) | |
MAC adresa | 01-23-45-67-89-ab | 01-23-45 ( organizačně jedinečný identifikátor ) | 67-89-ab (specifické pro NIC) | |
PCI ID | 1234 abcd | 1234 (ID dodavatele) | abcd (ID zařízení) | |
USB VID/PID | 2341 003f | 2341 (ID dodavatele) | 003f (ID produktu) | |
SPARQL | dbr: Sydney | dbr (dříve deklarovaná ontologie, např. zadáním @prefix dbr: < http://dbpedia.org/resource/ >) | Sydney |
Delegace
Delegování odpovědnosti mezi stranami je důležité v reálných aplikacích, jako je struktura World Wide Web. Jmenné prostory umožňují delegování přiřazení identifikátorů organizacím vydávajícím více jmen při zachování globální jedinečnosti. Centrální registrační úřad registruje přidělené přidělené názvy oborů názvů . Každý název oboru názvů je přidělen organizaci, která je následně zodpovědná za přiřazování jmen v jejich přiděleném oboru názvů. Tato organizace může být organizace vydávající jméno, která přiřazuje názvy sama, nebo jiná registrační autorita, která dále deleguje části svého oboru názvů různým organizacím.
Hierarchie
Schéma pojmenování, které umožňuje subdelegování oborů názvů na třetí strany, je hierarchický obor názvů .
Hierarchie je rekurzivní, pokud je syntaxe pro názvy oborů názvů stejná pro každé subdelegování. Příkladem rekurzivní hierarchie je systém názvů domén .
Příkladem nerekurzivní hierarchie jsou Uniform Resource Name představující číslo IANA ( Internet Assigned Numbers Authority ).
Registr | Registrátor | Příklad identifikátoru | Název oboru názvů | Jmenný prostor |
---|---|---|---|---|
Jednotný název zdroje (URN) | Úřad pro přidělování čísel internetu | urn: isbn: 978-3-16-148410-0 | urna | Formální obor názvů URN |
Formální obor názvů URN | Úřad pro přidělování čísel internetu | urn: isbn: 978-3-16-148410-0 | ISBN | Mezinárodní standardní čísla knih jako jednotná jména zdrojů |
Mezinárodní číslo článku (EAN) | GS1 | 978-3-16-148410-0 | 978 | Bookland |
Mezinárodní standardní číslo knihy (ISBN) | Mezinárodní agentura ISBN | 3-16-148410-X | 3 | Německy mluvící země |
Kód německého vydavatele | Standardy agentur pro Buchmarkt | 3-16-148410-X | 16 | Mohr Siebeck |
Obor názvů versus obor
Jméno namespace může poskytnout kontext ( působnost v oblasti informatiky) ke jménu a termíny jsou někdy zaměňují. Kontext jména však mohou poskytovat i další faktory, například místo, kde se vyskytuje, nebo syntaxe jména.
Bez prostoru jmen | S oborem jmen | |
---|---|---|
Místní rozsah | Registrační značka vozidla | Standard hierarchie souborového systému |
Globální rozsah | Univerzálně jedinečný identifikátor | Domain Name System |
V programovacích jazycích
Pro mnoho programovacích jazyků je obor názvů kontextem pro jejich identifikátory . V operačním systému je příkladem oboru názvů adresář. Každý název v adresáři jednoznačně identifikuje jeden soubor nebo podadresář.
Jména v oboru názvů zpravidla nemohou mít více než jeden význam; to znamená, že různé významy nemohou sdílet stejné jméno ve stejném prostoru jmen. Obor názvů se také nazývá kontext , protože stejný název v různých oborech názvů může mít různé významy, každý vhodný pro svůj obor názvů.
Níže jsou uvedeny další charakteristiky jmenných prostorů:
- Jména v oboru názvů mohou představovat objekty i pojmy , ať už jmenný prostor je přirozený nebo etnický jazyk , konstruovaný jazyk , technická terminologie profese, dialekt , sociolekt nebo umělý jazyk (např. Programovací jazyk ).
- V programovacím jazyce Java mají identifikátory, které se objevují v oborech názvů, krátký (místní) název a jedinečný dlouhý „kvalifikovaný“ název pro použití mimo obor názvů.
- Některé kompilátory (pro jazyky, jako je C ++ ) kombinují obory názvů a názvy pro interní použití v kompilátoru v procesu zvaném manipulace s názvy .
Kromě technického využití abstraktního jazyka, jak je popsáno výše, mají některé jazyky mimo jiné specifické klíčové slovo používané pro explicitní řízení oboru názvů. Níže je uveden příklad oboru názvů v jazyce C ++:
#include <iostream>
// This is how one brings a name into the current scope. In this case, it's
// bringing them into global scope.
using std::cout;
using std::endl;
namespace box1 {
int box_side = 4;
}
namespace box2 {
int box_side = 12;
}
int main() {
int box_side = 42;
cout << box1::box_side << endl; // Outputs 4.
cout << box2::box_side << endl; // Outputs 12.
cout << box_side << endl; // Outputs 42.
}
Úvahy o informatice
Obor názvů v informatice (někdy nazývaná také název rozsah ) je abstraktní kontejner nebo prostředí vytvořené držet logické seskupení jedinečných identifikátorů nebo symboly (tj jména). Identifikátor definovaný v oboru názvů je přidružen pouze k tomuto oboru názvů. Stejný identifikátor lze nezávisle definovat ve více oborech názvů. To znamená, že identifikátor definovaný v jednom oboru názvů může, ale nemusí mít stejný význam jako stejný identifikátor definovaný v jiném oboru názvů. Jazyky, které podporují obory názvů, určují pravidla, která určují, do kterého oboru názvů patří identifikátor (nikoli jeho definice).
Tento koncept lze ilustrovat analogií. Představte si, že dvě společnosti, X a Y, každá přidělí svým zaměstnancům identifikační čísla. X by neměl mít dva zaměstnance se stejným ID číslem a podobně pro Y; ale není problém, aby stejné ID číslo bylo použito u obou společností. Pokud například Bill pracuje pro společnost X a Jane pracuje pro společnost Y, pak pro každého z nich není problém být zaměstnancem č. 123. V této analogii je ID číslo identifikátor a společnost slouží jako obor názvů. Nezpůsobuje to, aby stejný identifikátor identifikoval v každém oboru názvů jinou osobu.
Ve velkých počítačových programech nebo dokumentech je běžné mít stovky nebo tisíce identifikátorů. Obor názvů (nebo podobná technika, viz Emulace oborů názvů ) poskytuje mechanismus pro skrytí místních identifikátorů. Poskytují způsob seskupování logicky souvisejících identifikátorů do odpovídajících jmenných prostorů, čímž je systém více modulární .
Datová úložiště a mnoho moderních programovacích jazyků podporují obory názvů. Úložná zařízení používají adresáře (nebo složky) jako obory názvů. To umožňuje uložit do zařízení dva soubory se stejným názvem, pokud jsou uloženy v různých adresářích. V některých programovacích jazycích (např. C ++ , Python ) jsou identifikátory pojmenovávající jmenné prostory samy spojeny s uzavírajícím jmenným prostorem. V těchto jazycích se tedy obory názvů mohou vnořovat a tvořit strom jmenného prostoru . Kořenem tohoto stromu je nejmenovaný globální obor názvů .
Používejte v běžných jazycích
- C
Je možné použít anonymní struktury jako obory názvů v C od C99 .
// helper.c
static int _add(int a, int b) {
return a + b;
}
const struct {
double pi;
int (*add) (int, int);
} helper = { 3.14, _add };
// helper.h
const struct {
double pi;
int (*add) (int, int);
} helper;
// main.c
#include <stdio.h>
#include "helper.h"
int main(){
printf("3 + 2 = %d\n", helper.add(3, 2));
printf("pi is %f\n", helper.pi);
}
- C ++
V jazyce C ++ je obor názvů definován blokem oboru názvů.
namespace abc {
int bar;
}
V tomto bloku lze používat identifikátory přesně tak, jak jsou deklarovány. Mimo tento blok musí mít předponu specifikátor oboru názvů. Například, vně namespace abc
, bar
musí být napsán abc::bar
, které mají být přístupné. C ++ obsahuje další konstrukci, která činí tuto výřečnost zbytečnou. Přidáním řádku
using namespace abc;
na kus kódu, předpona abc::
již není potřeba.
Identifikátory, které nejsou výslovně deklarovány v oboru názvů, jsou považovány za v globálním oboru názvů.
int foo;
Tyto identifikátory lze použít přesně tak, jak jsou deklarovány, nebo, protože globální obor názvů není pojmenován, lze specifikátor oboru názvů zadat ::
předponou. Například foo
může být také napsáno ::foo
.
Rozlišení oboru názvů v C ++ je hierarchické. To znamená, že v hypotetickém oboru názvů food::soup
identifikátor chicken
odkazuje food::soup::chicken
. Pokud food::soup::chicken
neexistuje, pak odkazuje na food::chicken
. Pokud neexistuje food::soup::chicken
ani food::chicken
neexistuje, chicken
odkazuje na ::chicken
identifikátor v globálním oboru názvů.
Jmenné prostory v C ++ se nejčastěji používají k zamezení kolizí pojmenování . Přestože se jmenné prostory v nedávném kódu C ++ široce používají, většina starších kódů toto zařízení nepoužívá, protože v dřívějších verzích jazyka neexistoval. Například celá standardní knihovna C ++ je definována uvnitř namespace std
, ale před standardizací bylo mnoho komponent původně v globálním oboru názvů. Programátor může vložit using
směrnici, aby obešel požadavky na rozlišení jmenného prostoru a získal zpětnou kompatibilitu se starším kódem, který očekává, že všechny identifikátory budou v globálním oboru názvů. Použití using
směrnice z jiných důvodů, než je zpětná kompatibilita (např. Pohodlí), je však považováno za odporující osvědčeným postupům v oblasti kódu.
- Jáva
V Javě je myšlenka prostoru jmen ztělesněna v balíčcích Java . Veškerý kód patří do balíčku, ačkoli tento balíček nemusí být výslovně pojmenován. K kódu z jiných balíků se přistupuje předponou názvu balíčku před příslušný identifikátor, například class String
v může být označován jako (toto je známé jako plně kvalifikovaný název třídy ). Stejně jako C ++ nabízí Java konstrukci, díky které není nutné zadávat název balíčku ( ). Některé funkce (například reflexe ) však vyžadují, aby programátor použil plně kvalifikovaný název.
package java.lang
java.lang.String
import
Na rozdíl od C ++ nejsou obory názvů v Javě hierarchické, pokud jde o syntaxi jazyka. Balíčky jsou však pojmenovány hierarchicky. Například všechny balíčky začínající na java
jsou součástí platformy Java - balíček java.lang
obsahuje základní třídy jazyka a java.lang.reflect
obsahuje základní třídy, které se konkrétně týkají reflexe.
V Javě (a Ada , C# a dalších) vyjadřují obory názvů/balíčky sémantické kategorie kódu. Například v C# namespace System
obsahuje kód poskytovaný systémem ( .NET Framework ). Jak specifické jsou tyto kategorie a jak hluboké jsou hierarchie, se liší jazyk od jazyka.
Rozsahy funkcí a tříd lze považovat za implicitní obory názvů, které jsou neoddělitelně spojeny s viditelností, přístupností a životností objektu .
- C#
Obor názvů se hojně používá v jazyce C#. Všechny třídy .NET Framework jsou uspořádány v oborech názvů, aby byly použity přehledněji a aby se předešlo chaosu. Kromě toho programátoři hojně používají vlastní obory názvů, a to jak k organizaci své práce, tak k zamezení kolizí pojmenování . Při odkazování na třídu byste měli zadat buď její plně kvalifikovaný název, což znamená jmenný prostor následovaný názvem třídy,
System.Console.WriteLine("Hello World!");
int i = System.Convert.ToInt32("123");
nebo přidat příkaz using . To eliminuje potřebu uvádět úplný název všech tříd v tomto oboru názvů.
using System;
Console.WriteLine("Hello World!");
int i = Convert.ToInt32("123");
Ve výše uvedených příkladech je System obor názvů a Console a Convert jsou třídy definované v System .
- Krajta
V Pythonu jsou obory názvů definovány jednotlivými moduly, a protože moduly mohou být obsaženy v hierarchických balíčcích, pak jsou obory názvů také hierarchické. Obecně platí, že když je modul importován, jsou názvy definované v modulu definovány prostřednictvím oboru názvů daného modulu a jsou přístupné z volajících modulů pomocí plně kvalifikovaného názvu.
# assume modulea defines two functions : func1() and func2() and one class : Class1
import Modulea
Modulea.func1()
Modulea.func2()
a = Modulea.Class1()
Příkaz from ... import ...
lze použít k vložení příslušných jmen přímo do oboru názvů volajícího modulu a k těmto názvům lze přistupovat z volacího modulu bez kvalifikovaného názvu:
# assume Modulea defines two functions : func1() and func2() and one class : Class1
from Modulea import func1
func1()
func2() # this will fail as an undefined name, as will the full name Modulea.func2()
a = Class1() # this will fail as an undefined name, as will the full name Modulea.Class1()
Protože to přímo importuje jména (bez kvalifikace), může to přepsat stávající jména bez varování.
Zvláštní formou příkazu je from ... import *
import všech jmen definovaných v pojmenovaném balíčku přímo do prostoru jmen volacího modulu. Použití této formy importu, přestože je v daném jazyce podporováno, se obecně nedoporučuje, protože znečišťuje prostor jmen volajícího modulu a v případě střetů jmen způsobí přepsání již definovaných jmen.
Python také podporuje import x as y
jako způsob poskytnutí aliasu nebo alternativního názvu pro použití volajícím modulem:
import numpy as np
a = np.arange(1000)
- Obor názvů XML
V XML specifikace oboru názvů XML umožňuje, aby názvy prvků a atributů v dokumentu XML byly jedinečné, podobně jako role oborů názvů v programovacích jazycích. Pomocí oborů názvů XML mohou dokumenty XML obsahovat názvy prvků nebo atributů z více než jedné slovní zásoby XML.
- PHP
Jmenné prostory byly do PHP zavedeny od verze 5.3. Pojmenování kolizí tříd, funkcí a proměnných se dá vyhnout. V PHP je obor názvů definován blokem oboru názvů.
# File phpstar/foobar.php
namespace phpstar;
class FooBar
{
public function foo(): void
{
echo 'Hello world, from function foo';
}
public function bar(): void
{
echo 'Hello world, from function bar';
}
}
Na jmenný prostor PHP můžeme odkazovat následujícími různými způsoby:
# File index.php
# Include the file
include "phpstar/foobar.php";
# Option 1: directly prefix the class name with the namespace
$obj_foobar = new \phpstar\FooBar();
# Option 2: import the namespace
use phpstar\FooBar;
$obj_foobar = new FooBar();
# Option 2a: import & alias the namespace
use phpstar\FooBar as FB;
$obj_foobar = new FB();
# Access the properties and methods with regular way
$obj_foobar->foo();
$obj_foobar->bar();
Emulace oborů názvů
V programovacích jazycích postrádajících jazykovou podporu pro obory názvů lze obory názvů do určité míry emulovat pomocí konvence pojmenování identifikátorů . Například knihovny C, jako je libpng, často používají pevnou předponu pro všechny funkce a proměnné, které jsou součástí jejich vystaveného rozhraní. Libpng zpřístupňuje identifikátory, jako jsou:
png_create_write_struct png_get_signature png_read_row png_set_invalid
Tato konvence pojmenování poskytuje přiměřenou jistotu, že identifikátory jsou jedinečné, a proto je lze použít ve větších programech bez kolizí pojmenování . Podobně mnoho balíčků původně napsaných ve Fortranu (např. BLAS , LAPACK ) si rezervuje prvních pár písmen názvu funkce, aby označilo, ke které skupině patří.
Tato technika má několik nevýhod:
- Nelze škálovat na vnořené obory názvů; identifikátory jsou příliš dlouhé, protože všechna použití identifikátorů musí plně odpovídat oboru názvů .
- Jednotlivci nebo organizace mohou používat nekonzistentní konvence pojmenování, což potenciálně může vést k nechtěnému zmatku.
- Složené nebo "dotazové" operace se skupinami identifikátorů na základě jmenných prostorů, ve kterých jsou deklarovány, jsou vykresleny nepraktické nebo neproveditelné.
- V jazycích s omezenou délkou identifikátoru použití předpon omezuje počet znaků, které lze použít k identifikaci toho, co funkce dělá. To je zvláštní problém pro balíčky původně napsané v FORTRAN 77 , který nabízel pouze 6 znaků na identifikátor. Název funkce funkce BLAS například
DGEMM
naznačuje, že pracuje s čísly s dvojitou přesností („D“) a obecnými maticemi („GE“) a pouze poslední dva znaky ukazují, co vlastně dělá: násobení matice a matice ( „MM“).
Existuje několik výhod:
- K vyhledání jmen v souborech zdrojového kódu nejsou nutné žádné speciální softwarové nástroje. Stačí jednoduchý program jako grep .
- Neexistují žádné konflikty názvů oboru názvů.
- Není třeba manipulovat se jmény, a tedy ani potenciální problémy s nekompatibilitou.
Viz také
- 11místné dodací místo PSČ
- Binomická nomenklatura (rod-druhy v biologii )
- Chemická nomenklatura
- Deweyho desetinná klasifikace
- Identifikátor digitálních objektů
- Domain Name System
- Identita (objektově orientované programování)
- Klasifikace Kongresové knihovny
- Katalogy hvězd a astronomické konvence pojmenování
- Obor názvů XML
- Vyhledávání názvu závislého na argumentu