Šta je imenski prostor u c. Klase i imenski prostori. Pozivni kod iz imenskog prostora

Klase i prostori imena

.NET Framework klase

Možda je najveća prednost pisanja upravljanog koda - barem sa stanovišta programera - to što možete koristiti .NET biblioteka osnovnih klasa .

Klase .NET jezgra pružaju ogromnu kolekciju klasa upravljanog koda koje vam omogućavaju da riješite gotovo svaki problem koji je prethodno mogao biti riješen korištenjem Windows API-ja. Sve ove klase prate isti IL objektni model sa jednim nasljeđivanjem. To znači da možete kreirati objekte iz bilo koje osnovne .NET klase ili naslijediti vlastite klase od njih.

Ono što čini različite .NET osnovne klase je to što su dizajnirane da budu intuitivne i jednostavne za korištenje. Na primjer, da biste pokrenuli nit morate pozvati Start() metodu klase Thread. Da biste učinili TextBox objekt nedostupnim, postavite svojstvo Enabled objekta na false. Ovaj pristup, poznat Visual Basic i Java programerima čije su biblioteke jednako jednostavne za korištenje, bit će veliko olakšanje za C++ programere koji su proveli godine boreći se sa API funkcijama kao što su GetDIBits(), RegisterWndClassEx() i IsEqualIID(), kao kao i mnoge funkcije koje su zahtijevale prolazak prozorskih ručki.

Međutim, C++ programeri su oduvek imali lak pristup kompletnom skupu Windows API-ja, dok su Visual Basic 6 i Java programeri bili ograničeni na osnovnu funkcionalnost operativnog sistema kojoj pristupaju sa svojih jezika. .NET osnovne klase kombinuju jednostavnost korišćenja Visual Basic i Java biblioteka sa relativno potpunom pokrivenošću Windows API skupa funkcija. Mnogim Windows funkcijama nije moguće pristupiti kroz osnovne klase, i u tim slučajevima morat ćete pribjeći API funkcijama, ali općenito se to odnosi samo na najegzotičnije funkcije. Za svakodnevnu upotrebu, skup osnovnih klasa će općenito biti dovoljan. Ali ako trebate pozvati API funkciju, onda .NET pruža tzv mehanizam za pozivanje platforme, što garantuje ispravnu konverziju tipa podataka, tako da sada ovaj zadatak nije ništa teži od pozivanja ovih funkcija direktno iz C++ koda, bez obzira na kom jeziku je kod napisan - C#, C++ ili Visual Basic 2010.

Imenski prostori

Imenski prostori je način na koji .NET izbjegava sukobe imena između klasa. Namijenjeni su da spriječe situacije u kojima definirate klasu koja predstavlja kupca, nazovete je Customer, a zatim neko drugi učini istu stvar (ovo je prilično čest scenario).

Imenski prostor nije ništa drugo do grupa tipova podataka, ali ima efekat da se imena svih tipova podataka unutar imenskog prostora automatski stavljaju prefiksom imena imenskog prostora. Prostori imena mogu biti ugniježđeni jedan unutar drugog. Na primjer, većina osnovnih .NET klasa opće namjene nalazi se u imenskom prostoru Sistem. Osnovna klasa Niz se odnosi na ovaj prostor, pa je njegov puni naziv System.Array.

.NET platforma zahtijeva da sva imena budu deklarirana unutar imenskog prostora; na primjer, možete staviti svoj razred Moj razred u imenski prostor MyCompany. Tada će izgledati puno ime ove klase MyCompany.MyClass.

Imajte na umu da ako imenski prostor nije eksplicitno specificiran, tip će biti dodan u neimenovani globalni imenski prostor.

U većini situacija, Microsoft preporučuje korištenje najmanje dva ugniježđena prostora imena: prvi je naziv vaše kompanije, a drugi je naziv tehnologije ili softverskog paketa kojem klasa pripada, tako da izgleda otprilike ovako: MyCompany.SomeNamespace .Moj razred. U većini slučajeva, ovaj pristup će zaštititi klase vaše aplikacije od potencijalnih sukoba s imenima klasa koje su napisali programeri iz drugih kompanija.

Sljedeća tabela je kratka lista nekih (ali sigurno ne svih) imenskih prostora ponuđenih u .NET-u, koji su podijeljeni u grupe na osnovu funkcionalnosti:

.NET Framework Key Namespaces
Imenski prostor u .NET-u Opis
Sistem Unutar prostora imena Sistem sadrži mnogo korisnih tipova za rad s internim podacima, matematikom, generiranjem slučajnih brojeva, varijablama okruženja i prikupljanjem smeća, kao i niz često korištenih izuzetaka i atributa
System.Collections
System.Collections.Generic
Ovi imenski prostori sadrže brojne tipove kontejnera, kao i nekoliko osnovnih tipova i interfejsa koji vam omogućavaju da kreirate posebne kolekcije
System.Data
System.Data.Common
System.Data.EntityClient
System.Data.SqlClient
Ovi imenski prostori se koriste za interakciju s bazama podataka koristeći ADO.NET
System.IO
System.IO.Compression
System.IO.Ports
Ovi prostori sadrže mnoge tipove dizajnirane za rukovanje U/I datotekama, kompresijom podataka i manipulacijom portovima.
System.Reflection
System.Reflection.Emit
Ovi imenski prostori sadrže tipove koji podržavaju otkrivanje tipova u vremenu izvođenja, kao i kreiranje dinamičkog tipa
System.Runtime.InteropServices Ovaj imenski prostor sadrži sredstva pomoću kojih možete dozvoliti .NET tipovima interakciju sa "neupravljanim kodom" (kao što su DLL-ovi zasnovani na C-u i COM serveri) i obrnuto
System.Drawing
System.Windows.Forms
Ovi imenski prostori sadrže tipove koji se koriste za pravljenje desktop aplikacija koristeći izvorni .NET (Windows Forms) skup grafičkih alata.
System.Windows
System.Windows.Controls
System.Windows.Shapes
Prostor System.Windows je korijen među ovih nekoliko imenskih prostora, koji predstavljaju skup Windows Presentation Foundation (WPF) grafičkih alata
System.Linq
System.Xml.Linq
System.Data.DataSetExtensions
Ovi imenski prostori sadrže tipove koji se koriste kada se programira korištenjem LINQ API-ja
System.Web Ovaj imenski prostor je jedan od mnogih koji vam omogućavaju kreiranje ASP.NET web aplikacija
System.ServiceModel Ovaj imenski prostor je jedan od mnogih koje možete koristiti za kreiranje distribuiranih aplikacija koristeći Windows Communication Foundation (WCF) API.
System.Workflow.Runtime
System.Workflow.Activities
Ova dva prostora imena su glavni predstavnici mnogih imenskih prostora koji sadrže tipove koji se koriste za pravljenje aplikacija omogućenih za radni tok koristeći Windows Workflow Foundation (WWF) API.
System.Threading
System.Threading.Tasks
Ovaj imenski prostor sadrži brojne tipove za izgradnju višenitnih aplikacija koje mogu distribuirati radno opterećenje na više CPU-a.
System.Security Sigurnost je svojstvena .NET svijetu. Prostori imena vezani za sigurnost sadrže mnoge tipove koji se bave dozvolama, kriptografskom sigurnošću itd.
System.Xml Ovaj XML orijentirani imenski prostor sadrži brojne tipove koji se mogu koristiti za interakciju s XML podacima

Uloga Microsoftovog root prostora

Kada smo pregledali listu u tabeli, bilo je lako primetiti da je sistemski prostor imena koren pristojnog broja ugnežđenih imenskih prostora (kao što su System.IO, System.Data, itd.). Međutim, kako se ispostavilo, pored sistema, biblioteka baznih klasa nudi i niz drugih korijenskih imenskih prostora najvišeg nivoa, od kojih je najkorisniji Microsoft imenski prostor.

Odgovarajući na pitanje šta je korištenje namespace std, prije svega, treba napomenuti da u prijevodu s engleskog opisani izraz znači prostor imena, što je opseg deklaracije, neophodan za definiranje različitih identifikacijskih oblika: funkcije i zavisne/nezavisne varijable.

Zahvaljujući tome, nema sukoba između imena, jer postoje situacije kada nekoliko varijabli poprima iste vrijednosti. Obično se to dešava kada se kreiraju različite biblioteke.

Identifikatori su slobodno dostupni jedni u odnosu na druge. Oni dobijaju besplatan pristup nezavisnim članovima kada koriste format punog imena.

Za ovo je izuzetno važno tako da objekt sadrži puni oblik imena koristeći prostor imena std. Ovo je važno za vizuelno razumevanje kako deklaracija izgleda kada se stavi u ime prostora.

Slika prikazuje nekoliko varijacija pristupa kodiranju, koji se nalaze unutar i izvan njenih ograda:

1 Ovako to izgleda puno ime:

2 U cilju dopune postojećeg oglasa, dodati koristeći:

3 Da dodate sve postojeće ID-ove, koristite odgovarajuću direktivu:

Korištenje direktive

Direktiva using dozvoljava eksploataciju svih dostupnih imena koja su uključena u imenski prostor.

Nije potrebno specificirati kvalifikator.

Morate koristiti korištenje u cpp formatu datoteke. Međutim, važan uslov je prisustvo nekoliko identifikatora.

U slučaju kada postoji samo nekoliko imena, kreiranje običnog imena bit će relevantno.

Tada možete dodati samo potrebne identifikatore, a ostale ostaviti na miru.

Važno je napomenuti da ako se naziv lokalne varijable i glavna poklapaju, tada će u ovom slučaju prva biti u skrivenom pristupu.

Imajte na umu da je kreiranje varijabli sa istim imenom nezakonito.

Savjet! Za jednostavnu upotrebu, using direktiva se može nalaziti na vrhu datoteke formata cpp., ili obrnuto, unutar kreirane biblioteke.

Da biste sebi osigurali najudobnije radne uvjete, možete raditi na postavljanju potrebnih datoteka.

Osim ako je apsolutno neophodno, direktiva o korištenju ne bi trebala biti postavljena u zaglavljima u datoteci H formata.

To je zbog činjenice da će ovom akcijom svi identifikatori postati aktivni u polju vidljivosti, povećavajući vjerovatnoću sukoba nekih imena.

Za datoteke, najbolje rješenje je korištenje punog imena.

U slučaju da se ispostavi da su predugačke, možete koristiti skraćenice u obliku aliasa.

Deklaracije prostora imena

Uobičajeno je da se oglasi postavljaju u obliku naziva datoteka. U slučaju kada se izvršavanje navedenih funkcija nalazi u zasebnoj biblioteci ili datoteci, važno je odrediti puno ime.

Da bismo razumjeli o kojim akcijama govorimo, vrijedi pogledajte sljedeću sliku:

Za implementaciju funkcije cpp.formata contosodata, također je važno koristiti puno ime u slučaju kada je direktiva na samom početku:

Korištenje imenskog prostora std. može sadržavati oglase u nekoliko odjeljaka odjednom koji se nalaze u istoj datoteci.

Zahvaljujući kompajleru, svi elementi se kombinuju dok se podaci obrađuju.

Tako se, na primjer, std., po pravilu, deklarira u svim zaglavljima dostupnih datoteka koje se nalaze u dostupnim bibliotekama standardnog tipa.

Članovi označeni potpuno kvalificiranim imenom mogu se definirati ne samo unutar prostora imena, već i izvan njega ako imaju eksplicitnu kvalifikaciju.

Što se definicije tiče, ona mora doći iza deklaracije u imenskom prostoru u kojem je kreirana.

Kao vizuelni primjer, obratite pažnju na sljedeću sliku:

Najčešće se ova greška pojavljuje kada je narušen redoslijed definicije ili su sastavni dijelovi punog imena odmah uključeni u dostupne objekte.

Kada kolačići nisu deklarisani u određenom imenskom prostoru, formalno pripada prostoru globalnog tipa.

Savjet! Osim ako je apsolutno neophodno, preporučuje se izbjegavanje uključivanja članova u globalni prostor tipa.

Značajan izuzetak od pravila može biti samo glavna opcija, što podrazumijeva obavezno uključivanje u ogroman prostor.

Da biste kreirali globalni identifikator tipa, morate koristiti odgovarajuću funkcionalnost vidljivosti, u obliku punog imena.

Ova akcija će pomoći u stvaranju prepoznatljivog svojstva jednog identifikatora od drugih postojećih koji se nalaze u drugom imenskom prostoru.

Ovo će vam pomoći da shvatite kod.

Space std.

Vrijedi napomenuti da prostori mogu biti ugniježđenog tipa.

Ako se misli na obično ugrađivanje, onda ono ima neograničen karakter na čitav prostor.

Kad smo kod matičnih članova, oni nemaju takvu funkciju.

Za proširenje su potrebni ugrađeni priključci.

Za precizniju definiciju i razumijevanje, obratite pažnju na sljedeću sliku:

Enkapsulirajući informacije za dalju implementaciju, on također može biti dio običnog ugniježđenog prostora i djelovati kao interfejs otvorenog tipa u nadređenom prostoru.

Poređenja su obični prilozi standardnog tipa, ugrađeni članovi roditeljskog prostora imena.

Kao rezultat, možete koristiti pretragu funkcija koje imaju neku vrstu preopterećenja, gdje će postojati ovisnost argumenata.

Da vidite primjer kako se radi vezivanje, Vrijedi se osvrnuti na sljedeći primjer:

Sljedeća slika prikazuje proces specijalizacije u predlošku matičnog prostora, koji je deklarisan u privremenom prostoru ugrađenog tipa:

Iskorištavanjem ugrađenih prostora moguće je upravljati različitim verzijama sučelja u standardnim bibliotekama.

Moguće je kreirati jedan, jednoroditeljski prostor i inkapsulirati svaki predstavljeni interfejs.

Međutim, mora biti u formatu priloga u zajedničkom nadređenom prostoru.

Tada se šifra klijenta automatski dodjeljuje novoj kombinaciji.

Korisnici koji su navikli koristiti staru verziju mogu je nastaviti koristiti bez ikakvih problema.

Da biste to učinili, morate kreirati punu putanju do priloga.

Da biste organizirali prvu najavu, morate koristiti ugrađeni ključ.

Pogledajmo sljedeći primjer dvije opcije sučelja, gdje svaka ima prostora. Klijentski kod takođe ima mogućnost da iskoristi nove biblioteke.

Za vizualizaciju procesa Pređimo na sljedeću sliku:

Sva imena moraju biti izuzetno jedinstvena, stoga se njihova dužina značajno povećava.

Međutim, ovdje nije moguće koristiti direktivu korištenja.

Moguće je samo kreirati alias za imenski prostor.

U ovom slučaju, razmotrite sljedeći primjer:

Takođe je moguće kreirati običan prostor, ali mu se ne dodeljuje pseudonim.

Takav teritorijalni spektar naziva se anonimnim.

Po pravilu se koristi u situacijama kada članovi u deklaraciji moraju biti nevidljivi za kodiranje u drugim objektima.

Čitava struktura, kada se svi identifikatori mogu vidjeti, međutim, izvan kreiranog prostora, oni će ostati nevidljivi.

Vrijedi napomenuti, da će i sam prostor imena biti nevidljiv izvan bloka, tako da svaki korisnik treba unaprijed uzeti u obzir ovaj detalj.

Obično je upotreba znanja potrebna za one koji rade u Visual C++.

Koristeći visokokvalitetne primjere, bit će mnogo lakše razumjeti ovu temu.

Recimo da želimo podijeliti našu klasu Array, razvijenu u prethodnim primjerima. Međutim, nismo bili sami u rješavanju ovog problema; Možda je neko negde, recimo, u jednoj od divizija Intela, stvorio klasu istog imena. Budući da su nazivi ovih klasa isti, potencijalni korisnici ne mogu koristiti obje klase u isto vrijeme, već moraju odabrati jednu od njih. Ovaj problem se rješava dodavanjem u ime klase nekog niza koji identifikuje njene programere, recimo,

Klasa Cplusplus_Primer_Third_Edition_Array ( ... );

Naravno, ni to ne garantuje jedinstvenost imena, ali će najvjerovatnije spasiti korisnika od ovog problema. Međutim, kako je nezgodno koristiti tako dugačka imena!
C++ standard nudi mehanizam za rješavanje problema podudaranja imena tzv imenskog prostora. Svaki proizvođač softvera može umotati svoje klase, funkcije i druge objekte u svoj vlastiti prostor imena. Na primjer, ovako izgleda deklaracija naše klase Array:

Prostor imena Cplusplus_Primer_3E ( predložak klasa Niz(...); )

Ključna riječ namespace specificira imenski prostor koji definira vidljivost naše klase, u ovom slučaju nazvan Cplusplus_Primer_3E. Recimo da imamo klase drugih programera smještene u različitim imenskim prostorima:

Prostor imena IBM_Canada_Laboratory ( predložak klasa Niz(...);
klasa matrica(...);
}
imenski prostor Disney_Feature_Animation (
klasa Point(...);
šablon klasa Niz(...);
}

Po defaultu, objekti deklarirani bez eksplicitnog imenskog prostora su vidljivi u programu; oni pripadaju globalno imenskog prostora. Da biste upućivali na objekt iz drugog prostora, morate koristiti njegovo kvalificirano ime, koje se sastoji od identifikatora prostora imena i identifikatora objekta, odvojenih operatorom rezolucije opsega (::). Evo kako izgledaju pozivi na objekte u gornjim primjerima:

Cplusplus_Primer_3E::Niz tekst; IBM_Canada_Laboratory::Matrix mat; Disney_Feature_Animation::Point origin(5000,5000);

Za jednostavnu upotrebu, možete dodijeliti pseudonime imenskim prostorima. Nadimak je odabran tako da bude kratak i lak za pamćenje. Na primjer:

// aliases namespace LIB = IBM_Canada_Laboratory; imenski prostor DFA = Disney_Feature_Animation;
int main()
{
LIB::Niz ia(1024);
}

Aliasi se također koriste za skrivanje upotrebe imenskih prostora. Zamjenom aliasa možemo promijeniti skup uključenih funkcija i klasa, au svim ostalim aspektima programski kod će ostati isti. Ispravkom samo jedne linije u primjeru iznad, dobijamo definiciju potpuno drugačijeg niza:

Prostor imena LIB = Cplusplus_Primer_3E; int main() ( LIB::Niz ia(1024); )

Naravno, da bi to bilo moguće, mora postojati tačna podudarnost između sučelja klasa i funkcija deklariranih u ovim imenskim prostorima. Zamislimo da klasa Array iz Disney_Feature_Animation nema konstruktor sa jednim parametrom - veličinom. Tada će sljedeći kod pustiti grešku:

Prostor imena LIB = Disney_Feature_Animation;
int main()
{
LIB::Niz ia(1024);
}

Još pogodniji način je korištenje jednostavnog, nekvalifikovanog imena za upućivanje na objekte definirane u nekom imenskom prostoru. Za ovo postoji upotreba direktive:
#include "IBM_Canada_Laboratory.h"

Korištenje prostora imena IBM_Canada_Laboratory;
int main()
{
Matrica mat(4,4);
// IBM_Canada_Laboratory::Niz
Niz ia(1024);
// ...
}

Imenski prostor IBM_Canada_Laboratory postaje vidljiv u programu. Možete učiniti vidljivim ne cijeli prostor, već pojedinačna imena unutar njega (selektivno korištenjem direktive):

#include "IBM_Canada_Laboratory.h" koristeći prostor imena IBM_Canada_Laboratory::Matrix;
// samo Matrix postaje vidljiv
int main()
{
// IBM_Canada_Laboratory::Matrix
Matrica mat(4,4); // Greška: IBM_Canada_Laboratory::Niz je nevidljiv
Niz ia(1024);
// ... }

Kao što smo već spomenuli, sve komponente C++ standardne biblioteke su deklarisane unutar std imenskog prostora. Stoga, jednostavno uključivanje datoteke zaglavlja nije dovoljno za direktno korištenje standardnih funkcija i klasa:

#include // greška: string je nevidljiv

Morate koristiti direktivu using:

#include korištenje imenskog prostora std; // Ok: vidi string
string current_chapter = "C++ pregled";

Imajte na umu, međutim, da se na ovaj način vraćamo na problem “začepljenja” globalnog imenskog prostora, za rješavanje kojeg je kreiran mehanizam imenovanih prostora. Stoga je bolje koristiti bilo kvalifikovano ime:

#include // ispravno: kvalificirano ime std::string current_chapter = "Pregled C++"; ili selektivnu direktivu koristeći: #include koristeći prostor imena std::string; // Ok: string vidljiv
string current_chapter = "C++ pregled";

Preporučujemo korištenje posljednje metode.
U većini primjera u ovoj knjizi, direktive o imenskom prostoru su izostavljene. Ovo je učinjeno kako bi se smanjila veličina koda, kao i zato što je većina primjera kompajlirana pomoću kompajlera koji ne podržava prostore imena - dovoljna je nedavna inovacija u C++. (Detalji upotrebe deklaracija upotrebe pri radu sa standardnom bibliotekom C++ razmatraju se u odeljku 8.6.)
U narednim poglavljima kreiraćemo još četiri klase: String, Stack, List i modifikaciju Stack. Svi oni će biti zatvoreni u jednom imenskom prostoru - Cplusplus_Primer_3E. (O radu sa imenskim prostorima detaljnije raspravljamo u 8. poglavlju.)

Vježba 2.21

Imenski prostor je dat

Vježba za prostor imena ( predložak klasa Niz(...);
šablon
void print (Niz< EType >);
klasa String ( ... )
šablon
lista klasa(...);
}

i tekst programa:

Int main() ( const int size = 1024; Niz kao (veličina); Lista il(veličina);
// ...
Niz *pas = novi niz (as);
Lista *pil = nova lista (il);
print(*pas);
}

Program se ne kompajlira jer su deklaracije korištenih klasa zatvorene u imenskom prostoru vježbe. Izmijenite programski kod pomoću
(a) kvalifikovana imena
(b) selektivno korištenje direktive
(c) mehanizam alijasa
(d) korištenje direktive

Napomena: Ovaj odjeljak opisuje korištenje i deklaraciju imenskih prostora. Date su glavne karakteristike RDF-a, XML-podataka, opisa sadržaja dokumenta (DCD), šeme za objektno orijentisani XML (SOX), jezika za označavanje definicije dokumenta (DDML, ranije poznat kao XSchema).

Prethodno smo opisali neke od nedostataka DTD definicija, oni su povezani:

  1. sintaksa ovih definicija razlikuje se od sintakse XML-a (konkretno, tzv. proširena Backus-Naur forma, Prošireni Backus Naur Form);
  2. ove definicije nisu dovoljno izražajne;
  3. Budući da svaki korisnik može kreirati vlastite oznake, vrlo je vjerovatno da će ljudi koristiti ista imena elemenata za upućivanje na različite stvari. Čak i ako su značenja elemenata ista, njihov mogući sadržaj može varirati ovisno o definiciji. Dakle, potreban nam je način da definiramo specifične upotrebe elementa, posebno ako miješamo različite vrste rječnika u istom dokumentu. Kako bi riješio problem, W3C je objavio specifikaciju pod nazivom XML Namespaces, koja vam omogućava da definirate kontekst elementa u imenskom prostoru.
  4. Postoje situacije u kojima je potrebno kombinovati XML dokumente iz različitih izvora koji odgovaraju različitim DTD definicijama. Na primjer, ova situacija nastaje kada se opisuje velika količina informacija, ako pojedinačni DTD-ovi nisu dovoljni da pokriju cijeli volumen ili ih je teško razumjeti. Takođe se dešava u sistemima e-trgovine kada pokušavate da kombinujete podatke vašeg poslovnog partnera sa vašim. Može se pojaviti i situacija kada jednostavno trebate dodati svoje postavke postojećem DTD-u kako biste razmijenili neke informacije u standardnom formatu. Nažalost, XML preporuka ne pruža način kombinovanja više DTD-ova u jednom dokumentu bez njihovog modifikovanja ili kreiranja novog DTD-a (koristeći eksterne reference).

Ovo poglavlje pokriva sljedeća dva koncepta - imenskog prostora i XML šeme. Prostori imena omogućavaju XML programerima da razbiju složeni problem na male komade i kombinuju više rečnika u jednom dokumentu kako bi ga u potpunosti opisali. Koristeći šeme, dizajneri rječnika kreiraju preciznije definicije nego što je to bilo moguće u DTD-ovima, i to koristeći XML sintaksu.

Ova dva alata pomažu u rješavanju složenih problema koji se javljaju prilikom korištenja XML-a. Prostori imena i šeme omogućavaju XML dizajnerima i programerima da:

  • Bolje organizirati vokabulare za rješavanje složenih problema;
  • Zadržati jako kucanje podaci tokom transformacije u i iz XML-a;
  • Opišite vokabulare preciznije i fleksibilnije nego što je to bilo moguće sa DTD;
  • Čitajte pravila rječnika u XML-u, pristupajući njegovim definicijama bez kompliciranja parsera.

Miješanje rječnika

Prilikom dizajniranja rječnika, možda ima smisla razbiti globalni problem na nekoliko sastavnih dijelova. Ovo zahtijeva načine da se veliki problem segmentira u više rječnika. Međutim, pravi problem koji treba riješiti je spajanje zasebnih DTD-ova unutar tijela jednog dokumenta. Ovaj problem može nastati i ako, na primjer, radite za korporaciju u kojoj najvjerovatnije već postoji set DTD definicija i njihovo korištenje može uvelike olakšati posao, jer opisuju problem onako kako ga drugi razumiju. Često je takođe korisno ponovo koristiti DTD definicije, tj. Korištenje uobičajenih konstrukcija iz prethodno kreiranih DTD definicija. Ako razvijate aplikaciju koja treba da komunicira sa softverom eksternog partnera, nemate malo izbora osim da ponovo koristite postojeće koncepte. Postojeće definicije DTD-a predstavljaju zajednički jezik koji se mora govoriti da bi se razumio. Ako koncept već postoji, mora se raditi na tome da bude shvaćen u smislu tog koncepta.

Kada koristite definicije koje su vam korisne iz DTD-ova drugih programera, ili kada kombinujete segmentirane DTD-ove da kreirate dokument koji opisuje složen problem, ako vaši dokumenti koriste elemente s istim imenima, rizikujete da naiđete na probleme dvosmislenost i kolizije imena.

Problem se dodatno pogoršava kada se koriste instance imena iz više DTD-ova. U ovom slučaju, ne znamo na koji element, na koji se DTD definicija odnosi, ovaj problem dobro oblikovanih dokumenata naziva se dvosmislenost. Štaviše, ako to zahtijevaju imena iz dokumenta provere valjanosti, našu aplikaciju možemo učiniti vrlo zbunjujućom. Ovaj problem se naziva kolizija imena.

Imenski prostori

Imenski prostori mogu pomoći korisniku na dva vrlo važna načina. Uz njihovu pomoć možete:

  • kombinovati dokumente iz dva ili više izvora bez gubljenja povjerenja da će program razlikovati iz kojeg izvora je uzet element ili atribut;
  • Ako je moguće, dozvolite korisničkom agentu pristup daljem materijalu, kao što je definicija tipa dokumenta (DTD) ili drugi opis elemenata i atributa.

Imenski prostor je zbirka određenih vrijednosti ili karakteristika koje se mogu koristiti u XML dokumentima kao imena elemenata ili atributa. Prostori imena u XML-u su definirani Uniform Resource Identifier (URI) (možete koristiti DTD adresu na vašem serveru kao URI). Omogućava da svaki prostor imena bude jedinstven.

Dakle, da bismo efikasno koristili prostore imena u dokumentu koji kombinuje elemente iz različitih izvora, moramo definisati:

  • Referenca na URI koji opisuje upotrebu elementa.
  • Alias ​​koji nam omogućava da razumijemo iz kog imenskog prostora dolazi naš element. Ovaj pseudonim je u obliku prefiksa elementa (na primjer, ako je pseudonim za opskurni element knjige catalog , tada će se element nazvati ).

Korištenje i deklariranje prostora imena

Deklaracija prostora imena

Budući da se u različitim jezicima za označavanje - XML ​​implementacijama - mogu naći ista imena oznaka i njihovih atributa, koji imaju potpuno različita značenja, potrebno je biti u stanju nekako ih razlikovati. Da biste to učinili, nazivima oznaka i atributa se daje kratki prefiks, koji je odvojen od naziva dvotočkom. Prefiks imena je povezan sa identifikatorom koji definira prostor imena. Svi nazivi oznaka i atributa čiji su prefiksi povezani sa istim identifikatorom čine jedan prostor imena, u kojem imena moraju biti jedinstvena.

Pošto želimo da svi mogu prepoznati deklaraciju prostora imena kada je vidimo, rezervirali smo posebnu riječ za nju. Prema preporuci imenskih prostora, riječ je xmlns. Vrijednost atributa je URI koji specificira imenski prostor za korištenje. Ovo je često URL definicije DTD, ali ne mora uvijek biti tako. Prefiks i identifikator prostora imena definirani su atributom xmlns na sljedeći način:

Kao što vidite, ntb prefiks je upravo definisan, ali se već može koristiti u nazivu ntb: notebook . U budućnosti, imena oznaka i atributa koje želimo dodijeliti imenskom prostoru http://some.firm.com/2003/ntbml imaju prefiks ntb, na primjer:

Gorelovo

Osim toga, nekoliko imenskih prostora može se pojaviti u jednoj oznaci. Ispod je primjer miješanja više imenskih prostora:

Element knjige dolazi iz imenskog prostora kataloga, a ISBN atribut dolazi iz reda.

Na primjer, ime zajedno s prefiksom

naziva proširenim, kvalifikovanim ili kvalifikovanim imenom (OName. Qualified Name). Dio imena napisan iza dvotočka naziva se lokalni dio imena.

Nomenklatura naziva Web resursa može biti zbunjujuća. Uniformni lokator resursa ( Uniform Resource Locator, URL) označava resurs u smislu pristupnog protokola i mrežne lokacije. Jedinstveni identifikator resursa ( Jedinstveni identifikator resursa, URI) je jedinstveno ime za neki resurs. Gledajte na URI jednostavno kao na jedinstveni niz znakova koji identificira prostor imena.

Prema pravilima SGML-a i XML-a, dvotočka se može koristiti u imenima kao običan znak, tako da je ime sa prefiksom samo trik; svaki program koji ne "zna" imenski prostor, analizira dokument, tretira kvalifikovano ime kao obično ime. Iz toga proizilazi, posebno, da u deklaracija o vrsti dokumenta(Deklaracija tipa dokumenta) prefiksi naziva se ne mogu izostaviti.

Atribut xmlns se može pojaviti na bilo kojem XML elementu, a ne samo na korijenskom elementu. Prefiks koji on definira može se koristiti u elementu u kojem je napisan atribut xmlns iu svim elementima koji su ugniježđeni u njemu. Štaviše, više imenskih prostora može se definirati u jednom elementu.

U ugniježđenim elementima, imenski prostor se može nadjačati povezivanjem prefiksa s drugim identifikatorom.

Pojava imena oznake bez prefiksa u dokumentu koji koristi imenski prostor znači da ime pripada zadanom imenskom prostoru.

Dobro dizajniran dokument treba da koristi prostore imena za sve svoje elemente.

Prefiksi koji počinju sa xml znakovima u svakom slučaju su rezervirani za sam XML jezik. Prefiks xmlns se koristi za povezivanje drugog, definisanog, prefiksa sa njegovim identifikatorom prostora imena. Prefiks xmlns ne mora biti definiran, on je uveden preporukom "Prostori imena u XML-u" i tamo je povezan s identifikatorom prostora imena http://www.w3.ori/2000 /xmlns/.

Drugi prefiks, xml, povezan je u istoj preporuci sa identifikatorom http://www.w3.org/XML/1998/namespace. Također ne mora biti definiran u XML dokumentu. Nijedan drugi prefiks se ne može povezati sa ovim identifikatorima. Ovo je važno za neke tekstove, kao što su programski kodovi. Zadana vrijednost ostavlja razmak prema diskreciji rukovaoca.

Obim

Deklaracije prostora imena imaju opseg, baš kao i deklaracije varijabli u programskim jezicima. Ovo je važno jer prostori imena nisu uvijek deklarirani na početku XML dokumenta; ponekad se deklariraju u sljedećim odjeljcima. Deklaracija prostora imena primjenjuje se na element u kojem se pojavljuje, kao i na potomke tog elementa, čak i ako tamo nije eksplicitno definiran. Ime se može odnositi na imenski prostor samo ako se koristi unutar opsega njegove deklaracije.

Međutim, također ćemo morati miješati opsege imenskog prostora na elementima koji bi inače naslijedili druge prostore imena. U tom smislu, definisana su dva načina deklarisanja opsega: podrazumevani i kvalifikovani.

Zadani opseg

Kao što možete očekivati, potreba za prefiksom svakog imena u dokumentu brzo postaje zamorna. U stvari, uvođenjem koncepta opsega imena, možemo pomiješati veliki broj prefiksa u našem dokumentu. Ako definiramo zadani prostor imena, pretpostavlja se da posjeduje sva nekvalifikovana imena unutar opsega njegove deklaracije. Dakle, podrazumevani imenski prostor deklarisan u osnovnom elementu smatra se podrazumevanim za ceo dokument i može se nadjačati samo specifičnijim imenskim prostorom deklarisanim unutar dokumenta.

Da bi imenski prostor bio zadani prostor imena za opseg, jednostavno izostavite deklaraciju prefiksa.

Ako se prefiks deklarira i zatim koristi zajedno s imenom, kaže se da je prostor imena eksplicitno uspostavljen. Da biste dodijelili nekvalifikovano ime imenskom prostoru, morate deklarirati zadani prostor koji uključuje nekvalifikovano ime (bez prefiksa).

Kvalificirani opseg

Gornja metoda dobro funkcionira ako možete jasno odvojiti svoje imenske prostore. Ali ponekad je potrebno uključiti pojedinačna imena iz vanjskih imenskih prostora u dokument. Umjesto deklariranja imenskih prostora za cijeli opseg, možete koristiti kvalificirana imena. Deklarisajte prostore imena koji su vam potrebni na početku dokumenta, a zatim ih kvalifikujte na mestu upotrebe.

će pomoći.
Put do podrške imenskog prostora u PHP-u je bio težak. Ali, srećom, dodat je jeziku u PHP 5.3, a struktura PHP koda je od tada značajno poboljšana. Ali kako ih tačno koristiti?

Šta su imenski prostori?

"Ne zaboravite obrnutu kosu crtu kada pohranjujete ime prostora kao string!"

Zamislite prostor imena kao kutiju u koju možete staviti bilo šta: olovku, lenjir, komad papira i tako dalje. Ovo su tvoje stvari. Odmah ispod vaše kutije nalazi se tuđa kutija, a njen vlasnik drži iste stvari u njoj. Da ne biste koristili jedni druge stvari, odlučite da označite kutije tako da bude jasno šta kome pripada.

Ranije su programeri morali koristiti prefikse podvlaka u svojim klasama, funkcijama i konstantama da odvoje kod. To je jednako da svako označi svoje stvari i pohrani ih u jednu veliku kutiju. Naravno, ovo je barem neka vrsta organizacije, ali je vrlo neefikasna.

Imenski prostori, pomoć! Možete deklarisati istu funkciju, klasu, interfejs i definisati konstantu u odvojenim prostorima imena bez dobijanja fatalnih grešaka. U svojoj srži, prostori imena nisu ništa drugo do hijerarhijski označeni blokovi koda koji sadrže regularni PHP kod.

Koristite ih!

Važno je razumjeti da koristite prostore imena indirektno; Od PHP 5.3, sve definicije koje nisu već deklarisane u korisnički definisanim imenskim prostorima potpadaju pod globalni prostor imena.

Globalni prostor imena takođe čuva sve PHP interne definicije, kao što je mysqli_connect() i klasa Exception. Budući da globalni imenski prostor nema jedinstveno identifikacijsko ime, najčešće se naziva globalnim prostorom imena.

Imajte na umu da korištenje imenskog prostora nije obavezno.
Vaša PHP skripta će dobro raditi i bez njih, a ovo ponašanje se neće promijeniti uskoro.

Definicija prostora imena

Datoteka koja sadrži imenski prostor mora sadržavati njegovu deklaraciju na početku prije bilo kojeg drugog koda. Jedina stvar koja se može deklarirati prije imenskog prostora je rezervirana riječ declare , izraz declare se može pojaviti prije deklaracije imenskog prostora kako bi ukazao na kodiranje datoteke.

Imenski prostori se deklariraju korištenjem rezervirane riječi imenski prostor. Prostori imena prate ista pravila kao i drugi identifikatori u PHP-u. Dakle, imenski prostor bi trebao počinje slovom ili donjom crtom nakon čega slijedi bilo koji broj slova, brojeva ili donjih crta.

Ako želite da definirate blok koda u globalnom prostoru, možete koristiti ključnu riječ namespace bez dodavanja imena.

Možete koristiti više imenskih prostora u jednoj datoteci.

Također možete koristiti isti prostor imena za nekoliko različitih datoteka; proces povezivanja datoteka će ih automatski spojiti. Dobra je praksa kodiranja ograničiti broj definicija prostora imena na jednu datoteku, baš kao što možete učiniti s klasama.

Prostori imena se koriste kako bi se izbjegle nedosljedne definicije i uvele više fleksibilnosti i organizacije u programski kod.

Imajte na umu da su vitičaste zagrade potpuno opcione. U stvari, korištenje jednog prostora imena po pravilu datoteke i izostavljanje vitičastih zagrada čini vaš kod mnogo čistijim - nema potrebe za uvlačenjem ugniježđenog koda.

Podimenski prostori

Prostori imena mogu pratiti određenu hijerarhiju, baš kao direktoriji u sistemu datoteka na računaru. Podprostori su izuzetno korisni za organizovanje strukture projekta. Na primjer, ako vaš projekt zahtijeva pristup bazi podataka, možete postaviti rukovatelj izuzetkom baze podataka i kod rukovatelja vezom u podprostor imena baze podataka.

Radi fleksibilnosti, mudro je pohraniti ugniježđene prostore imena u poddirektorijume. Ovo pomaže u strukturiranju projekta i čini ga mnogo lakšim za korištenje za autoloadere koji prate PSR-4 standard.

PHP koristi obrnutu kosu crtu kao separator prostora imena.

Zanimljiva činjenica: u RFC-u, kako bi se odlučilo koji separator prostora imena koristiti, razmatrana je opcija korištenja emotikona.

// myproject/database/connection.phpMožete koristiti onoliko ugniježđenih imenskih prostora koliko želite.

Definiranje podimenskog prostora s ugniježđenim blokovima koda nije podržano. Sljedeći primjer će vratiti fatalnu grešku: "Deklaracije prostora imena ne mogu biti ugniježđene."

Pozivni kod iz imenskog prostora

Ako želite kreirati novu instancu objekta, pozvati funkciju ili koristiti konstante iz različitih imenskih prostora, koristite obrnutu kosu crtu. Postoje tri tipa definicija imena imenskog prostora:
  • Nekvalifikovano ime
  • Kvalifikovano ime
  • Potpuno kvalifikovano ime

Nepotpuno ime

Ovo je ime klase, funkcije ili konstante i ne uključuje referencu na bilo koji prostor imena. Za one koji tek počinju da rade sa imenskim prostorima, ovo je uobičajeno gledište.

Puno ime

Ovako pristupamo hijerarhiji podimenskog prostora; odvojeno obrnutom kosom crtom.

Primjer u nastavku će vratiti fatalnu grešku: "Fatalna greška: Klasa "MyProject\Database\MyProject\FileAccess\Input" nije pronađena" jer MyProject\FileAccess\Input nije relevantan za imenski prostor u kojem se nalazite.

Apsolutno ime

Puna i djelomična imena se koriste u odnosu na imenski prostor u kojem se trenutno nalazite. Mogu se koristiti samo za definiranje pristupa na tom nivou ili za dublje uronjenje u hijerarhiju prostora imena.

Ako želite pristupiti funkciji, klasi ili konstanti koja je na višem nivou hijerarhije, onda morate koristiti puno ime - apsolutnu putanju, a ne relativnu. Poziv mora početi sa obrnutom kosom crtom. Ovo daje do znanja PHP-u da ovaj poziv treba biti upućen iz globalnog prostora, umjesto da mu pristupa u odnosu na vašu trenutnu lokaciju.

Ne moramo koristiti puno ime za PHP interne funkcije. Nekvalificirana imena za funkcije i konstante bit će definirana u globalnom imenskom prostoru ako nisu definirana u trenutnom imenskom prostoru.

Znajući ovo, sada možemo preopteretiti interne PHP funkcije dok i dalje možemo pozvati originalnu funkciju (ili konstantu).

"; }

Dinamički pozivi

PHP je dinamički programski jezik; tako da možete koristiti ovu funkcionalnost za pozivanje koda iz imenskog prostora. Ovo je u suštini isto kao i korištenje dinamičkog imena klase ili povezivanje dinamičke datoteke pomoću varijable za pohranjivanje njenog imena. PHP separator imena koristi iste metakaraktere u stringovima. Ne zaboravite na obrnutu kosu crtu kada pohranjujete ime prostora kao string!

imenskog prostora ključna riječ

Ključna riječ namespace se ne koristi samo za definiranje imenskog prostora, već se može koristiti i za pozivanje trenutnog imenskog prostora, funkcionalno slično ključnoj riječi self za klase.

__NAMESPACE__ konstanta

Baš kao što se ključna riječ self ne može koristiti za definiranje imena trenutne klase, ključna riječ namespace se ne može koristiti za trenutni imenski prostor. Stoga koristimo konstantu __NAMESPACE__

Ova konstanta je vrlo korisna kada počinjete učiti imenski prostor; takođe je veoma koristan za otklanjanje grešaka. Budući da je to string, može se koristiti zajedno sa pozivima dinamičkog koda o kojima smo gore govorili.

Uvezite ili kreirajte pseudonim imena

nije potrebno koristiti u imenskim prostorima

Važna karakteristika imenskih prostora u PHP-u je mogućnost upućivanja na eksterno apsolutno ime pseudonim, ili uvoz.

Uvozi su vrlo koristan i temeljni aspekt imenskih prostora. Ovo vam daje mogućnost da koristite eksterne pakete, kao što su biblioteke, bez brige o sukobima imena. Uvoz se vrši pomoću ključne riječi use. Ako želite, možete odrediti prilagođeni alias koristeći ključnu riječ as.

Koristite kao

Kako ga koristiti

Apsolutno ime se može povezati sa kraćim nekvalifikovanim imenom, tako da ne morate pisati njegovo apsolutno ime svaki put kada ga želite koristiti. Kreiranje ili uvoz pseudonima mora se dogoditi u nadređenom ili globalnom prostoru. Pokušaj da se ovo uradi unutar metode ili funkcije je nevažeća sintaksa.

Alternativa je dodijeliti pseudonim s drugim imenom

Također možete uvesti globalne klase kao što je Exception. Prilikom uvoza, ne morate napisati njegov apsolutni naziv.

Imajte na umu da za imena u imenskom prostoru nije neophodna početna obrnuta kosa crta i njeno prisustvo se ne preporučuje, budući da uvezena imena moraju biti apsolutna i ne raščlanjuju se u odnosu na trenutni imenski prostor.

Iako postoji podrška za dinamičko pozivanje prostora imena, dinamički uvoz nije podržan.

Zaključak

Prostori imena se koriste kako bi se izbjegao konflikt definicija i uvela veća fleksibilnost i organizacija u programski kod. Zapamtite da se od vas ne traži da koristite prostore imena; Ova karakteristika se koristi u kombinaciji sa objektno orijentisanim pristupom. Nadam se da ćete razmotriti podizanje vašeg (budućeg) PHP projekta na viši nivo korišćenjem prostora imena.