Névtér (programozás)

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2019. május 4-én felülvizsgált verziótól ; az ellenőrzések 11 szerkesztést igényelnek .

Névtér ( eng.  namespace ) - valamilyen halmaz , amely az egyedi azonosítók (vagyis nevek) logikai csoportosítására létrehozott modellt, absztrakt tárolót vagy környezetet jelent.

A névtérben meghatározott azonosító ehhez a névtérhez van társítva . Ugyanaz az azonosító egymástól függetlenül definiálható több helyen. Így az egyik névtérben definiált azonosítóhoz társított értéknek lehet ugyanaz az értéke, mint egy másik névtérben meghatározott azonos azonosítónak. A névtér-tudatos nyelvek olyan szabályokat határoznak meg , amelyek jelzik, hogy egy azonosító melyik névtérhez tartozik (vagyis a definíciójához).

Például Andrey az X cégben dolgozik, és az azonosítója (az angol  Identifier  - azonosítóból rövidítve ) alkalmazottként 123. Oleg az Y cégnél dolgozik, és az azonosítója is 123. Az egyetlen dolog (a szempontból egy bizonyos számviteli rendszer nézete), annak köszönhetően, hogy Andrey és Oleg egyező azonosítókkal megkülönböztethető, a különböző cégekhez való tartozásuk. A vállalatok közötti különbség ebben az esetben a különböző névterek rendszere (egy cég - egy tér). Két alkalmazott jelenléte egy cégnél azonos azonosítóval nagy problémákat vet fel a használatuk során, például nagyon nehéz lesz megállapítani, hogy a 123-as azonosítóval rendelkező alkalmazottat jelölő fizetésből kinek szánják ezt a csekket.

Nagy adatbázisokban több száz vagy több ezer azonosító lehet. A névterek (vagy hasonló struktúrák ) mechanizmust biztosítanak a helyi azonosítók elrejtésére. Jelentésük az, hogy logikailag kapcsolódó azonosítókat csoportosítanak a megfelelő névtereikben, így modulárissá téve a rendszert . A változók láthatóságának korlátozása a tárolási osztály megadásával is elvégezhető .

Operációs rendszerek , sok modern programozási nyelv támogatja saját névtérmodelljét: névtérmodellként könyvtárakat (vagy mappákat) használnak. Ez lehetővé teszi két azonos nevű fájl létezését (amennyiben különböző könyvtárakban vannak). Egyes programozási nyelvekben (pl. C++ , Python ) a térnév-azonosítók maguk is hozzá vannak rendelve a megfelelő szóközökhöz. Ezért ezekben a nyelvekben a névterek egymásba fészkelhetnek, névterek fát alkotva . Egy ilyen fa gyökerét globális névtérnek nevezzük .

Szegélyek

A programozási nyelvekben a névtérhatár megadásának egyik módja lehet az ún. hatálya .

Használat nyelveken

C++

A névteret egy utasításblokk határozza meg:

névtér foo { int bar ; }

Ezen a blokkon belül az azonosítók pontosan úgy hívhatók meg, ahogyan deklarálták. De a blokkon kívül a névtér nevét meg kell adni az azonosító előtt. Például namespace fooaz azonosítón kívül a barkövetkezőt kell megadni foo::bar. A C++ tartalmaz néhány további konstrukciót, amelyek ezeket a követelményeket nem kötelezővé teszik. Tehát sor hozzáadásakor

foo névtér használata ;

kódot, foo::már nem kell előtagot megadnia. Egy másik példa:

névtér Névtér12 { int foo = 0 ; } void func1 () { névtér használata Névtér12 ; // most a Namespace12 névtér összes neve látható lesz itt további előtagok nélkül ++ foo ; } void func2 () { // és itt a nevet kell megadni: Névtér12 :: foo = 42 ; }

A névtérben kifejezetten nem deklarált kódot a rendszer a globális névtérben deklaráltnak tekinti.

A C++ névtérfelbontása hierarchikus. Ez azt jelenti, hogy egy hipotetikus névtérben еда::супaz azonosító a курицаkövetkezőt fogja jelenteni еда::суп::курица(ha a szóköz létezik). Ha nem létezik, akkor rámutat еда::курица(ha ez a tér létezik). Ha ez a tér szintén nem létezik, akkor курицаa globális térben lévő azonosítóra vonatkozik.

A névtereket gyakran használják a C++-ban a névütközések elkerülése érdekében.

névtér { int a ; void f () { /*...*/ } int g () { /*...*/ } }

Nem férhet hozzá egy névtelen névtér tagjához egyik fordítási egységből egy másik egységből.

Bár a névtereket széles körben használják a modern kódokban, a régebbi kódok nagy része nem rendelkezik ezekkel a funkciókkal. Például a teljes C++ szabványkönyvtár a -n belül van definiálva namespace std, de a szabványosítás előtt sok összetevőt eredetileg a globális térben határoztak meg.

Azt is megteheti, hogy ne a teljes teret láthatóvá tegye, hanem azon belül az egyes neveket, például:

névtér foo { int bar ; int somelse ; } int main () { használ foo :: bar ; //Csak egy sávot tesz láthatóvá, másokat láthatatlanná! return 0 ; }

Java

A névterek gondolatát a Java csomagok testesítik meg . Minden kód egy csomagon belül van meghatározva, és a csomagnak nincs szüksége kifejezett névre. Más csomagokból származó kódok elérhetők, ha a csomagnév elé a megfelelő azonosítót adják, például Stringegy csomagban lévő osztályt így hívhatunk (ezt teljesen minősített osztálynévnekjava.lang nevezik ). A C++-hoz hasonlóan a Java is biztosít egy olyan konstrukciót, amely nem kötelezővé teszi a csomagnév ( ) megadását . Egyes 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. java.lang.Stringimport

A C++-tól eltérően a Java névterek nem hierarchikusan vannak rendezve magának a nyelvnek a szintaxisa miatt. A csomagok elnevezése azonban hierarchikus stílusban történik. Például minden olyan csomag, amely a következővel kezdődik, a Java platformjava része  – a csomag tartalmazza a nyelv alaposztályait, és tartalmazza a tükrözésre (reflexióra) jellemző alaposztályokat. java.langjava.lang.reflect

A Java nyelven (valamint az Ada , C# és más nyelveken) a névterek/csomagok a kód szemantikai kategóriáit tükrözik. Például a C# namespace Systemnyelvben a rendszer által megvalósított kódot tartalmaz ( .NET platform ). A kategóriák pontos meghatározása és a hierarchia mélysége magától a nyelvtől függ.

Hatókör

Egy függvény és egy osztály egy implicit névtérként definiálható, amely bonyolultan kapcsolódik az objektum láthatóságához, elérhetőségéhez és élettartamához .

C#

A C# nyelvben vannak névterek, a használat hasonló a C++-hoz.

Python

A Pythonban a névterek ötlete modulokban valósul meg. (Ugyanúgy, mint a Java csomagokban)

JavaScript

A névterek formális támogatásának hiánya ellenére könnyen megvalósíthatók a nyelv objektumkoncepciójával:

var NameSpace_1 = {}; var Névtér_2 = új objektum (); //két névtér Névtér_1 . a = 100_ _ Névtér_2 . a = "Eper" ; // Változók a - mindegyiknek megvan a sajátja with ( NameSpace_1 ) // Adja meg az alapértelmezett névteret { a += 10 ; Névtér_2 . a += a ; //A névtér névtér_2 változója egyenlő lesz a "Strawberry110" értékkel }

XML

Az XML -ben az XML névterek specifikációja határozza meg az elem- és attribútumnevek egyediségét a dokumentumban, hasonlóan a programnyelvi névterek szerepéhez. A névterek használatával az XML-dokumentumok egynél több XML-szótárból is tartalmazhatnak elem- vagy attribútumneveket.

<rdf:RDF xmlns:rdf= "http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:foaf= "http://xmlns.com/foaf/0.1/" xmlns:rdfs= "http://www.w3.org/2000/01/rdf-schema#" > <foaf:Person rdf:about= "#JW" >

xmlns (XML névtér) - XML ​​névtér. Az RDF (RDF dokumentum létrehozásához ) , a FOAF és az RDF séma ( RDF tervezési formátum ) tartalmazza.

A FOAF  egyben egy RDF dokumentum tere is, így annak kialakítását az RDF szókincse (szabályok, specifikációk ) alapján ellenőrzik .

PHP

Az 5.3.0-s verzió óta a PHP bevezette a névtér fogalmát.

<?php névtér my\name ; // új névteret határoz meg class MyClass {} function myfunction () {} const MYCONST = 1 ; $a = új MyClass ; // hívás a saját\ névtérben $c = new \my\name\MyClass ; // teljes név használata, beleértve a névtér nevét is $d = new \globalClass ; // osztály meghívása a globális névtérből ?>

Fontos szempont. A névtér direktívának a fájl első kódsorának kell lennie. A kivétel a deklarált kulcsszó, amely megelőzheti a névtér direktívát. Még az első "<?php" konstrukció előtti HTML-kimenet sem megengedett.

A szintaxis leírása a PHP projekt hivatalos honlapján található [1] .

Common Lisp

A szabványos Common Lisp szintaxis táblanévtereket tartalmaz a csomagrendszeren keresztül [2] . Az azonosító (szimbólum) használatához meg kell adni a teljes nevét: csomagnevet, kettőspontot és magának a szimbólumnak a nevét [3] .

Az Allegro Common Lisp nem szabványos Common Lisp kiterjesztést valósít meg – hierarchikus névtereket, amelyekben a csomagokat Java stílusban pont választja el , a csomagok azonosítóját pedig kettőspont választja el. A névtér-hierarchia szomszédos csomópontjaira is lehet hivatkozni, ha két ponton keresztül megadjuk a relatív útvonalakat [4] . A Common Lisp névterei dinamikusak – a program végrehajtása során létrejönnek, feltöltődnek és megsemmisülnek. , bár leírásuk kijelentő formája az defpackage[5] forma használatával főként használatos .

PureBasic

A PureBasic 5.20 -ban bevezették a névtér-támogatást, modulként valósítva meg. A névteret a Module és EndModule parancsblokk határozza meg, és nem függ a forrásfájlok helyétől. Ez azt jelenti, hogy egy fájlban több modul is lehet, vagy fordítva - a modul kódja több fájlra osztható. Alapértelmezés szerint a teljes modultér rejtett, és az egyes elemek láthatóvá tételéhez ezeket egy speciális DeclareModule / EndDeclareModule parancsblokkban kell deklarálni. Bármi, ami nincs deklarálva ebben a blokkban, nem érhető el a modulon kívül, és a hozzáférés megkísérlése hozzáférési megsértési üzenetet eredményez a fordítótól.

DeclareModule Count x = 0 ; Nyilvános elemek Declare Counter () EndDeclareModule Modulszám _ y = 0_ _ Privát elemek Ellen eljárás () y + 1 eljárás Visszaküldés y Vége eljárás EndModule Szám: : x = 10 ; Szám írása változóba (például). Debug Count :: Számláló () ; Eljárás hívása a modul nevével. UseModule Count ; Modul leképezése az aktuális térhez. Hibakeresési számláló () ; Nyilvános (nyilvános) elemek elérése a modul nevének megadása nélkül. UnuseModule Count ; Törölje a UseModule műveletet.

A modulelemek másik modulból vagy globális térből való eléréséhez meg kell adnia a modul nevét és elemét, például: Count::x. Használhatja a UseModule parancsot is, amely lehetővé teszi az összes látható modulelem megjelenítését az aktuális térben. Műveletét az UnuseModule parancs megszakítja. Figyelembe kell venni, hogy lehetőség van több modul látható elemeinek egyidejű megjelenítésére, feltéve, hogy nincs névütközés. Tegyük fel, hogy a projektnek vannak x, y és z nevű moduljai.

UseModule x UseModule y ; A kód. Használja a z modult ; További kód. UnuseModule y ; További kód. UnuseModule x UnuseModule z

Ez a példa azt mutatja, hogy több modul is leképezhető az aktuális térre, és az sem, hogy a modulelemek megjelenítési és törlésének sorrendje nem fontos.

Névtér emuláció

A névterek natív támogatása nélküli programozási nyelvekben a szóközök emulálhatók egy kiterjesztéssel az azonosító elnevezési konvenciók használatával . Például a C - könyvtárak , mint például a Libpng , gyakran fix előtagot használnak az összes függvényhez és változóhoz a kezelőfelületük részeként. A Libpng támogatja a külső azonosítókat, például:

png_create_write_struct png_get_signature png_read_row png_set_invalid

Ez ésszerű garanciát ad arra, hogy az azonosítók egyediek lesznek, és így nagy programokban használhatók anélkül, hogy félnének az azonosítónév-ütközésektől .

A névtér-emuláció hátrányai közé tartozik :

  • A beágyazott terek normál elszámolásának hiánya; az azonosítók túl hosszúak lesznek.
  • A programozók vagy szervezetek vadul inkonzisztens elnevezési konvenciókat alkalmazhatnak, ami sok zavart okozhat.
  • Az azonosítók csoportjain végzett összetett vagy lekérdezési műveletek azon névterek alapján, amelyekben deklaráltak, túlságosan szuboptimálisan vagy egyáltalán nem kezelhetők.
  • Az azonosítókra irányuló összes hívást a teljes képzésű térnévvel kell végrehajtani. A névtereket közvetlenül támogató nyelvek általában lehetővé teszik a programozónak, hogy előre kijelentse, hogy a programban szereplő azonosítók egy részét (vagy az összeset) csak egy térből kívánja használni, amit aztán a térbeli tagság megadása nélkül használhat fel.

Jegyzetek

  1. PHP: Névtér használat: Az alapok - Kézikönyv . Letöltve: 2016. szeptember 22. Az eredetiből archiválva : 2019. január 31..
  2. Csomagok  . _ www.cs.northwestern.edu. Letöltve: 2018. december 23. Az eredetiből archiválva : 2018. december 24.
  3. Forráskód szervezet . lispmethods.com. Letöltve: 2018. december 23. Az eredetiből archiválva : 2019. március 16.
  4. Hierarchikus csomagok  . franc.com. Letöltve: 2017. június 10. Az eredetiből archiválva : 2018. december 24..
  5. CLHS: Makró DEFPCSOMAGOLÁS . www.lispworks.com Letöltve: 2017. június 10. Az eredetiből archiválva : 2019. február 1..