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

Příklady jmen v oboru názvů
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 ).

Hierarchické členění oboru názvů pro urn: isbn: 978-3-16-148410-0 , identifikátor knihy The Logic of Scientific Discovery od Karla Poppera, 10. vydání.
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.

Příklady systémů pojmenování s místním a globálním rozsahem as obory názvů i bez nich
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ů:

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, barmusí 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 foomůž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::soupidentifikátor chickenodkazuje food::soup::chicken. Pokud food::soup::chickenneexistuje, pak odkazuje na food::chicken. Pokud neexistuje food::soup::chickenani food::chickenneexistuje, chickenodkazuje na ::chickenidentifiká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 usingsmě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í usingsmě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 Stringv 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.langjava.lang.Stringimport

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 javajsou součástí platformy Java - balíček java.langobsahuje základní třídy jazyka a java.lang.reflectobsahuje 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 Systemobsahuje 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 yjako 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říkladDGEMM 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é

Reference