Imenski prostor (informatika)

Imenski prostor je apstraktni kontejner ili okruženje izrađeno da sadrži logično grupisanje jedinstvenih identifikatora ili simbola (tj. imena). Identifikator definisan u imenskom prostoru je asociran sa tim imenskim prostorom. Isti identifikator može biti nezavisno definisan u više imenskih prostora. To jest značenje asocirano sa identifikatorom definisano u jednom imenskom prostoru može i ne mora imati isto značenje kao isti identifikator definisan u nekom drugom imenskom prostoru. Jezici koji podržavaju imenske prostore određuju pravila koja utvrđuju kojem imenskom prostoru identifikator (tj. ne njegova definicija) pripada.

Na primer, Pera radi za firmu H i njegov R broj je 123. Mika radi za firmu U i njegovog R broj je takođe 123. Pera i Mika mogu imati isti R broj zato što oni rade za različite firme. Različite fiirme bi u ovom slučaju simbolizovale različite imenske prostore. Došlo bi do ozbiljne zabune ako bi dve osobe radile za istu firmu, a i dalje imale isti R broj. Na primer, ček sa platom izdat zaposlenom broj R123 ne bi identifikovao koji čovek treba da primi ček.

U velikim kompjuterskim programima ili dokumentima nije neuobičajeno da postoji stotine ili hiljade identifikatora. Imenski prostori (ili slična tehnika, npr. emulirani imenski prostori), obezbeđuju mehanizam za skrivanje lokalnih identifikatora. Oni obezbeđuju sredstva za grupisanje logički povezanih identifikatora u odgovarajuće imenske prostore, tim putem čine sistem modularnim.

Kompjuterski uređaji za skladištenje podataka i mnogi moderni programski jezici obezbeđuju podršku za imenske prostore. Uređaji za čuvanje podataka koriste direktorijume (ili foldere) kao imenske prostore. Ovo omogućava da dve datoteke sa istim imenom budu sačuvane na uređaju sve dok se nalaze u različitim direktorijumima. U nekim programskim jezicima (npr. C++, Pajton) identifikatori koji imenuju imenske prostore i sami su asocirani sa imenskim prostorom koji ih obuhvata. Dakle, u ovim jezicima imenski prostori se mogu ugnezditi, formirajući stablo imenskih prostora. U korenu ovog stabla je neimenovan globalni imenski prostor.

Upotreba u uobičajenim jezicima uredi

C++ uredi

U C++ jeziku, imenski prostor je definisan sa blokom imenskog prostora.

namespace abc {
 int bar;
)

U okviru ovog bloka, identifikatori se mogu koristiti upravo onako kako su deklarisani. Izvan ovog bloka, specifikator imenskog prostora mora imati prefiks. Na primer, van namespace abc bar mora se napisati abc::bar da bi mu se pristupilo. C++ poseduje još jednu konstrukciju koja čini ovaj verbalizam nepotrebnom. Dodavanje linije

using namespace abc;

delu koda, čini prefiks abc:: nepotrebnim.

Kod koji nije eksplicitno deklarisan unutar imenskog prostora smatra se da je u globalnom imenskom prostoru.

Razrešavanje imenskog prostora u C++ je hijerarhijsko. To znači da se u okviru hipotetičkog imenskog prostora храна::супа identifikator пилећа odnosi na храна::супа::пилећа ako postoji. Ako ne postoji, onda se odnosi na храна::пилећа, ako to postoji. Ako ni to ne postoji, пилећа se odnosi na globalni identifikator u imenskom prostoru.

Imenski prostori u C++ najčešće se koriste kako bi se izbegle kolizije imenovanja. Iako su imenski prostori u širokoj upotrebi u skorašnjem C++ kodu, većina starijeg koda ne koristi ovu pogodnost. Na primer, cela C++ standardna biblioteka definisana je u okviru namespace std, a pre standardizacije mnoge komponente su prvobitno bile u globalnom imenskom prostoru.

Java uredi

U Java programskom jeziku ideja imenskog prostor je otelotvorena u Java paketima. Sav kod pripada paketu, mada taj paket ne mora biti izričito imenovan. Kodu iz drugih paketa pristupa se stavljanjem imena paketa pre odgovarajućeg identifikatora, na primer class String u package java.lang može se navesti kao java.lang.String (ovo se naziva potpuno kvalifikovanim imenima klasa. Poput C++, Java nudi konstrukt koji čini unos imena paketa nepotrebnim import. Međutim, neke funkcije (kao što je odraz) zahtevaju da programer koristi u potpunosti kvalifikovano ime.

Za razliku od C++ imenski prostori u Javi nisu hijerarhijski što se tiče sintakse jezika. Međutim, paketi su imenovani na hijerarhijski način. Na primer, svi paketi koji počinju sa java deo su Java platforma-paketa java.lang koji sadrži osnovne klase jezika, a java.lang.reflect sadrži klase koje se posebno odnose na refleksiju.

U Javi (kao i u Adi, C, i drugim jezicima), imenski prostori / paketi izražavaju semantičke kategorije koda. Na primer, u C#, namespace System sadrži kod koji je obezbedio sistem (.NET frejmvork). Koliko specifične su ove kategorije i koliko duboko idu hijerarhije razlikuje se od jezika do jezika.

Funkcija i obim klasa može se posmatrati kao implicitni imenski prostori koji su neraskidivo povezani sa vidljivošću, dostupnošću i životnim vekom objekta.

XML imenski prostor uredi

U XML specifikaciji imenskog prostora omogućava da imena elemenata i atributa u XML dokumentu budu jedinstvena, što je slično ulozi imenskih prostora u programskim jezicima. Koristeći XML imenske prostore, XML dokumenti mogu da sadrže imena elementa ili atributa iz više od jednog XML rečnika.

Emuliranje imenskih prostora uredi

U programskim jezicima koje ne pružaju jezičku podršku za imenske prostore, imenski prostori mogu biti donekle emulirani upotrebom konvencije imenovanja identifikatora. Na primer, C biblioteke poput Libpng često koriste fiksni prefiks za sve funkcije i promenljive koje su deo njihovog izloženog interfejsa. Libpng izlaže identifikatore poput:

png_create_write_struct
png_get_signature
png_read_row
png_set_invalid

Ovo donekle osigurava jedinstvenost identifikatora i da se stoga mogu koristiti u većim programima, bez bojazni od kolizija imenovanja identifikatora.

Nažalost, ova tehnika ima nekoliko nedostataka:

  • Ne prenosi se dobro na ugnežđene imenske prostore; identifikatori postaju preterano dugački.
  • Pojedinci ili organizacije mogu da koriste drastično nedosledne konvencije imenovanja, potencijalno uvodeći neželjeno zapetljavanje.
  • Složene ili „zasnovane na upitu“ operacije na grupama identifikatora, zasnovane na imenskim prostorima u kojima su deklarisani, pokazuju se kao nepogodne za rukovanje ili nepraktične.
  • Sve upotrebe identifikatora moraju, u stvari, biti u[potpunosti kvalifikovane za imenski prostor. Jezici sa direktnom podrškom za imenske prostore obično obezbeđuju načine da programer unapred deklariše da želi da koristi neke ili sve identifikatore iz određenog imenskog prostora, koji se onda mogu koristiti bez kvalifikacija za ostatak bloka.

Vidi još uredi