Névtér - Namespace

A számítástechnikában a névtér olyan jelek ( nevek ) halmaza , amelyeket különféle típusú objektumok azonosítására és hivatkozására használnak. A névtér biztosítja, hogy az összes objektumkészlet egyedi névvel rendelkezzen, így könnyen azonosíthatók .

A névterek általában hierarchiákként vannak felépítve, hogy lehetővé tegyék a nevek újrafelhasználását különböző kontextusokban. Analógiaként vegye figyelembe az emberek elnevezési rendszerét, ahol minden személynek van egy adott neve, valamint a családtagjaival megosztott családnevet. Ha a családtagok keresztneve csak minden családon belül egyedi, akkor minden személy egyedileg azonosítható a keresztnév és a családnév kombinációjával; csak egy Jane Doe van, bár sok Janes lehet. A Doe család névterében csak a "Jane" elegendő, hogy egyértelműen kijelölje ezt a személyt, míg az összes ember "globális" névterében a teljes nevet kell használni.

A névterek kiemelkedő példái közé tartoznak a fájlrendszerek , amelyek neveket rendelnek a fájlokhoz. Egyes programozási nyelvek változóikat és alprogramjaikat névterekbe rendezik . 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 izolált névtereken keresztül a virtualizációs tárolók támogatása érdekében .

Hasonlóképpen, a hierarchikus fájlrendszerek könyvtárakba rendezik a fájlokat. Minden könyvtár egy külön névtér, így a "betűk" és a "számlák" könyvtárak egyaránt tartalmazhatnak "to_jane" fájlt.

A számítógépes programozás során a névterek jellemzően a szimbólumok és azonosítók csoportosítására szolgálnak egy adott funkció köré, valamint a névütközések elkerülésére több azonos azonosítóval.

A hálózatépítés során a tartománynévrendszer a webhelyeket (és egyéb erőforrásokat) hierarchikus névterekbe rendezi .

Névütközések

Az elemeket a fejlesztő határozza meg. Ez gyakran konfliktust eredményez, amikor különböző XML -alkalmazásokból származó XML -dokumentumokat próbál keverni.

Ez az XML HTML táblázatadatokat tartalmaz:

<table>
    <tr>
        <td>Apples</td>
        <td>Oranges</td>
    </tr>
</table>

Ez az XML információkat tartalmaz egy asztalról (azaz egy bútordarabról):

<table>
    <name>African Coffee Table</name>
    <width>80</width>
    <length>120</length>
</table>

Ha ezeket az XML -töredékeket összeadnánk, 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.

Egy XML -elemző nem tudja, hogyan kell kezelni ezeket a különbségeket.

Megoldás előtaggal

A névütközések az XML -ben könnyen elkerülhetők névelőtag használatával.

A következő XML megkülönbözteti a HTML táblával és a bútorokkal kapcsolatos információkat az elemek elején lévő "h" és "f" előtaggal.

<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>

Elnevezési rendszer

A névtérben lévő név egy névtérnévből és egy helyi névből áll. A névtér nevét általában a helyi név előtagjaként alkalmazzák .

A kibővített Backus-Naur formában :

name = <namespace name> separator <local name>

Ha a helyi neveket önmagukban használják, a névfeloldást használják annak eldöntésére, hogy melyik (ha van) adott névre utal egy bizonyos helyi név.

Példák

Példák nevekre egy névtérben
Kontextus Név Névtér neve Helyi név
Pálya /home/user/readme.txt readme.txt (fájlnév)
Domain név www.example.com www (levél domain név)
C ++ std :: tömb sor
UN/LOCODE USA NYC NYC (helység)
XML xmlns: xhtml = " http://www.w3.org/1999/xhtml "
<xhtml: body>
test
Perl $ DBI :: errstr $ errstr
Jáva java.util.Dátum Dátum
Egységes erőforrásnév (URN) urn: nbn: fi-fe19991055 urn: nbn (Nemzeti bibliográfiai számok) fi-fe19991055
Fogantyú rendszer 10.1000/182 10 (kezelje az elnevezési jogosultságot) 1000/182 (helyi név kezelése)
Digitális objektumazonosító 10.1000/182 10.1000 (kiadó) 182 (publikáció)
Mac cím 01-23-45-67-89-ab 01-23-45 ( szervezetileg egyedi azonosító ) 67-89-ab (NIC specifikus)
PCI azonosító 1234 abcd 1234 (szállítóazonosító) abcd (eszközazonosító)
USB VID/PID 2341 003f 2341 (szállítóazonosító) 003f (termékazonosító)
SPARQL dbr: Sydney dbr (korábban deklarált ontológia, pl. a @prefix dbr megadásával: < http://dbpedia.org/resource/ >) Sydney

Delegáció

A felelősségek felek közötti delegálása fontos a valós alkalmazásokban, például a világháló szerkezetében. A névterek lehetővé teszik az azonosítók hozzárendelésének átruházását több nevet kibocsátó szervezethez, miközben megtartják a globális egyediséget. Egy központi regisztrációs hatóság regisztrálja a hozzárendelt névtérneveket . Minden névtér -nevet egy szervezethez rendelnek hozzá, amely később felelős a nevek hozzárendeléséért a hozzárendelt névtérben. Ez a szervezet lehet egy névkibocsátó szervezet, amely maga adja ki a neveket , vagy egy másik regisztrációs hatóság, amely tovább ruházja a névtér egy részét különböző szervezetekre.

Hierarchia

A névterek harmadik feleknek történő továbbadását lehetővé tevő elnevezési séma hierarchikus névtér .

A hierarchia rekurzív, ha a névtérnevek szintaxisa minden egyes továbbadás esetén azonos. A rekurzív hierarchia példája a tartománynévrendszer .

Egy példa a nem rekurzív hierarchiára az Uniform Resource Name, amely egy Internet Assigned Numbers Authority (IANA) számot képvisel.

Az urnák hierarchikus névterületi lebontása : isbn: 978-3-16-148410-0 , Karl Popper The Logic of Scientific Discovery című könyvének azonosítója, 10. kiadás.
Iktató hivatal Anyakönyvvezető Példa azonosító Névtér neve Névtér
Egységes erőforrásnév (URN) Internet hozzárendelt számok hatóság urna: isbn: 978-3-16-148410-0 urna Formális URN névtér
Formális URN névtér Internet hozzárendelt számok hatóság urna: isbn: 978-3-16-148410-0 ISBN Nemzetközi standard könyvszámok, mint egységes erőforrásnevek
Nemzetközi cikkszám (EAN) GS1 978-3-16-148410-0 978 Könyvföld
Nemzetközi standard könyvszám (ISBN) Nemzetközi ISBN Ügynökség 3-16-148410-X 3 Német nyelvű országok
Német kiadói kód Agentur für Buchmarktstandards 3-16-148410-X 16 Mohr Siebeck

Névtér kontra hatókör

A névtér neve kontextust ( hatókört biztosíthat a számítástechnikában) adhat a névnek, és a kifejezéseket néha felcserélve használják. A név kontextusát azonban más tényezők is biztosíthatják, például a hely, ahol előfordul, vagy a név szintaxisa.

Példák helyi és globális hatókörű elnevezési rendszerekre, névterekkel és anélkül
Névtér nélkül Névtérrel
Helyi hatókör Jármű rendszámtáblája Fájlrendszer -hierarchia szabvány
Globális hatókör Univerzálisan egyedi azonosító Domain név rendszer

Programozási nyelveken

Sok programozási nyelv esetében a névtér az azonosítók kontextusa . Operációs rendszerben például a névtér egy könyvtár. A könyvtár minden neve egyedileg azonosít egy fájlt vagy alkönyvtárat.

A névtérben szereplő neveknek általában nem lehet több jelentésük; vagyis a különböző jelentések nem használhatják ugyanazt a nevet ugyanabban a névtérben. A névteret kontextusnak is nevezik , mivel ugyanaz a név a különböző névterekben különböző jelentéssel bírhat, mindegyik a névterének megfelelő.

A névterek további jellemzői az alábbiak:

A fentiekben ismertetett absztrakt nyelvi technikai használata mellett néhány nyelv rendelkezik egy speciális kulcsszóval, amelyet többek között kifejezett névtér -vezérlésre használnak. Az alábbiakban egy példa látható a C ++ névtérben:

#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.
}

Számítástechnikai megfontolások

A névtér a számítástechnikában (más néven a névhatókörét ) egy absztrakt tartályt vagy környezetében tartani logikai csoportosítása egyedi azonosítók vagy szimbólumok (azaz nevek). A névtérben meghatározott azonosító csak ehhez a névtérhez van társítva. Ugyanaz az azonosító önállóan definiálható több névtérben. Vagyis az egyik névtérben meghatározott azonosító jelentése lehet ugyanaz, mint egy másik névtérben meghatározott azonosítóé. A névtereket támogató nyelvek meghatározzák azokat a szabályokat, amelyek meghatározzák, hogy az azonosító (nem a definíciója) melyik névtérhez tartozik.

Ezt a fogalmat analógiával illusztrálhatjuk. Képzelje el, hogy két vállalat, X és Y, egyenként azonosítószámokat rendel hozzá alkalmazottaihoz. X -nek nem lehet két azonos azonosítószámú alkalmazottja, és ugyanígy Y -nak sem; de nem jelent problémát, ha mindkét cégnél ugyanazt az azonosító számot használják. Például, ha Bill az X vállalatnál, Jane pedig az Y vállalatnál dolgozik, akkor nem jelent problémát, hogy mindegyikük munkavállaló #123. Ebben az analógiában az azonosítószám az azonosító, és a vállalat szolgál névtérként. Nem okoz problémát, ha ugyanaz az azonosító azonosít minden személyt minden névtérben.

Nagy számítógépes programokban vagy dokumentumokban gyakori, hogy több száz vagy ezer azonosítóval rendelkezik. A névterek (vagy hasonló technika, lásd Emlékeztető névterek ) mechanizmust biztosítanak a helyi azonosítók elrejtésére. Eszközt biztosítanak a logikailag kapcsolódó azonosítók megfelelő névterekbe való csoportosítására, ezáltal modulárisabbá téve a rendszert .

Az adattároló eszközök és sok modern programozási nyelv támogatja a névtereket. A tárolóeszközök névtérként könyvtárakat (vagy mappákat) használnak. Ez lehetővé teszi két azonos nevű fájl tárolását az eszközön mindaddig, amíg különböző könyvtárakban vannak tárolva. Bizonyos programozási nyelveken (pl. C ++ , Python ) a névtereket elnevező azonosítók maguk is egy záró névtérhez vannak társítva. Így ezeken a nyelveken névterek fészek, amely egy névtér fa . Ennek a fának a gyökere a névtelen globális névtér .

Használja a közös nyelveken

C

Lehetőség van névtelen struktúrák használatára névterekként C -ben C99 óta .

// 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 ++

A C ++ nyelvben egy névteret egy névtérblokk határozza meg.

namespace abc {
    int bar;
}

Ezen a blokkon belül az azonosítók pontosan a deklarált módon használhatók. E blokkon kívül a névtér -specifikátort előtaggal kell ellátni. Például kívül namespace abc, barírásban kell abc::barhozzá lehessen férni. A C ++ egy másik konstrukciót tartalmaz, amely szükségtelenné teszi ezt a beszédességet. A sor hozzáadásával

using namespace abc;

kódrészlethez az előtagra abc::már nincs szükség.

A névtérben kifejezetten nem deklarált azonosítókat a globális névtérben lévőnek kell tekinteni.

int foo;

Ezeket az azonosítókat pontosan a deklarált módon lehet használni, vagy mivel a globális névtér névtelen, a névtér ::-specifikátor előtaggal is ellátható. Például fooírható is ::foo.

A névtér felbontása a C ++ nyelvben hierarchikus. Ez azt jelenti, hogy a feltételezett névtéren belül food::soupaz azonosító chickenhivatkozik food::soup::chicken. Ha food::soup::chickennem létezik, akkor arra utal food::chicken. Ha egyik food::soup::chickensem food::chickenlétezik, akkor a globális névtér azonosítójára chickenutal ::chicken.

A C ++ névtéreit leggyakrabban a névütközések elkerülésére használják . Bár a névterek széles körben használatosak 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 ++ szabványos könyvtár 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 az usingirányelvet, hogy megkerülje a névtér felbontási követelményeit, és visszamenőleges kompatibilitást szerezzen a régebbi kóddal, amely elvárja, hogy minden azonosító a globális névtérben legyen. Mindazonáltal az usingirányelvnek a visszafelé való kompatibilitástól eltérő okokból (pl. Kényelem) való alkalmazása a jó kódgyakorlattal ellentétesnek tekintendő.

Jáva

A Java -ban a névtér ötlete a Java csomagokban testesül meg . Minden kód egy csomaghoz tartozik, bár ezt a csomagot nem kell kifejezetten megnevezni. Kód más csomagok érhető előtaggal a csomag nevét, mielőtt a megfelelő azonosító, például class Stringaz is nevezik (ezt nevezik a teljes minősített osztály neve ). A C ++ -hoz hasonlóan a Java olyan konstrukciót kínál, amely szükségtelenné teszi a csomag nevének ( ) beírását . Azonban bizonyos funkciók (például tükrözés ) megkövetelik a programozótól, hogy a teljesen minősített nevet használja. package java.langjava.lang.Stringimport

A C ++ - val ellentétben a Java névterei nem hierarchikusak a nyelv szintaxisát illetően. A csomagok nevezése azonban hierarchikus. Például minden csomag, amely azzal kezdődik, javaa Java platform része - a csomag java.langtartalmazza a nyelvhez tartozó java.lang.reflectosztályokat , és kifejezetten a reflexióhoz kapcsolódó alapvető osztályokat.

A Java -ban (és az Ada , C# és másokban) a névterek/csomagok szemantikai kódkategóriákat fejeznek ki. Például a C#-ban namespace Systema rendszer (a .NET -keretrendszer ) által biztosított kódot tartalmazza . Ezek a kategóriák mennyire specifikusak és milyen mélyre nyúlnak a hierarchiák, nyelvenként eltérőek.

A funkciók és osztályok hatókörei 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 .

C#

A névterek erősen használatosak a C# nyelven. Minden .NET Framework osztály névtérbe van rendezve, hogy világosabban lehessen használni és elkerülni a káoszt. Ezenkívül a programozók széles körben használják az egyéni névtereket, mind a munkájuk megszervezésére, mind a névütközések elkerülésére . Az osztályra való hivatkozáskor meg kell adni annak teljesen minősített nevét, ami névteret jelent, amelyet az osztály neve követ,

System.Console.WriteLine("Hello World!");
int i = System.Convert.ToInt32("123");

vagy használjon utasításokat. Ez azt jelenti, hogy nem szükséges megemlíteni az adott névtérben lévő összes osztály teljes nevét.

using System;

Console.WriteLine("Hello World!");
int i = Convert.ToInt32("123");

A fenti példákban a Rendszer névtér, a Konzol és a Konvertálás pedig a Rendszeren belül meghatározott osztályok .

Piton

A Pythonban a névtereket az egyes modulok határozzák meg, és mivel a modulok hierarchikus csomagokban is elhelyezhetők, a névterek is hierarchikusak. Általánosságban elmondható, hogy amikor egy modult importálnak, akkor a modulban megadott neveket a modul névtérén keresztül határozzák meg, és a hívó modulokból érik el a teljes minősítésű név használatával.

# assume modulea defines two functions : func1() and func2() and one class : Class1
import Modulea

Modulea.func1()
Modulea.func2()
a = Modulea.Class1()

Az from ... import ...utasítás használható a megfelelő nevek beszúrására közvetlenül a hívó modul névterébe, és ezek a nevek elérhetők a hívó modulból minősített név nélkül:

# 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), felülírhatja a meglévő neveket figyelmeztetés nélkül.

A utasítás speciális formája az from ... import *, hogy a megnevezett csomagban megadott összes nevet közvetlenül a hívó modul névterébe importálja. Ennek az importálási formának a használata, bár a nyelven 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 neveket felülírja.

A Python támogatja azt is import x as y, hogy álnevet vagy alternatív nevet adjon meg a hívó modul számára:

import numpy as np

a = np.arange(1000)
XML névtér

Az XML -ben az XML névtér -specifikáció lehetővé teszi, hogy az XML -dokumentum elemeinek és attribútumainak nevei egyediek legyenek, hasonlóan a névterek szerepéhez a programozási nyelvekben. Az XML névterek használatával az XML dokumentumok több XML szókincs elem- vagy attribútumnevet is tartalmazhatnak.

PHP

A névterek az 5.3 -as verziótól kezdve kerültek bevezetésre a PHP -be . Az osztályok, függvények és változók elnevezési ütközése elkerülhető. A PHP -ben egy névteret egy névtérblokk határozza 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évtérre 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();

Névterek utánozása

Azokban a programozási nyelvekben, amelyek nem támogatják a névterek nyelvi támogatását, a névterek bizonyos mértékben emulálhatók egy azonosító elnevezési konvenció használatával . Például a C könyvtárak, mint például a libpng, gyakran rögzített előtagot használnak minden olyan függvényhez és változóhoz, amelyek a kitett felületük részét képezik. A Libpng olyan azonosítókat tesz közzé, mint:

png_create_write_struct
png_get_signature
png_read_row
png_set_invalid

Ez az elnevezési megállapodás ésszerű biztosítékot nyújt arra, hogy az azonosítók egyediek, és ezért nagyobb programokban is használhatók ütközések elnevezése nélkül . Hasonlóképpen, sok, eredetileg Fortranban írt csomag (pl. BLAS , LAPACK ) fenntartja a függvény nevének első néhány betűjét annak jelzésére, hogy melyik csoporthoz tartozik.

Ennek a technikának számos hátránya van:

  • Nem méretezhető jól beágyazott névterekhez; Az azonosítók túl hosszúra nyúlnak, mivel az azonosítók minden felhasználásának teljes mértékben névtér-minősítésűnek kell lennie .
  • Magánszemélyek vagy szervezetek használhatnak következetlen elnevezési konvenciókat, amelyek potenciálisan nem kívánt zavarokat okozhatnak.
  • Az azonosítók csoportjain végzett összetett vagy "lekérdezés-alapú" műveletek azon névterek alapján, amelyekben deklarálták őket, nehézkessé vagy kivitelezhetetlenné válnak.
  • A korlátozott azonosító hosszúságú nyelvekben az előtagok használata korlátozza a funkció által azonosítható karakterek számát. Ez különösen az eredetileg FORTRAN 77 -ben írt csomagok esetében jelent problémát , amelyek azonosítónként csak 6 karaktert kínáltak. Például a BLAS függvény neve DGEMMazt 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 tesz: mátrix-mátrix szorzás ( az "MM").

Számos előnye van:

  • Nincs szükség speciális szoftvereszközökre a nevek forráskódfájlokban történő megkereséséhez. Elég egy ilyen egyszerű program, mint a grep .
  • Nincsenek névtérnevek ütközései.
  • Nincs szükség névkezelésre, és így nincsenek esetleges összeférhetetlenségi problémák.

Lásd még

Hivatkozások