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

Klase i imenski prostori

.NET Framework klase

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

Klase jezgre .NET pružaju ogromnu kolekciju klasa upravljanog koda koje vam omogućuju da riješite gotovo svaki problem koji se prije mogao riješiti pomoću Windows API-ja. Sve ove klase slijede isti IL objektni model s jednim nasljeđivanjem. To znači da možete kreirati objekte iz bilo koje od .NET osnovnih klasa ili naslijediti vlastite klase od njih.

Ono što osnovne klase .NET čini drugačijima je to što su dizajnirane da budu intuitivne i jednostavne za korištenje. Na primjer, da biste pokrenuli nit morate pozvati Start() metodu klase Nit. Da objekt TextBox učinite 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 C++ programerima koji su proveli godine boreći se s API funkcijama kao što su GetDIBits(), RegisterWndClassEx() i IsEqualIID(), kao kao i mnoge funkcije koje su zahtijevale prolazne ručice prozora.

Međutim, C++ programeri uvijek su imali jednostavan pristup punom skupu Windows API-ja, dok su Visual Basic 6 i Java programeri bili ograničeni na osnovne funkcije operativnog sustava kojima pristupaju iz svojih jezika. .NET osnovne klase kombiniraju jednostavnost korištenja Visual Basica i Java biblioteka s relativno potpunom pokrivenošću Windows API skupa značajki. Mnogim Windows značajkama nije moguće pristupiti kroz osnovne klase, i u tim ćete slučajevima morati pribjeći API funkcijama, ali općenito se to odnosi samo na najegzotičnije funkcije. Za svakodnevnu upotrebu općenito će biti dovoljan skup osnovnih klasa. Ali ako trebate pozvati API funkciju, tada .NET pruža tzv mehanizam za pozivanje platforme, što jamči ispravnu konverziju tipa podataka, tako da sada ovaj zadatak nije ništa teži od pozivanja ovih funkcija izravno iz C++ koda, bez obzira na kojem je jeziku kod napisan - C#, C++ ili Visual Basic 2010.

Imenski prostori

Imenski prostori je način na koji .NET izbjegava sukobe naziva između klasa. Namijenjeni su za sprječavanje situacija u kojima definirate klasu koja predstavlja kupca, nazovete je Kupac, a zatim netko drugi učini istu stvar (ovo je prilično čest scenarij).

Prostor imena nije ništa više od skupine tipova podataka, ali ima učinak da imena svih tipova podataka unutar prostora imena automatski imaju prefiks s imenom prostora imena. Prostori imena mogu biti ugniježđeni jedan u drugi. Na primjer, većina .NET osnovnih klasa opće namjene nalazi se u prostoru imena Sustav. Osnovna klasa Niz odnosi se na ovaj prostor pa mu je i puni naziv System.Array.

.NET platforma zahtijeva da sva imena budu deklarirana unutar imenskog prostora; na primjer možete staviti svoju klasu Moj razred u imenski prostor Moja tvrtka. Tada će izgledati puni naziv ove klase MyCompany.MyClass.

Imajte na umu da ako imenski prostor nije eksplicitno naveden, tip će biti dodan neimenovanom globalnom imenskom prostoru.

U većini situacija Microsoft preporučuje korištenje najmanje dva ugniježđena prostora imena: prvi je naziv vaše tvrtke, 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 će pristup zaštititi klase vaše aplikacije od mogućih sukoba s nazivima klasa koje su napisali programeri iz drugih tvrtki.

Sljedeća tablica kratak je popis nekih (ali sigurno ne svih) imenskih prostora ponuđenih u .NET-u, koji su podijeljeni u grupe na temelju funkcionalnosti:

.NET Framework Key Namespaces
Imenski prostor u .NET-u Opis
Sustav Unutar imenskog prostora Sustav sadrži mnogo korisnih tipova za rad s internim podacima, matematikom, generiranjem slučajnih brojeva, varijablama okruženja i skupljanjem smeća, kao i niz često korištenih iznimaka i atributa
Sustav.Zbirke
Sustav.Zbirke.Generički
Ovi imenski prostori sadrže brojne tipove spremnika, kao i nekoliko osnovnih tipova i sučelja koja vam omogućuju stvaranje posebnih kolekcija
Sustav.Podaci
System.Data.Common
System.Data.EntityClient
System.Data.SqlClient
Ovi prostori imena koriste se za interakciju s bazama podataka pomoću ADO.NET-a
Sustav.IO
System.IO.Compression
System.IO.Ports
Ovi prostori sadrže mnoge tipove dizajnirane za upravljanje I/O datotekama, kompresiju podataka i manipulaciju portovima.
Sustav.Odraz
System.Reflection.Emit
Ovi prostori imena sadrže tipove koji podržavaju otkrivanje tipa u vrijeme izvođenja kao i stvaranje dinamičkog tipa
System.Runtime.InteropServices Ovaj prostor imena sadrži sredstva pomoću kojih možete dopustiti .NET tipovima interakciju s "neupravljanim kodom" (kao što su DLL-ovi temeljeni na C-u i COM poslužitelji) i obrnuto
Sustav.Crtanje
System.Windows.Forms
Ovi prostori imena sadrže tipove koji se koriste za izradu aplikacija za stolna računala korištenjem izvornog skupa grafičkih alata .NET (Windows Forms).
Sustav.Windows
System.Windows.Controls
Sustav.Windows.Oblici
Prostor Sustav.Windows je korijen između ovih nekoliko prostora imena, koji predstavljaju skup grafičkih alata Windows Presentation Foundation (WPF)
System.Linq
System.Xml.Linq
System.Data.DataSetExtensions
Ovi prostori imena sadrže tipove koji se koriste pri programiranju pomoću LINQ API-ja
Sustav.Web Ovaj prostor imena jedan je od mnogih koji vam omogućuju stvaranje ASP.NET web aplikacija
System.ServiceModel Ovaj je prostor imena jedan od mnogih koje možete koristiti za stvaranje distribuiranih aplikacija pomoću API-ja Windows Communication Foundation (WCF).
System.Workflow.Runtime
Sustav.Tijek rada.Aktivnosti
Ova dva prostora imena glavni su predstavnici mnogih prostora imena koji sadrže tipove koji se koriste za izgradnju aplikacija s omogućenim tijekovima rada pomoću API-ja Windows Workflow Foundation (WWF).
Sustav.Threading
Sustav.Threading.Tasks
Ovaj prostor imena sadrži brojne tipove za izgradnju višenitnih aplikacija koje mogu distribuirati radno opterećenje na više CPU-a.
Sustav.Sigurnost Sigurnost je svojstvena .NET svijetu. Prostori imena vezani uz sigurnost sadrže mnoge vrste koje se bave dopuštenjima, kriptografskom sigurnošću itd.
System.Xml Ovaj prostor imena orijentiran na XML sadrži brojne tipove koji se mogu koristiti za interakciju s XML podacima

Uloga Microsoftovog korijenskog prostora

Prilikom ispitivanja popisa u tablici bilo je lako primijetiti da je imenski prostor System korijen pristojnog broja ugniježđenih imenskih prostora (kao što su System.IO, System.Data, itd.). Međutim, kako se pokazalo, uz System, knjižnica osnovne klase nudi i niz drugih korijenskih imenskih prostora najviše razine, od kojih je najkorisniji Microsoftov imenski prostor.

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

Zahvaljujući njemu nema sukoba između imena, jer postoje situacije kada više varijabli poprimaju iste vrijednosti. Obično se to događa kada se stvaraju različite biblioteke.

Identifikatori su slobodno dostupni u međusobnom odnosu. Dobivaju besplatan pristup neovisnim članovima kada koriste format punog imena.

Za ovo je izuzetno važno tako da objekt sadrži puni oblik imena koristeći namespace std. Ovo je važno za vizualno razumijevanje kako deklaracija izgleda kada se postavi u ime prostora.

Slika prikazuje nekoliko varijanti pristupa kodiranju, smješten unutar i izvan njegovih ograda:

1 Ovako to izgleda puno ime:

2 Za dopunu postojećeg oglasa, dodaj pomoću:

3 Za dodavanje svih postojećih ID-ova, koristite odgovarajuću direktivu:

Korištenje Direktive

Direktiva using dopušta iskorištavanje svih dostupnih imena koja su uključena u imenski prostor.

Nema potrebe za navođenjem kvalifikatora.

Morate koristiti korištenje u datoteci formata cpp. Međutim, važan uvjet je prisutnost nekoliko identifikatora.

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

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

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

Napominjemo da je stvaranje varijabli s istim imenom nezakonito.

Savjet! Radi lakšeg korištenja, direktiva using može se nalaziti na vrhu datoteke formata cpp, ili obrnuto, smještena unutar stvorene biblioteke.

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

Osim ako je apsolutno neophodno, direktiva o upotrebi ne bi se trebala postavljati u zaglavljima u datoteci H formata.

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

Za datoteke je najbolje rješenje koristiti puni naziv.

U slučaju da se pokažu predugi, možete koristiti kratice u obliku aliasa.

Deklaracije imenskog prostora

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 puni naziv.

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

Za implementaciju funkcije cpp format contosodata također je važno koristiti puno ime u malim i malim slovima 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 kombiniraju tijekom obrade podataka.

Tako se, na primjer, std., u 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 tiče definicije, ona mora doći nakon deklaracije u prostoru imena u kojem je kreirana.

Kao vizualni primjer obratite pozornost na sljedeću sliku:

Najčešće se ova pogreš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 deklarirani u određenom prostoru imena, formalno pripada prostoru globalnog tipa.

Savjet! Osim ako nije apsolutno neophodno, preporuča se izbjegavati uključivanje članova u globalni prostor tipa.

Značajna iznimka od pravila može biti samo glavna opcija, što podrazumijeva obvezno uključivanje u ogroman prostor.

Da biste stvorili identifikator globalnog tipa, trebate koristiti odgovarajuću funkcionalnost vidljivosti, u obliku punog imena.

Ova radnja pomoći će stvoriti razlikovno svojstvo jednog identifikatora od drugih postojećih koji su u drugom prostoru imena.

To će vam pomoći da razumijete kôd.

Razmak std.

Vrijedno je napomenuti da prostori mogu biti ugniježđenog tipa.

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

Kad govorimo o matičnim članovima, oni nemaju takvu funkciju.

Za proširenje su potrebni ugrađeni dodaci.

Za precizniju definiciju i razumijevanje, obratite pozornost na sljedeću sliku:

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

Usporedbe su obični prilozi standardnog tipa, ugrađeni članovi roditeljskog imenskog prostora.

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

Da vidite primjer kako se vrši uvezivanje, Vrijedi se osvrnuti na sljedeći primjer:

Sljedeća slika prikazuje proces specijalizacije u predlošku nadređenog prostora, koji je deklariran 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 stvoriti jedan roditeljski prostor i enkapsulirati svako prikazano sučelje.

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

Zatim 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 stvoriti puni put do privitka.

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

Pogledajmo sljedeći primjer dvije opcije sučelja, gdje svaka ima prostor. Kod klijenta također ima mogućnost iskorištavanja novih biblioteka.

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

Sva imena moraju biti izuzetno jedinstvena; stoga se njihova duljina značajno povećava.

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

Moguće je stvoriti alias samo za imenski prostor.

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

Također je moguće stvoriti običan prostor, ali mu se ne dodjeljuje alias.

Takav teritorijalni spektar naziva se anonimnim.

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

Cjelokupna struktura, kada se svi identifikatori mogu vidjeti, međutim, izvan stvorenog prostora, oni će ostati nevidljivi.

Ne vrijedi ništa, da će sam prostor imena također biti nevidljiv izvan bloka, tako da svaki korisnik treba unaprijed obratiti pažnju na ovaj detalj.

Obično je korištenje znanja potrebno za one koji rade u Visual C++.

Korištenjem kvalitetnih primjera bit će puno lakše razumjeti ovu temu.

Recimo da želimo podijeliti našu klasu Array, razvijenu u prethodnim primjerima. Međutim, nismo bili sami u suočavanju s ovim problemom; Možda je netko negdje, recimo, u jednoj od Intelovih divizija, stvorio klasu istog imena. Budući da su nazivi ovih klasa isti, potencijalni korisnici ne mogu koristiti obje klase u isto vrijeme, moraju odabrati jednu od njih; Ovaj problem se rješava dodavanjem imena klase niza koji identificiraju njene programere, recimo,

Klasa Cplusplus_Primer_Third_Edition_Array ( ... );

Naravno, to također ne jamči jedinstvenost imena, ali će najvjerojatnije spasiti korisnika od ovog problema. Kako je, međutim, nezgodno koristiti tako duga imena!
Standard C++ nudi mehanizam za rješavanje problema podudaranja naziva tzv imenski prostor. Svaki proizvođač softvera može zamotati svoje klase, funkcije i druge objekte u 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, koja se u ovom slučaju naziva Cplusplus_Primer_3E. Recimo da imamo klase drugih programera smještene u različitim imenskim prostorima:

Imenski prostor IBM_Canada_Laboratory ( predložak klasa Niz(...);
klasa Matrica(...);
}
imenski prostor Disney_Feature_Animation (
klasa Point(...);
predložak klasa Niz(...);
}

Prema zadanim postavkama, objekti deklarirani bez eksplicitnog imenskog prostora vidljivi su u programu; pripadaju globalno imenski prostor. Da biste uputili 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 objektima u gornjim primjerima:

Cplusplus_Primer_3E::Array tekst; IBM_Canada_Laboratory::Matrix mat; Disney_Feature_Animation::Porijeklo točke(5000,5000);

Radi lakšeg korištenja, možete dodijeliti pseudonime imenskim prostorima. Nadimak je odabran tako da bude kratak i lak za pamćenje. Na primjer:

// aliasi imenskog prostora LIB = IBM_Canada_Laboratory; imenski prostor DFA = Disney_Feature_Animation;
int main()
{
LIB::Niz ia(1024);
}

Aliasi se također koriste za skrivanje korištenja imenskih prostora. Zamjenom aliasa možemo promijeniti skup uključenih funkcija i klasa, au svim drugim aspektima programski kod će ostati isti. Ispravljanjem samo jedne linije u gornjem primjeru, dobivamo definiciju potpuno drugačijeg niza:

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

Naravno, da bi to bilo moguće, mora postojati točna podudarnost između sučelja klasa i funkcija deklariranih u tim imenskim prostorima. Zamislimo da klasa Array iz Disney_Feature_Animation nema konstruktor s jednim parametrom - veličinom. Zatim će sljedeći kod izbaciti pogrešku:

Imenski prostor LIB = Disney_Feature_Animation;
int main()
{
LIB::Niz ia(1024);
}

Još prikladniji način je koristiti jednostavno, nekvalificirano ime za referencu na objekte definirane u nekom prostoru imena. Za to postoji smjernica korištenja:
#include "IBM_Canada_Laboratory.h"

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

Prostor imena IBM_Canada_Laboratory postaje vidljiv u programu. Možete učiniti vidljivim ne cijeli prostor, već pojedinačna imena unutar njega (selektivna uporaba direktive):

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

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

#uključi // pogreška: niz je nevidljiv

Morate koristiti direktivu korištenja:

#uključi korištenje imenskog prostora std; // Ok: vidi niz
string current_chapter = "C++ pregled";

Napominjemo, međutim, da se na ovaj način vraćamo na problem “začepljenja” globalnog imenskog prostora, za čije je rješavanje stvoren mehanizam imenovanih prostora. Stoga je bolje koristiti ili kvalificirani naziv:

#uključi // ispravno: kvalificirano ime std::string current_chapter = "C++ Pregled"; ili selektivna direktiva koristeći: #include korištenje imenskog prostora std::string; // Ok: string vidljiv
string current_chapter = "C++ pregled";

Preporučujemo korištenje posljednje metode.
U većini primjera u ovoj knjizi, direktive imenskog prostora su izostavljene. Ovo je učinjeno kako bi se smanjila veličina koda, a također i zato što je većina primjera prevedena s kompajlerom koji ne podržava prostore imena - dovoljna je nedavna inovacija u C++. (Detalji korištenja deklaracija korištenja pri radu sa standardnom bibliotekom C++ raspravljaju se u odjeljku 8.6.)
U sljedećim poglavljima stvorit ćemo još četiri klase: String, Stack, List i modifikaciju Stacka. Svi će oni biti zatvoreni u jednom prostoru imena - Cplusplus_Primer_3E. (O radu s prostorima imena detaljnije raspravljamo u poglavlju 8.)

Vježba 2.21

Dan imena

Vježba prostora imena ( predložak klasa Niz(...);
predložak
void print(niz< EType >);
klasa String ( ... )
predložak
Popis klasa(...);
}

i tekst programa:

Int main() ( const int size = 1024; Array kao (veličina); Popis il(veličina);
// ...
Niz *pas = novi niz (kao);
Popis *pil = novi popis (il);
ispis(*pas);
}

Program se ne kompajlira jer su deklaracije korištenih klasa zatvorene u prostoru imena Exercise. Izmijenite programski kod pomoću
(a) kvalificirana imena
(b) direktiva o selektivnoj uporabi
(c) alias mehanizam
(d) korištenje direktive

Napomena: Ovaj odjeljak opisuje upotrebu i deklaraciju imenskih prostora. Dane su glavne karakteristike RDF-a, XML-podataka, opisa sadržaja dokumenta (DCD), sheme za objektno orijentirani 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 (točnije, tzv. Backus-Naurov oblik, Prošireni Backus Naur obrazac);
  2. te definicije nisu dovoljno izražajne;
  3. Budući da svaki korisnik može kreirati vlastite oznake, vrlo je vjerojatno da će ljudi koristiti iste nazive elemenata za označavanje različitih stvari. Čak i ako su značenja elemenata ista, njihov mogući sadržaj može varirati ovisno o definiciji. Dakle, trebamo 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ćuje definiranje konteksta elementa u imenskom prostoru.
  4. Postoje situacije u kojima je potrebno kombinirati XML dokumente iz različitih izvora koji odgovaraju različitim DTD definicijama. Na primjer, ova situacija se javlja 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đer se događa u sustavima e-trgovine kada se pokušavaju kombinirati podaci vašeg poslovnog partnera s vašima. Također se može pojaviti situacija kada jednostavno trebate dodati svoje postavke u postojeći DTD kako biste razmijenili neke informacije u standardnom formatu. Nažalost, XML preporuka ne pruža način kombiniranja višestrukih DTD-ova u jednom dokumentu bez njihove izmjene ili stvaranja novog DTD-a (koristeći vanjske reference).

Ovo poglavlje pokriva sljedeća dva pojma - imenski prostor i XML sheme. Prostori imena omogućuju XML programerima da razbiju složeni problem u male dijelove i kombiniraju više rječnika u jednom dokumentu kako bi ga u potpunosti opisali. Koristeći sheme, dizajneri rječnika stvaraju preciznije definicije nego što je to bilo moguće u DTD-ovima, i to pomoću XML sintakse.

Ova dva alata pomažu u rješavanju složenih problema koji nastaju pri korištenju XML-a. Prostori imena i sheme omogućuju XML dizajnerima i programerima da:

  • Bolje organizirati rječnike za rješavanje složenih problema;
  • Zadržati snažno tipkanje podaci tijekom transformacija u i iz XML-a;
  • Opišite rječnike preciznije i fleksibilnije nego što je to bilo moguće s DTD-om;
  • Čitajte pravila rječnika u XML-u, pristupajući njegovim definicijama bez kompliciranja parsera.

Miješanje rječnika

Prilikom izrade rječnika možda ima smisla rastaviti globalni problem na nekoliko sastavnih dijelova. To zahtijeva načine segmentiranja velikog problema 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 npr. radite za korporaciju u kojoj najvjerojatnije već postoji set DTD definicija i njihova upotreba može uvelike olakšati posao, jer opisuju problem onako kako ga drugi razumiju. Često je također korisno ponovno koristiti DTD definicije, tj. Korištenje uobičajenih konstrukcija iz prethodno stvorenih DTD definicija. Ako razvijate aplikaciju koja treba komunicirati sa softverom vanjskog partnera, nemate drugog izbora nego ponovno upotrijebiti postojeće koncepte. Postojeće definicije DTD-a predstavljaju zajednički jezik koji se mora govoriti da bi se razumio. Ako koncept već postoji, čovjek se mora potruditi da bude shvaćen u smislu tog koncepta.

Kada koristite definicije koje su vam korisne iz DTD-ova drugih programera ili kada kombinirate segmentirane DTD-ove da biste stvorili dokument koji opisuje složeni problem, ako vaši dokumenti koriste elemente s istim nazivima, riskirate naići na probleme višeznačnost i kolizije imena.

Problem se dodatno pogoršava korištenjem instanci imena iz više DTD-ova. U ovom slučaju, ne znamo na koji se element, na koju DTD definiciju odnosi, ovaj problem dobro oblikovanih dokumenata nazivamo dvosmislenošću. Štoviše, ako imena iz dokumenta zahtijevaju provjere valjanosti, našu aplikaciju možemo učiniti vrlo zbunjujućom. Ovaj problem se naziva kolizija imena.

Imenski prostori

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

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

Prostor imena je zbirka određenih vrijednosti ili karakteristika koje se mogu koristiti u XML dokumentima kao imena elemenata ili atributa. Prostori imena u XML-u definirani su jedinstvenim identifikatorom izvora (URI) (možete koristiti DTD adresu na svom poslužitelju kao URI). Omogućuje da svaki imenski prostor bude jedinstven.

Dakle, kako bismo učinkovito koristili prostore imena u dokumentu koji kombinira elemente iz različitih izvora, moramo definirati:

  • Referenca na URI koji opisuje upotrebu elementa.
  • Alias ​​koji nam omogućuje da razumijemo iz kojeg imenskog prostora dolazi naš element. Ovaj pseudonim je u obliku prefiksa elementa (na primjer, ako je pseudonim za nejasni element knjige katalog, tada bi se element zvao ).

Korištenje i deklariranje imenskih prostora

Deklaracija imenskog prostora

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

Budući da želimo da svatko može prepoznati deklaraciju imenskog prostora kada je vidi, rezerviramo posebnu riječ za nju. Prema preporuci za imenske prostore, riječ je xmlns. Vrijednost atributa je URI koji specificira imenski prostor za korištenje. Ovo je često URL definicije DTD-a, ali ne mora uvijek biti tako. Prefiks prostora imena i identifikator definirani su atributom xmlns na sljedeći način:

Kao što vidite, ntb prefiks je upravo definiran, ali se već može koristiti u nazivu ntb: notebook . Ubuduće će nazivi oznaka i atributa koje želimo dodijeliti prostoru imena http://some.firm.com/2003/ntbml imati prefiks ntb, na primjer:

Gorelovo

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

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

Naziv zajedno s prefiksom, na primjer

naziva proširenim, kvalificiranim ili kvalificiranim imenom (OName. Qualified Name). Dio imena napisan iza dvotočke naziva se mjesni dio imena.

Nomenklatura naziva web izvora može biti zbunjujuća. Uniform Resource Locator ( Uniform Resource Locator, URL) označava resurs u smislu pristupnog protokola i mrežne lokacije. Uniformni identifikator izvora ( Uniformni identifikator izvora, URI) je jedinstveni naziv za neki resurs. Na URI gledajte 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 s prefiksom samo trik; svaki program koji ne "zna" imenski prostor, analizira dokument kvalificirano ime kao obično ime. Iz toga posebice proizlazi da je u deklaracija o vrsti dokumenta(Deklaracija o vrsti dokumenta) prefiksi imena ne mogu se izostaviti.

Atribut xmlns može se pojaviti na bilo kojem XML elementu, ne samo na korijenskom elementu. Prefiks koji definira može se koristiti u elementu u kojem je napisan atribut xmlns i u svim elementima ugniježđenima unutar njega. Štoviše, više imenskih prostora može se definirati u jednom elementu.

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

Pojava naziva oznake bez prefiksa u dokumentu koji koristi prostor imena znači da naziv pripada zadanom prostoru imena.

Dobro dizajniran dokument trebao bi koristiti imenske prostore za sve svoje elemente.

Prefiksi koji počinju xml znakovima u svakom su slučaju rezervirani za sam XML jezik. Prefiks xmlns koristi se za povezivanje drugog, definiranog prefiksa s njegovim identifikatorom prostora imena. Prefiks xmlns ne treba definirati, uveden je 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 s identifikatorom http://www.w3.org/XML/1998/namespace. Također ga ne treba definirati u XML dokumentu. Nikakav drugi prefiks ne može se pridružiti ovim identifikatorima za očuvanje instrukcija da znakovi razmaka ostanu netaknuti. Ovo je važno za neke tekstove, kao što su programski kodovi. Zadana vrijednost ostavlja razmak prema nahođenju rukovatelja.

Opseg

Deklaracije prostora imena imaju opseg, baš kao i deklaracije varijabli u programskim jezicima. Ovo je važno jer se prostori imena ne deklariraju uvijek 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 izričito 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 prostora imena na elementima koji bi inače naslijedili druge prostore imena. U tom smislu definirana su dva načina deklariranja opsega: zadani i kvalificirani.

Zadani opseg

Kao što možete očekivati, dodavanje prefiksa svakom imenu u dokumentu brzo postaje zamorno. Zapravo, uvođenjem koncepta opsega imena, možemo miješati veliki broj prefiksa u našem dokumentu. Ako definiramo zadani prostor imena, pretpostavlja se da posjeduje sva nekvalificirana imena unutar opsega svoje deklaracije. Stoga se zadani prostor imena deklariran u korijenskom elementu smatra zadanim za cijeli dokument i može ga nadjačati samo specifičniji prostor imena deklariran unutar dokumenta.

Da biste prostor imena učinili zadanim prostorom imena za opseg, jednostavno izostavite deklaraciju prefiksa.

Ako je prefiks deklariran i zatim korišten u kombinaciji s imenom, kaže se da je prostor imena eksplicitno uspostavljen. Da biste dodijelili nekvalificirano ime prostoru imena, morate deklarirati zadani prostor koji uključuje nekvalificirano ime (bez prefiksa).

Kvalificirani opseg

Gornja metoda dobro funkcionira ako možete jasno razdvojiti svoje prostore imena. 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. Deklarirajte imenske prostore koji su vam potrebni na početku dokumenta, a zatim ih kvalificirajte na mjestu korištenja.

Će pomoći.
Put do podrške za imenski prostor u PHP-u bio je težak. No, na sreću, dodan je u jezik u PHP-u 5.3, a struktura PHP koda se od tada znatno poboljšala. Ali kako bismo ih točno trebali koristiti?

Što su prostori imena?

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

Zamislite imenski prostor kao kutiju u koju možete staviti bilo što: olovku, ravnalo, komad papira i tako dalje. Ovo su tvoje stvari. Odmah ispod vaše kutije nalazi se tuđa kutija, a njezin vlasnik u njoj drži iste stvari. Kako biste izbjegli korištenje tuđih predmeta, odlučite označiti kutije tako da bude jasno što kome pripada.

Ranije su programeri morali koristiti prefikse podvlake u svojim klasama, funkcijama i konstantama za odvajanje koda. To je jednako kao da svatko označi svoje stvari i spremi ih u jednu veliku kutiju. Naravno, ovo je barem neka vrsta organizacije, ali je vrlo neučinkovita.

Imenski prostori, pomoć! Možete deklarirati istu funkciju, klasu, sučelje i definirati konstantu u odvojenim imenskim prostorima bez dobivanja fatalnih pogrešaka. U svojoj srži, prostori imena nisu ništa više od hijerarhijski označenih blokova koda koji sadrže uobičajeni PHP kod.

Vi ih koristite!

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

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

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

Definicija imenskog prostora

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

Imenski prostori se deklariraju korištenjem rezervirane riječi namespace. Prostori imena slijede ista pravila kao i drugi identifikatori u PHP-u. Dakle, imenski prostor bi trebao počinju slovom ili podvlakom nakon koje slijedi bilo koji broj slova, brojeva ili podvlaka.

Ako želite definirati blok koda u globalni prostor, 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 imenski prostor za nekoliko različitih datoteka; proces povezivanja datoteke automatski će ih 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 koriste se za izbjegavanje nedosljednih definicija i uvođenje više fleksibilnosti i organizacije u programski kod.

Imajte na umu da su vitičaste zagrade potpuno neobavezne. Zapravo, korištenje pravila jednog prostora imena po datoteci i izostavljanje vitičastih zagrada čini vaš kod puno čišćim - nema potrebe za uvlačenjem ugniježđenog koda.

Podimeni prostori

Prostori imena mogu slijediti određenu hijerarhiju, baš poput direktorija u datotečnom sustavu na računalu. Prostori podimena iznimno su korisni za organiziranje strukture projekta. Na primjer, ako vaš projekt zahtijeva pristup bazi podataka, možete postaviti rukovatelj iznimkama baze podataka i kod rukovatelja vezom u prostor podimena baze podataka.

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

PHP koristi kosu crtu unazad kao razdjelnik prostora imena.

Zanimljivost: u RFC-u, kako bi se odlučilo koji separator prostora imena koristiti, razmatrana je mogućnost korištenja emotikona.

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

Definiranje prostora podimena s ugniježđenim blokovima koda nije podržano. Sljedeći primjer vratit će fatalnu pogrešku: "Deklaracije prostora imena ne mogu se ugniježditi."

Pozivni kod iz imenskog prostora

Ako želite stvoriti novu instancu objekta, pozvati funkciju ili koristiti konstante iz različitih imenskih prostora, koristite obrnutu kosu crtu. Postoje tri vrste definicija imena prostora imena:
  • Nekvalificirano ime
  • Kvalificirano ime
  • Potpuno kvalificirano ime

Nepotpuno ime

Ovo je naziv klase, funkcije ili konstante i ne uključuje referencu na bilo koji prostor imena. Za one koji tek počinju raditi s prostorima imena, ovo je uobičajeno gledište.

Puno ime

Ovako pristupamo hijerarhiji prostora podimena; odvojene obrnutom kosom crtom.

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

Apsolutni naziv

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

Ako želite pristupiti funkciji, klasi ili konstanti koja je na višoj razini hijerarhije, tada trebate koristiti puni naziv - apsolutni put, a ne relativni. Poziv mora započeti obrnutom kosom crtom. Ovo PHP-u daje do znanja da ovaj poziv treba uputiti iz globalnog prostora, umjesto da mu se pristupa u odnosu na vašu trenutnu lokaciju.

Ne moramo koristiti puno ime za PHP interne funkcije. Nekvalificirani nazivi za funkcije i konstante bit će definirani u globalnom prostoru imena ako nisu definirani u trenutnom prostoru imena.

Znajući to, sada možemo preopteretiti interne PHP funkcije dok još uvijek možemo pozvati izvornu funkciju (ili konstantu).

"; }

Dinamički pozivi

PHP je dinamički programski jezik; tako da možete koristiti ovu funkcionalnost za pozivanje koda iz prostora imena. Ovo je u biti isto kao korištenje dinamičkog naziva klase ili povezivanje dinamičke datoteke pomoću varijable za pohranjivanje njenog imena. PHP razdjelnik imena koristi iste metaznakove u nizovima. Ne zaboravite na obrnutu kosu crtu kada pohranjujete ime prostora imena kao niz!

ključna riječ prostora imena

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

__NAMESPACE__ konstanta

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

Ova konstanta je vrlo korisna kada počinjete učiti imenski prostor; također je vrlo koristan za otklanjanje pogrešaka. Budući da se radi o nizu, može se koristiti u kombinaciji s pozivima dinamičkog koda o kojima se gore raspravljalo.

Uvezite ili stvorite pseudonim imena

nije potrebno koristiti u imenskim prostorima

Važna značajka imenskih prostora u PHP-u je mogućnost pozivanja na vanjsko apsolutno ime pomoću pseudonim, ili uvozeći.

Uvozi su vrlo koristan i temeljni aspekt prostora imena. To vam daje mogućnost korištenja vanjskih paketa, kao što su biblioteke, bez brige o sukobima imena. Uvoz se vrši pomoću ključne riječi use. Ako želite, možete navesti prilagođeni alias pomoću ključne riječi as.

Koristi kao

Kako ga koristiti

Apsolutni naziv može se povezati s kraćim nekvalificiranim nazivom, tako da ne morate pisati njegov apsolutni naziv svaki put kada ga želite koristiti. Stvaranje ili uvoz aliasa mora se dogoditi u nadređenom imenskom prostoru ili globalnom. Pokušaj učiniti ovo 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 nazive u prostoru imena vodeća obrnuta kosa crta nije potrebna i ne preporučuje se njezino prisustvo, budući da uvezena imena moraju biti apsolutna i ne analiziraju se u odnosu na trenutni prostor imena.

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

Zaključak

Prostori imena koriste se za izbjegavanje sukoba definicija i uvođenje više fleksibilnosti i organizacije u programski kod. Zapamtite da niste obavezni koristiti imenske prostore; Ova se značajka koristi u kombinaciji s objektno orijentiranim pristupom. Nadam se da ćete razmisliti o podizanju vašeg (budućeg) PHP projekta na višu razinu korištenjem imenskih prostora.