From Wikipedia, the free encyclopedia
A számítástechnikában a névtér olyan jelek (nevek) halmaza, amelyeket különböző típusú objektumok azonosítására és hivatkozására használnak. Ez biztosítja, hogy egy adott objektumkészlet minden eleme egyedi nevet kapjon, így könnyen azonosítható.
A névterek általában hierarchikus szerkezetben vannak kialakítva, hogy lehetővé tegyék a nevek újrafelhasználását különböző szövegösszefüggésekben. Analógiaként gondolhatunk például az emberek elnevezési rendszerére, ahol minden személynek van egy keresztneve és egy családneve, ami közös a rokonaival. Ha a családtagok keresztnevei csak a családon belül egyediek, akkor minden személyt egyértelműen azonosíthatunk a keresztneve és a családneve kombinációjával; csak egy Jane Doe van, bár lehet több Jane is. A Doe család névtérében a „Jane" elegendő a személy egyértelmű jelöléséhez, míg az „összes ember" globális névtéren belül a teljes név használata szükséges.
A névterekre jó példák a fájlrendszerek, amelyek neveket rendelnek a fájlokhoz.[1] Egyes programozási nyelvek névterekbe rendezik változóikat és „szubrutinjaikat”.[2][3] A számítógépes hálózatok és az elosztott rendszerek neveket rendelnek az erőforrásokhoz, például számítógépekhez, nyomtatókhoz, webhelyekhez és távoli fájlokhoz. Az operációs rendszerek feloszthatják a kernel erőforrásait elszigetelt névterekkel a virtualizációs tárolók támogatása érdekében.
Hasonlóan, a hierarchikus fájlrendszerek könyvtárakba szervezik a fájlokat. Minden könyvtár külön névtér, tehát a „levelek” és a „számlák” könyvtárban is lehet egy „to_jane” nevű fájl.
A programozásban a névtereket általában arra használják, hogy a szimbólumokat és azonosítókat egy adott funkcionalitás köré csoportosítsák, és elkerüljék a névütközéseket olyan azonosítók között, amelyek ugyanazt a nevet viselik.
A hálózati kommunikációban a Domain Name System hierarchikus névterekbe szervezi a webhelyeket (és más erőforrásokat).
Az elemek nevét a fejlesztő határozza meg. Ez gyakran ütközést eredményez a különböző XML-alkalmazásokból származó XML-dokumentumokkal való keverésekor.
Ez az XML HTML-tábla információkat tartalmaz:
<table>
<tr>
<td>Apples</td>
<td>Oranges</td>
</tr>
</table>
Ez az XML információkat tartalmaz egy „table”-ről, asztalról (azaz egy bútorról):
<table>
<name>Mahogany Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
Ha ezeket az XML-töredékeket összeadnák, névütközés lépne fel. Mindkettő tartalmaz egy <table>...</table>
elemet, de az elemek eltérő tartalommal és jelentéssel bírnak.
Az XML-elemző nem tudja, hogyan kezelje ezeket a különbségeket.
Az XML-ben előforduló névütközések könnyen elkerülhetők névelőtag használatával.
A következő XML megkülönbözteti a HTML-táblázat „table”-jét és a bútorokkal kapcsolatos „table”-t úgy, hogy az elemek elején „h" és „f" előtagot ír elő.
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Oranges</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>Mahogany Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
A névtérben lévő név névtérnévből és helyi névből áll.[4][5] A névtér nevét általában a helyi név előtagjaként alkalmazzák.
Kibővített Backus–Naur-formában:
név = <névtér neve> elválasztó <helyi név>
Ha a helyi neveket önmagukban használjuk, a névfeloldást használják annak eldöntésére, hogy egy adott helyi név melyik névre utal (ha van ilyen).
Kontextus | Név | Névtér neve | Helyi név |
---|---|---|---|
Elérési út | /home/user/readme.txt | /home/user (könyvtár) | readme.txt (fájl név) |
Tartománynév | www.example.com | example.com (tartománynév) | www (levéltartománynév) |
C++ | std::array | std (C++ névtér) | array (struktúra) |
UN/LOCODE | US NYC | US (ország vagy terület) | NYC (helység) |
XML | xmlns:xhtml="http://www.w3.org/1999/xhtml" <xhtml:body> |
xhtml (korábban deklarált XML névtér xhtml="http://www.w3.org/1999/xhtml") | body (elem) |
Perl | $DBI::errstr | $DBI (Perl modul) | errstr (változó) |
Java | java.util.Date | java.util (Java névtér) | Date (osztály) |
Egységes erőforrásnév (URN) | urn:nbn:fi-fe19991055 | urn:nbn (National Bibliography Numbers) | fi-fe19991055 |
Handle System | 10.1000/182 | 10 (névadó jogosultság kezelése) | 1000/182 (helyi név kezelése) |
Digitális objektumazonosító | 10.1000/182 | 10.1000 (kiadó) | 182 (kiadvány) |
MAC-cím | 01-23-45-67-89-ab | 01-23-45 (szervezetileg egyedi azonosító) | 67-89-ab (NIC specifikus) |
PCI ID | 1234 abcd | 1234 (vendor ID) | abcd (eszközazonosító) |
USB VID/PID | 2341 003f[6] | 2341 (vendor ID) | 003f (termékazonosító) |
SPARQL | dbr:Sydney | dbr (korábban deklarált ontológia, pl. @prefix dbr megadásával: <http://dbpedia.org/resource/>) | Sydney |
A felelősségek delegálása fontos az alkalmazásokban, mint például a World Wide Web szerkezetében. A névterek lehetővé teszik az azonosítók kiosztásának delegálását több neveket kibocsátó szervezetnek, miközben globális egyediséget biztosítanak.[7] Egy központi regisztrációs hatóság regisztrálja a kiosztott névtérneveket. Minden névtérnév egy szervezethez van kiosztva, amely később felelős a nevek kiosztásáért a hozzájuk rendelt névtérben. Ez a szervezet lehet egy neveket kibocsátó szervezet, amely maga rendeli hozzá a neveket, vagy egy másik regisztrációs hatóság, amely további részeket delegál névterükből különböző szervezeteknek.
A hierarchikus névtér, olyan névképzési séma, amely lehetővé teszi a névtér részeknek történő aldelegálását harmadik feleknek.
Egy hierarchia rekurzív, ha a névtérnevek szintaxisa ugyanaz minden aldelegálás esetén. Egy példa a rekurzív hierarchiára a Domain névrendszer.
Egy nem rekurzív hierarchia példája az Internet Assigned Numbers Authority (IANA) számot reprezentáló Uniform Resource Name (URN).
Iktató hivatal | Regisztráló | Példa azonosító | Névtér neve | Névtér |
---|---|---|---|---|
Egységes erőforrásnév (URN) | Internet Assigned Numbers Authority | urn:isbn:978-3-16-148410-0 | urna | Formális URN névtér |
Formális URN névtér | Internet Assigned Numbers Authority | urn:isbn:978-3-16-148410-0 | ISBN | [rfc:3187 Nemzetközi szabványos könyvszámok, mint egységes forrásnevek] |
Nemzetközi cikkszám (EAN) | GS1 | 978-3-16-148410-0 | 978 | Bookland |
Nemzetközi szabványos könyvszám (ISBN) | International ISBN Agency | 3-16-148410-X | 3 | német nyelvű országok |
Német kiadói kód | Agentur für Buchmarktstandards | 16 | Mohr Siebeck |
A névtér neve kontextust biztosíthat (a számítástechnikában hatókört)a névhez, és a kifejezéseket néha felcserélhetően használják. A név kontextusát azonban más tényezők is megadhatják, például az előfordulási hely vagy a név szintaxisa.
Névtér nélkül | Névtérrel | |
---|---|---|
Helyi hatókör | Gépjármű rendszámtábla | Fájlrendszer-hierarchia szabvány |
Globális hatókör | Univerzálisan egyedi azonosító | Domain Name System |
Sok programozási nyelv esetén a névtér a neveik kontextusa. Egy operációs rendszerben a névtér példája lehet egy könyvtár. Egy könyvtárban minden név egyértelműen azonosít egy fájlt vagy alkönyvtárat.[8]
Általános szabály, hogy a névterekben a neveknek nem lehet több jelentése; azaz különböző jelentések nem oszthatják meg ugyanazt a nevet ugyanabban a névtérben. A névtér emiatt kontextusnak is nevezhető, mert ugyanaz a név különböző névterekben más-más jelentéssel bír, amely megfelel az adott névtérnek.
A névtérnek további jellemzői a következők:
A fent leírt absztrakt nyelvi technikai használaton túlmenően egyes nyelvek tartalmaznak egy speciális kulcsszót, amelyet többek között az explicit névtér szabályozására használnak. Az alábbiakban egy példa látható a C++ névterére:
#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.
}
A számítástechnikában a névtér (néha névtartománynak is nevezik) egy absztrakt tároló vagy környezet, amelyet egyedi azonosítók vagy szimbólumok (azaz nevek) logikai csoportosítására hoztak létre. Egy névtérben definiált azonosító csak ahhoz a névtérhez tartozik. Ugyanaz az azonosító egymástól függetlenül definiálható több névtérben. Tehát egy azonosító, amely egy névtérben van definiálva, jelenti ugyanazt is vagy jelenti mást is, mint ugyanaz az azonosító egy másik névtérben. A névtereket támogató nyelvek leírják azokat a szabályokat, amelyek meghatározzák, hogy egy azonosító melyik névtérhez tartozik.[9]
Ezt a fogalmat egy analógiával lehet szemléltetni. Képzeljük el, hogy két vállalat, X és Y, mindegyiküknek van dolgozóihoz hozzárendelve azonosítószám. Az X vállalatnak nem lehet két dolgozója ugyanazzal az azonosítószámmal, és ugyanez igaz a Y vállalatra is. Azonban nem probléma, ha ugyanaz az azonosítószám mindkét vállalatnál használatban van. Például, ha Bill az X vállalatnál dolgozik, és Jane az Y vállalatnál, akkor nem probléma, hogy mindketten a 123-as dolgozói azonosítót kapják. Ebben az analógiában az azonosító a dolgozói azonosítószám és a vállalat szolgál a névtérként. Nem okoz problémát, hogy ugyanaz az azonosító különböző személyeket azonosítson meg a különböző névterekben.
Nagy programokban vagy dokumentumokban gyakran száznál is több azonosító található. A névterek lehetővé teszik a helyi azonosítók elrejtését. Biztosítják a logikailag kapcsolódó azonosítók megfelelő névterekbe történő csoportosítását, ezáltal modulárisabbá téve a rendszert.
Adattároló eszközök és sok modern programozási nyelv támogatja a névtereket. Az adattároló eszközök könyvtárakat (vagy mappákat) használnak névterekként. Ez lehetővé teszi, hogy két azonos nevű fájl legyen tárolva az eszközön, feltéve, hogy különböző könyvtárakban vannak tárolva. Néhány programozási nyelvben (például C++, Python) a névtereket elnevező azonosítók maguk is kapcsolatban állnak egy beágyazó névtérrel. Így ezekben a nyelvekben a névterek egymásba ágyazódhatnak, létrehozva egy névtérfa struktúrát. Ennek a fának a gyökerénél található a globális névtér.
A C99 óta lehetőség van névtelen struktúrák névtérként való használatára C- ben.
// 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);
}
A C++ nyelvben egy névteret egy névtérblokk határoz meg.[10]
namespace abc {
int bar;
}
Ezen a blokkon belül az azonosítók pontosan úgy használhatók, ahogyan deklarálva vannak. Ezen a blokkon kívül a névtér-meghatározót előtaggal kell ellátni. A C++ tartalmaz egy másik konstrukciót is, amely szükségtelenné teszi ezt a bőbeszédűséget. Az alábbi hozzáadásával:
using namespace abc;
az abc::
előtagra már nincs szükség.
A névtérben kifejezetten nem deklarált azonosítók a globális névtérben találhatók.
int foo;
Ezek az azonosítók pontosan úgy használhatók, ahogyan deklarálva vannak, vagy mivel a globális névtér névtelen, a névtér-meghatározó ::
előtagként is megadható. Például foo
írható is ::foo
.
A C++ névtérfelbontása hierarchikus. Ez azt jelenti, hogy a hipotetikus névtéren belül food::soup
az azonosító chicken
a következőre utal food::soup::chicken
. Ha food::soup::chicken
nem létezik, akkor arra hivatkozik food::chicken
. Ha sem food::soup::chicken
és food::chicken sem
létezik, akkor chicken
a globális névtérben található ::chicken
azonosítóra hivatkozik.
A C++ névtereit leggyakrabban az elnevezési ütközések elkerülésére használják. Bár a névtereket széles körben használják a legújabb C++ kódokban, a legtöbb régebbi kód nem használja ezt a lehetőséget, mert nem létezett a nyelv korai verzióiban. Például a teljes C++ Standard Library belül van definiálva namespace std
, de a szabványosítás előtt sok összetevő eredetileg a globális névtérben volt. A programozó beillesztheti a using
direktívát, hogy megkerülje a névtérfeloldási követelményeket, és visszafelé kompatibilis legyen a régebbi kóddal, amely elvárja, hogy minden azonosító a globális névtérben legyen. Az irányelvnek a visszafelé kompatibilitáson kívüli okokból (pl. kényelem) való felhasználása azonban using
ellentétes a helyes kódexszel.
A Java nyelvben a névtér gondolata Java csomagokban testesül meg. Minden kód egy csomaghoz tartozik. A más csomagokból származó kódok a csomag nevének a megfelelő azonosító előtti előtaggal érhetők el. A C++-hoz hasonlóan a Java is kínál egy konstrukciót, amely szükségtelenné teszi a csomagnév beírását. Bizonyos funkciók (például a tükrözés)azonban megkövetelik a programozótól, hogy a teljesen minősített nevet használja.
A C++-tól eltérően a Java névterei nem hierarchikusak, a nyelv szintaxisát miatt. A csomagok elnevezése azonban hierarchikus módon történik. Például minden olyan csomaggal kezdődően, amely a Java platformjava
részét képezi – a csomag tartalmazza a nyelv alapvető osztályait, és kifejezetten a tükrözéshez kapcsolódó alapvető osztályokat.
A Java (és Ada , C# és mások) nyelvben a névterek/csomagok a kód szemantikai kategóriáit fejezik ki. Például C#-ban namespace System
a rendszer által biztosított kódot tartalmazza (a .NET-keretrendszer). Az, hogy mennyire specifikusak ezek a kategóriák, és milyen mélyre mennek a hierarchiák, nyelvenként eltérő.
A függvény- és osztálytartományok implicit névtereknek tekinthetők, amelyek elválaszthatatlanul kapcsolódnak a láthatósághoz, a hozzáférhetőséghez és az objektum élettartamához.
A névtereket gyakran használják a C# nyelvben. Minden .NET-keretrendszer-osztály névterekbe van rendezve, hogy egyértelműbben használhatók legyenek, és elkerülhető legyen a káosz. Ezenkívül a programozók széles körben alkalmazzák az egyéni névtereket munkájuk szervezésére és az elnevezési ütközések elkerülésére. Amikor egy osztályra hivatkozunk, meg kell adni vagy annak teljes nevét, ami a névterét jelenti, amelyet az osztályneve követ.
System.Console.WriteLine("Hello World!");
int i = System.Convert.ToInt32("123");
vagy adjunk hozzá using kulcsszót. Ezzel szükségtelenné válik az adott névtérben található összes osztály teljes nevének használata.
using System;
Console.WriteLine("Hello World!");
int i = Convert.ToInt32("123");
A fenti példákban a System névtér, a Console és a Convert pedig a System-ben meghatározott osztályok.
A Pythonban a névtereket az egyes modulok határozzák meg, és mivel a modulok hierarchikus csomagokba foglalhatók, a névterek is hierarchikusak.[11][12] Általánosságban elmondható, hogy modul importálásakor a modulban definiált nevek a modul névterén keresztül kerülnek meghatározásra, és a hívó modulokból a teljesen minősített név használatával érhetők el.
# assume modulea defines two functions : func1() and func2() and one class : Class1
import Modulea
Modulea.func1()
Modulea.func2()
a = Modulea.Class1()
A from ... import ...
utasítással a megfelelő neveket közvetlenül a hívó modul névterébe lehet beilleszteni, és ezek a neveket a hívó modulból a minősített név nélkül elérhetők:
# 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()
Mivel ez közvetlenül importálja a neveket (minősítés nélkül), figyelmeztetés nélkül felülírhatja a meglévő neveket.
Az utasítás egy speciális formája, from ... import *
amely a megnevezett csomagban meghatározott összes nevet közvetlenül a hívó modul névterébe importálja. Az importálás ezen formájának használata, bár a nyelven belül támogatott, általában nem ajánlott, mivel szennyezi a hívó modul névterét, és névütközések esetén a már meghatározott nevek felülírását okozza.
A Python import x as y
a hívó modul által használható álnevet vagy alternatív nevet is támogatja:
import numpy as np
a = np.arange(1000)
Az XML-ben az XML névtér-specifikáció lehetővé teszi, hogy az XML-dokumentumban szereplő elemek és attribútumok nevei egyediek legyenek, hasonlóan a programozási nyelvek névtereihez. XML-névterek használatával az XML-dokumentumok egynél több XML-szókincsből is tartalmazhatnak elem- vagy attribútumneveket.
A névtereket az 5.3-as verziótól kezdve vezették be a PHP- ba. Az osztályok, függvények és változók neveinek ütközése elkerülhető a segítségével. A PHP- ban egy névteret egy névtérblokk határoz meg.
# 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';
}
}
A PHP névterekre a következő módokon hivatkozhatunk:
# 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();
Azokban a programozási nyelvekben, amelyek nem támogatják a névtereket, a névterek bizonyos mértékig emulálhatók egy azonosító elnevezési konvenció használatával.[13] Például a C-könyvtárak, a libpng, gyakran fix előtagot használnak minden olyan függvényhez és változóhoz, amely a nyílt felület részét képezi. A Libpng olyan azonosítókat tesz közzé, mint például:
png_create_write_struct png_get_signature png_read_row png_set_invalid
Ez az elnevezési konvenció biztosítékot nyújt arra vonatkozóan, hogy az azonosítók egyediek, és ezért nagyobb programokban is használhatók elnevezési ütközések nélkül. Hasonlóképpen, sok eredetileg Fortranban írt csomag (pl. BLAS , LAPACK)lefoglalja egy függvény nevének első néhány betűjét, hogy jelezze, melyik csoporthoz tartozik.
E technika hátrányai:
DGEMM
jelzi, hogy kettős pontosságú számokkal („D”) és általános mátrixokkal („GE”) működik, és csak az utolsó két karakter mutatja, hogy valójában mit is csinál: mátrix-mátrix szorzás ("MM").Előnyei:
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.