Kaj je imenski prostor v c. Razredi in imenski prostori. Klicna koda iz imenskega prostora

Razredi in imenski prostori

Razredi .NET Framework

Morda je največja prednost pisanja upravljane kode – vsaj z vidika razvijalca – ta, da lahko uporabljate Knjižnica osnovnih razredov .NET .

Jedrni razredi .NET zagotavljajo ogromno zbirko razredov upravljane kode, ki vam omogočajo, da rešite skoraj vsako težavo, ki bi jo bilo prej mogoče rešiti z vmesnikom Windows API. Vsi ti razredi sledijo istemu objektnemu modelu IL z enim samim dedovanjem. To pomeni, da lahko ustvarite objekte iz katerega koli od osnovnih razredov .NET ali pa od njih podedujete lastne razrede.

Osnovni razredi .NET so drugačni po tem, da so zasnovani tako, da so intuitivni in enostavni za uporabo. Če želite na primer začeti nit, morate poklicati metodo Start() razreda nit. Če želite narediti objekt TextBox nedostopen, nastavite lastnost predmeta Enabled na false. Ta pristop, ki ga poznajo razvijalci Visual Basic in Java, katerih knjižnice so prav tako enostavne za uporabo, bo v veliko olajšanje razvijalcem C++, ki so se leta borili s funkcijami API-ja, kot so GetDIBits(), RegisterWndClassEx() in IsEqualIID(). tudi številne funkcije, ki so zahtevale prehod okenskih ročajev.

Vendar so imeli razvijalci C++ vedno enostaven dostop do celotnega nabora API-jev Windows, medtem ko so bili razvijalci Visual Basic 6 in Java omejeni na osnovno funkcionalnost operacijskega sistema, do katerega dostopajo iz svojih jezikov. Osnovni razredi .NET združujejo enostavnost uporabe knjižnic Visual Basic in Java z razmeroma popolno pokritostjo nabora funkcij Windows API. Številne funkcije sistema Windows niso dostopne prek osnovnih razredov in v teh primerih se boste morali zateči k funkcijam API-ja, vendar na splošno to velja samo za najbolj eksotične funkcije. Za vsakodnevno uporabo bo na splošno zadostoval niz osnovnih razredov. Če pa morate poklicati funkcijo API, potem .NET zagotavlja tako imenovano mehanizem za priklic platforme, ki zagotavlja pravilno pretvorbo tipov podatkov, tako da zdaj ta naloga ni nič težja od klicanja teh funkcij neposredno iz kode C++, ne glede na to, v katerem jeziku je koda napisana - C#, C++ ali Visual Basic 2010.

Imenski prostori

Imenski prostori je način, s katerim se .NET izogne ​​konfliktom poimenovanja med razredi. Namenjeni so preprečevanju situacij, ko definirate razred, ki predstavlja kupca, ga poimenujete Stranka, nato pa nekdo drug naredi isto (to je dokaj pogost scenarij).

Imenski prostor ni nič drugega kot skupina podatkovnih tipov, vendar ima za posledico, da so imena vseh podatkovnih tipov znotraj imenskega prostora samodejno predpona z imenom imenskega prostora. Imenski prostori so lahko ugnezdeni drug v drugega. Na primer, večina splošnih osnovnih razredov .NET se nahaja v imenskem prostoru Sistem. Osnovni razred Array nanaša na ta prostor, zato je njegovo polno ime System.Array.

Platforma .NET zahteva, da so vsa imena deklarirana znotraj imenskega prostora; na primer lahko postavite svoj razred Moj razred v imenski prostor Moje podjetje. Nato bo videti polno ime tega razreda MojePodjetje.MojRazred.

Upoštevajte, da če imenski prostor ni izrecno naveden, bo tip dodan neimenovanemu globalnemu imenskemu prostoru.

V večini primerov Microsoft priporoča uporabo vsaj dveh ugnezdenih imenskih prostorov: prvi je ime vašega podjetja, drugi pa je ime tehnologije ali programskega paketa, ki mu razred pripada, zato je videti nekako takole: MyCompany.SomeNamespace .Moj razred. V večini primerov bo ta pristop zaščitil razrede vaše aplikacije pred morebitnimi konflikti z imeni razredov, ki so jih napisali razvijalci iz drugih podjetij.

Naslednja tabela je kratek seznam nekaterih (vendar zagotovo ne vseh) imenskih prostorov, ponujenih v .NET, ki so bili razdeljeni v skupine glede na funkcionalnost:

Imenski prostori ključev .NET Framework
Imenski prostor v .NET Opis
Sistem Znotraj imenskega prostora Sistem vsebuje veliko uporabnih vrst za obravnavo notranjih podatkov, matematike, generiranja naključnih števil, spremenljivk okolja in zbiranja smeti, kot tudi številne pogosto uporabljene izjeme in atribute
Sistem.Zbirke
System.Collections.Generic
Ti imenski prostori vsebujejo številne vrste vsebnikov, pa tudi več osnovnih tipov in vmesnikov, ki vam omogočajo ustvarjanje posebnih zbirk
System.Data
System.Data.Common
System.Data.EntityClient
System.Data.SqlClient
Ti imenski prostori se uporabljajo za interakcijo z bazami podatkov z uporabo ADO.NET
System.IO
System.IO.Compression
System.IO.Ports
Ti prostori vsebujejo veliko tipov, ki so zasnovani za upravljanje V/I datotek, stiskanje podatkov in manipulacijo vrat.
Sistem.Odsev
System.Reflection.Emit
Ti imenski prostori vsebujejo tipe, ki podpirajo odkrivanje tipov med izvajanjem in ustvarjanje dinamičnega tipa
System.Runtime.InteropServices Ta imenski prostor vsebuje sredstva, s katerimi lahko vrstam .NET omogočite interakcijo z "neupravljano kodo" (kot so DLL-ji, ki temeljijo na C, in strežniki COM) in obratno
Sistem.Risanje
System.Windows.Forms
Ti imenski prostori vsebujejo vrste, ki se uporabljajo za gradnjo namiznih aplikacij z uporabo izvornega nabora grafičnih orodij .NET (Windows Forms).
System.Windows
System.Windows.Controls
System.Windows.Shapes
Vesolje System.Windows je koren med temi več imenskimi prostori, ki predstavljajo niz grafičnih orodij Windows Presentation Foundation (WPF).
System.Linq
System.Xml.Linq
System.Data.DataSetExtensions
Ti imenski prostori vsebujejo vrste, ki se uporabljajo pri programiranju z uporabo API-ja LINQ
System.Web Ta imenski prostor je eden od mnogih, ki vam omogočajo ustvarjanje spletnih aplikacij ASP.NET
System.ServiceModel Ta imenski prostor je eden izmed mnogih, ki jih lahko uporabite za ustvarjanje porazdeljenih aplikacij z API-jem Windows Communication Foundation (WCF).
System.Workflow.Runtime
System.Workflow.Activities
Ta dva imenska prostora sta glavna predstavnika številnih imenskih prostorov, ki vsebujejo vrste, ki se uporabljajo za gradnjo aplikacij, omogočenih za potek dela, z uporabo API-ja Windows Workflow Foundation (WWF).
System.Threading
System.Threading.Tasks
Ta imenski prostor vsebuje številne tipe za gradnjo večnitnih aplikacij, ki lahko porazdelijo delovno obremenitev na več CPU-jev.
Sistem.Varnost Varnost je del sveta .NET. Imenski prostori, povezani z varnostjo, vsebujejo številne vrste, ki obravnavajo dovoljenja, kriptografsko varnost itd.
System.Xml Ta imenski prostor, usmerjen v XML, vsebuje številne vrste, ki jih je mogoče uporabiti za interakcijo s podatki XML

Vloga Microsoftovega korenskega prostora

Pri pregledu seznama v tabeli je bilo zlahka opaziti, da je imenski prostor System koren spodobnega števila ugnezdenih imenskih prostorov (kot so System.IO, System.Data itd.). Izkazalo pa se je, da knjižnica osnovnega razreda poleg sistema ponuja tudi številne druge korenske imenske prostore najvišje ravni, od katerih je najbolj uporaben Microsoftov imenski prostor.

Pri odgovoru na vprašanje, kaj je uporaba imenskega prostora std, je treba najprej opozoriti, da v prevodu iz angleščine opisani izraz pomeni imenski prostor, ki je obseg deklaracije, potreben za definiranje različnih identifikacijskih oblik: funkcije in odvisne/neodvisne spremenljivke.

Zahvaljujoč temu ni konflikta med imeni, saj obstajajo situacije, ko več spremenljivk prevzame enake vrednosti. Običajno se to zgodi, ko se ustvarijo različne knjižnice.

Identifikatorji so prosto dostopni v povezavi drug z drugim. Pri uporabi oblike polnega imena dobijo brezplačen dostop do neodvisnih članov.

Za to je izjemno pomembno tako da objekt vsebuje polno obliko imena z uporabo imenskega prostora std. To je pomembno za vizualno razumevanje, kako je deklaracija videti, ko je postavljena v ime prostora.

Slika prikazuje več različic dostopa do kodiranja, ki se nahajajo znotraj in zunaj njegovih ograj:

1 Takole izgleda polno ime:

2 Za dopolnitev obstoječega oglasa, dodaj z:

3 Če želite dodati vse obstoječe ID-je, uporabite ustrezno direktivo:

Uporaba direktive

Direktiva using dovoljuje izkoriščanje vseh razpoložljivih imen, ki so vključena v imenski prostor.

Kvalifikatorja ni treba navesti.

Uporabiti morate uporabo v datoteki formata cpp. Vendar je pomemben pogoj prisotnost več identifikatorjev.

V primeru, da obstaja samo nekaj imen, bo primerno ustvariti običajno ime.

Nato lahko dodate le potrebne identifikatorje, ostalo pa pustite pri miru.

Pomembno je upoštevati, da če se ime lokalne spremenljivke in glavne spremenljivke ujemata, bo v tem primeru prva v skritem dostopu.

Upoštevajte, da je ustvarjanje spremenljivk z istim imenom nezakonito.

Nasvet! Za lažjo uporabo se lahko direktiva using nahaja na vrhu datoteke formata cpp. ali obratno, v ustvarjeni knjižnici.

Da bi zagotovili najbolj udobne delovne pogoje zase, lahko delate na namestitvi potrebnih datotek.

Razen če je to nujno potrebno, direktive o uporabi ne smete postaviti v glavah v datoteki formata H.

To je posledica dejstva, da bodo s tem dejanjem vsi identifikatorji postali aktivni v vidnem polju, kar bo povečalo verjetnost navzkrižja nekaterih imen.

Za datoteke je najboljša rešitev uporaba polnega imena.

V primeru, da se izkažejo za predolge, lahko uporabite okrajšave v obliki vzdevkov.

Deklaracije imenskega prostora

Običajno je, da oglase postavite v obliki imen datotek. V primeru, da se izvajanje določenih funkcij nahaja v ločeni knjižnici ali datoteki, je pomembno določiti polno ime.

Da bi razumeli, o katerih dejanjih govorimo, je vredno oglejte si naslednjo sliko:

Za izvedbo funkcije contosodata formata cpp. je pomembno tudi, da uporabite polno ime v velikih in malih črkah ko je direktiva na samem začetku:

Uporaba imenskega prostora std. lahko vsebuje oglase v več razdelkih hkrati, ki se nahajajo v isti datoteki.

Zaradi prevajalnika se med obdelavo podatkov vsi elementi združujejo.

Tako je na primer std. Praviloma deklariran v vseh glavah dostopnih datotek, ki se nahajajo v dostopnih knjižnicah standardnega tipa.

Člane, označene s popolnoma kvalificiranim imenom, je mogoče definirati ne le znotraj imenskega prostora, ampak tudi zunaj njega, če imajo izrecno kvalifikacijo.

Kar zadeva definicijo, mora priti za deklaracijo v imenskem prostoru, kjer je ustvarjena.

Kot vizualni primer bodite pozorni na naslednjo sliko:

Najpogosteje se ta napaka pojavi, ko je vrstni red definicij kršen ali pa so sestavni deli polnega imena takoj vključeni v razpoložljive predmete.

Ko piškotki niso deklarirani v določenem imenskem prostoru, formalno pripada prostoru globalnega tipa.

Nasvet! Priporočljivo je, da se izogibate vključevanju članov v globalni tipski prostor, razen če je to nujno potrebno.

Pomembna izjema od pravila je lahko le glavna možnost, kar pomeni obvezno vključitev v ogromen prostor.

Če želite ustvariti identifikator globalnega tipa, morate uporabiti ustrezno funkcionalnost vidnosti v obliki polnega imena.

To dejanje bo pomagalo ustvariti razlikovalno lastnost enega identifikatorja od drugih obstoječih, ki so v drugem imenskem prostoru.

To vam bo pomagalo razumeti kodo.

Presledek std.

Omeniti velja, da so prostori lahko ugnezdeni.

Če je mišljena navadna vdelava, potem ima neomejen značaj na ves prostor.

Če govorimo o matičnih članih, ti nimajo takšne funkcije.

Za razširitev so potrebni vgrajeni priključki.

Za natančnejšo opredelitev in razumevanje, bodite pozorni na naslednjo sliko:

Enkapsulira informacije za nadaljnjo implementacijo, lahko je tudi del navadnega ugnezdenega prostora in deluje kot vmesnik odprtega tipa v nadrejenem prostoru.

Primerjave so običajne priloge standardnega tipa, vgrajeni člani nadrejenega imenskega prostora.

Posledično lahko uporabite iskanje funkcij, ki imajo nekakšno preobremenitev, kjer bo prišlo do odvisnosti argumentov.

Če si želite ogledati primer izvajanja vezave, Vredno se je sklicevati na naslednji primer:

Naslednja slika prikazuje postopek specializacije v predlogi nadrejenega prostora, ki je deklariran v začasnem prostoru vgrajenega tipa:

Z izkoriščanjem vgrajenih prostorov je mogoče upravljati različne različice vmesnika v standardnih knjižnicah.

Možno je ustvariti en nadrejeni prostor in enkapsulirati vsak predstavljen vmesnik.

Vendar pa mora biti v obliki priloge v skupnem nadrejenem prostoru.

Nato se koda stranke samodejno dodeli novi kombinaciji.

Uporabniki, ki so vajeni stare različice, jo lahko brez težav uporabljajo še naprej.

Če želite to narediti, morate ustvariti celotno pot do priloge.

Če želite organizirati prvo obvestilo, morate uporabiti vgrajeni ključ.

Oglejmo si naslednji primer dveh možnosti vmesnika, kjer ima vsaka prostor. Koda odjemalca ima tudi možnost izkoriščanja novih knjižnic.

Za vizualizacijo procesa Preidimo na naslednjo sliko:

Vsa imena morajo biti izjemno unikatna, zato se njihova dolžina močno poveča.

Vendar tukaj ni mogoče uporabiti direktive o uporabi.

Vzdevek je mogoče ustvariti le za imenski prostor.

V tem primeru upoštevajte naslednji primer:

Ustvariti je mogoče tudi navaden prostor, vendar mu ni dodeljen vzdevek.

Tak teritorialni spekter se imenuje anonimen.

Praviloma se uporablja v situacijah, ko morajo biti člani v deklaraciji nevidni za kodiranje v drugih objektih.

Celotna struktura, ko so vsi identifikatorji vidni, pa zunaj ustvarjenega prostora ostanejo nevidni.

Omeniti velja, da bo sam imenski prostor neviden tudi zunaj bloka, zato naj si vsak uporabnik vnaprej zapomni to podrobnost.

Običajno je uporaba znanja potrebna za tiste, ki delajo v Visual C++.

Z uporabo kakovostnih primerov bo veliko lažje razumeti to temo.

Recimo, da želimo deliti naš razred Array, razvit v prejšnjih primerih. Vendar pri tem problemu nismo bili sami; Morda je nekdo nekje, recimo v enem od oddelkov Intela, ustvaril razred z istim imenom. Ker sta imena teh razredov enaka, potencialni uporabniki ne morejo uporabljati obeh razredov hkrati, temveč morajo izbrati enega izmed njih. Ta problem se reši tako, da se imenu razreda doda niz, ki identificira njegove razvijalce, na primer,

Razred Cplusplus_Primer_Third_Edition_Array ( ... );

Seveda tudi to ne zagotavlja edinstvenosti imena, bo pa uporabnika najverjetneje rešilo te težave. Kako neprijetno pa je uporabljati tako dolga imena!
Standard C++ ponuja mehanizem za reševanje problema ujemanja imen, imenovanega imenski prostor. Vsak proizvajalec programske opreme lahko zavije svoje razrede, funkcije in druge objekte v svoj imenski prostor. Na primer, tako izgleda deklaracija našega razreda Array:

Imenski prostor Cplusplus_Primer_3E ( predloga razred Array(...); )

Ključna beseda namespace določa imenski prostor, ki definira vidnost našega razreda, ki se v tem primeru imenuje Cplusplus_Primer_3E. Recimo, da imamo razrede drugih razvijalcev v različnih imenskih prostorih:

Imenski prostor IBM_Canada_Laboratory ( predloga razred Array(...);
Matrika razreda(...);
}
imenski prostor Disney_Feature_Animation (
razred Point(...);
predlogo razred Array(...);
}

Privzeto so v programu vidni objekti, deklarirani brez eksplicitnega imenskega prostora; pripadajo globalno imenski prostor. Če se želite sklicevati na objekt iz drugega prostora, morate uporabiti njegovo kvalificirano ime, ki je sestavljeno iz identifikatorja imenskega prostora in identifikatorja objekta, ločenih z operatorjem ločljivosti obsega (::). Tako izgledajo klici objektov v zgornjih primerih:

Cplusplus_Primer_3E::Array besedilo; IBM_Canada_Laboratory::Matrix mat; Disney_Feature_Animation::Point origin(5000,5000);

Za lažjo uporabo lahko imenskim prostorom dodelite vzdevke. Vzdevek je izbran tako, da je kratek in si ga je lahko zapomniti. Na primer:

// vzdevki imenskega prostora LIB = IBM_Canada_Laboratory; imenski prostor DFA = Disney_Feature_Animation;
int main()
{
LIB::Matrika ia(1024);
}

Vzdevki se uporabljajo tudi za skrivanje uporabe imenskih prostorov. Z zamenjavo vzdevka lahko spremenimo nabor vključenih funkcij in razredov, v vseh drugih pogledih pa bo programska koda ostala enaka. Če popravimo samo eno vrstico v zgornjem primeru, dobimo definicijo popolnoma drugačne matrike:

Imenski prostor LIB = Cplusplus_Primer_3E; int main() (LIB::Array ia(1024); )

Seveda, da bi bilo to mogoče, mora obstajati natančno ujemanje med vmesniki razreda in funkcijami, deklariranimi v teh imenskih prostorih. Predstavljajmo si, da razred Array iz Disney_Feature_Animation nima konstruktorja z enim parametrom - velikostjo. Nato bo naslednja koda vrgla napako:

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

Še bolj priročen način je uporaba preprostega, nekvalificiranega imena za sklicevanje na objekte, definirane v nekem imenskem prostoru. Za to obstaja direktiva o uporabi:
#include "IBM_Canada_Laboratory.h"

Uporaba imenskega prostora IBM_Canada_Laboratory;
int main()
{
Matrix mat (4,4);
// IBM_Canada_Laboratory::Array
Array ia(1024);
// ...
}

Imenski prostor IBM_Canada_Laboratory postane viden v programu. Vidnega lahko ne naredite celotnega prostora, temveč posamezna imena v njem (selektivna uporaba direktive):

#include "IBM_Canada_Laboratory.h" z uporabo imenskega prostora IBM_Canada_Laboratory::Matrix;
// vidna postane samo Matrix
int main()
{
// IBM_Canada_Laboratory::Matrix
Matrix mat (4,4); // Napaka: IBM_Canada_Laboratory::Array je neviden
Array ia(1024);
// ... }

Kot smo že omenili, so vse komponente standardne knjižnice C++ deklarirane znotraj imenskega prostora std. Zato preprosta vključitev datoteke glave ni dovolj za neposredno uporabo standardnih funkcij in razredov:

#vključi // napaka: niz je neviden

Uporabiti morate direktivo using:

#vključi uporaba imenskega prostora std; // V redu: glej niz
string current_chapter = "Pregled C++";

Upoštevajte pa, da se na ta način vrnemo k problemu "zamašitve" globalnega imenskega prostora, za rešitev katerega je bil ustvarjen mehanizem imenovanih prostorov. Zato je bolje uporabiti bodisi kvalificirano ime:

#vključi // pravilno: kvalificirano ime std::string current_chapter = "C++ Pregled"; ali selektivno direktivo z uporabo: #include uporaba imenskega prostora std::string; // V redu: niz viden
string current_chapter = "Pregled C++";

Priporočamo uporabo zadnje metode.
V večini primerov v tej knjigi so bile direktive imenskega prostora izpuščene. To se naredi zaradi zmanjšanja velikosti kode in tudi zato, ker je bila večina primerov prevedenih s prevajalnikom, ki ne podpira imenskih prostorov - zadostuje nedavna inovacija v C++. (Podrobnosti o uporabi deklaracij using pri delu s standardno knjižnico C++ so obravnavane v razdelku 8.6.)
V naslednjih poglavjih bomo ustvarili še štiri razrede: niz, sklad, seznam in modifikacijo sklada. Vsi bodo zaprti v en imenski prostor - Cplusplus_Primer_3E. (O delu z imenskimi prostori podrobneje razpravljamo v 8. poglavju.)

Vaja 2.21

Podan imenski prostor

Namespace Exercise ( predloga razred Array(...);
predlogo
void print(Array< EType >);
razred Niz ( ... )
predlogo
seznam razredov (...);
}

in besedilo programa:

Int main() ( const int size = 1024; Array kot (velikost); Seznam il (velikost);
// ...
Array *pas = nova matrika (kot);
Seznam *pil = nov seznam (il);
natisni (*pas);
}

Program se ne prevaja, ker so deklaracije uporabljenih razredov zaprte v imenskem prostoru Exercise. Spremenite programsko kodo z uporabo
(a) kvalificirana imena
(b) direktiva o selektivni uporabi
(c) mehanizem vzdevkov
(d) uporabo direktive

Opomba: Ta razdelek opisuje uporabo in deklaracijo imenskih prostorov. Podane so glavne značilnosti RDF, XML-Data, Document Content Description (DCD), Schema for Object-Oriented XML (SOX), Document Definition Markup Language (DDML, prej znan kot XSchema).

Prej smo opisali nekaj pomanjkljivosti definicij DTD, povezane so:

  1. sintaksa teh definicij se razlikuje od sintakse XML (natančneje, tako imenovana razširjena Oblika Backus-Naur, razširjen obrazec Backus Naur);
  2. te definicije niso dovolj ekspresivne;
  3. Ker lahko vsak uporabnik ustvari lastne oznake, je zelo verjetno, da bodo ljudje uporabljali ista imena elementov za označevanje različnih stvari. Tudi če so pomeni elementov enaki, se lahko njihova možna vsebina razlikuje glede na definicijo. Torej potrebujemo način za definiranje specifičnih uporab elementa, še posebej, če v istem dokumentu mešamo različne vrste besedišč. Da bi odpravili težavo, je W3C izdal specifikacijo, imenovano XML Namespaces, ki vam omogoča definiranje konteksta elementa v imenskem prostoru.
  4. Obstajajo situacije, ko je treba združiti dokumente XML iz različnih virov, ki ustrezajo različnim definicijam DTD. Takšna situacija na primer nastane pri opisovanju velikega obsega informacij, če posamezni DTD ne zadostujejo za pokritje celotnega obsega ali jih je težko razumeti. Pojavi se tudi v sistemih e-trgovine, ko poskušate združiti podatke vašega poslovnega partnerja z vašimi. Lahko pride tudi do situacije, ko morate preprosto dodati svoje nastavitve v obstoječi DTD, da bi izmenjali nekaj informacij v standardni obliki. Na žalost priporočilo XML ne zagotavlja načina za združevanje več DTD-jev v en sam dokument, ne da bi jih spremenili ali ustvarili nov DTD (z uporabo zunanjih referenc).

To poglavje zajema naslednja dva pojma - imenski prostor in sheme XML. Imenski prostori omogočajo razvijalcem XML, da kompleksen problem razdelijo na majhne dele in združijo več besedišč v enem dokumentu, da ga v celoti opišejo. Z uporabo shem oblikovalci slovarjev ustvarijo natančnejše definicije, kot je bilo mogoče v DTD, in to z uporabo sintakse XML.

Ti dve orodji pomagata rešiti zapletene težave, ki nastanejo pri uporabi XML. Imenski prostori in sheme omogočajo oblikovalcem in programerjem XML, da:

  • Bolje organizirajte besednjake za reševanje kompleksnih problemov;
  • obdrži močno tipkanje podatki med transformacijami v in iz XML;
  • Besednjake opišite bolj natančno in prožno, kot je bilo mogoče z DTD;
  • Preberite pravila slovarja v XML, dostopajte do njegovih definicij brez kompliciranja razčlenjevalnika.

Mešanje slovarjev

Pri oblikovanju slovarja je morda smiselno globalni problem razdeliti na več sestavnih delov. To zahteva načine za segmentacijo velikega problema v več besednjakov. Vendar je resnična težava, ki jo je treba rešiti, združevanje ločenih DTD-jev znotraj telesa enega samega dokumenta. Ta težava se lahko pojavi tudi, če na primer delate v korporaciji, v kateri najverjetneje že obstaja nabor definicij DTD in lahko njihova uporaba zelo olajša delo, saj opisujejo problem tako, kot ga drugi razumejo. Pogosto je koristno tudi ponovno uporabiti definicije DTD, tj. Uporaba običajnih konstruktov iz predhodno ustvarjenih definicij DTD. Če razvijate aplikacijo, ki mora komunicirati s programsko opremo zunanjega partnerja, nimate druge izbire, kot da ponovno uporabite obstoječe koncepte. Obstoječe definicije DTD tvorijo skupni jezik, ki ga je treba govoriti, da bi ga razumeli. Če koncept že obstaja, si je treba prizadevati, da bi bil razumljen v smislu tega koncepta.

Ko uporabljate definicije, ki so vam uporabne iz DTD drugih razvijalcev, ali ko kombinirate segmentirane DTD, da ustvarite dokument, ki opisuje kompleksen problem, če vaši dokumenti uporabljajo elemente z enakimi imeni, tvegate, da boste naleteli na težave z dvoumnost in navzkrižja imen.

Težava se še poslabša pri uporabi primerkov imen iz več DTD-jev. V tem primeru ne vemo na kateri element, katera definicija DTD se nanaša, temu problemu dobro oblikovanih dokumentov rečemo dvoumnost. Še več, če zahtevajo imena iz dokumenta preverjanja veljavnosti, lahko naredimo svojo aplikacijo zelo zmedeno. Ta težava se imenuje trk imen.

Imenski prostori

Imenski prostori lahko uporabniku pomagajo na dva zelo pomembna načina. Z njihovo pomočjo lahko:

  • združite dokumente iz dveh ali več virov, ne da bi izgubili zaupanje, da bo program razločil, iz katerega vira je vzet element ali atribut;
  • Če je mogoče, dovolite uporabniškemu agentu dostop do nadaljnjega gradiva, kot je definicija vrste dokumenta (DTD) ali drug opis elementov in atributov.

Imenski prostor je zbirka določenih vrednosti ali značilnosti, ki se lahko uporabljajo v dokumentih XML kot imena elementov ali atributov. Imenski prostori v XML so definirani z enotnim identifikatorjem virov (URI) (kot URI lahko uporabite naslov DTD na svojem strežniku). Omogoča, da je vsak imenski prostor edinstven.

Če želimo torej učinkovito uporabiti imenske prostore v dokumentu, ki združuje elemente iz različnih virov, moramo definirati:

  • Sklic na URI, ki opisuje uporabo elementa.
  • Vzdevek, ki nam omogoča, da razumemo, iz katerega imenskega prostora prihaja naš element. Ta vzdevek je v obliki predpone elementa (na primer, če je vzdevek za nejasen element knjige katalog , potem bi se element imenoval ).

Uporaba in deklaracija imenskih prostorov

Deklaracija imenskega prostora

Ker je v različnih označevalnih jezikih - implementacijah XML - mogoče najti enaka imena oznak in njihovih atributov, ki imajo popolnoma različne pomene, jih je treba nekako razlikovati. Da bi to naredili, imajo imena oznak in atributov kratko predpono, ki je od imena ločena z dvopičjem. Predpona imena je povezana z identifikatorjem, ki definira imenski prostor. Vsa imena oznak in atributov, katerih predpone so povezane z istim identifikatorjem, tvorijo en sam imenski prostor, v katerem morajo biti imena edinstvena.

Ker želimo, da lahko vsi prepoznajo deklaracijo imenskega prostora, ko jo vidimo, zanjo rezerviramo posebno besedo. Glede na priporočilo imenskih prostorov je beseda xmlns. Vrednost atributa je URI, ki določa imenski prostor za uporabo. To je pogosto URL definicije DTD, vendar ni nujno, da je vedno tako. Predpono in identifikator imenskega prostora definira atribut xmlns na naslednji način:

Kot lahko vidite, je bila predpona ntb pravkar definirana, vendar jo je že mogoče uporabiti v imenu ntb: notebook. V prihodnje bodo imena oznak in atributov, ki jih želimo dodeliti imenskemu prostoru http://some.firm.com/2003/ntbml, opremljena s predpono ntb, na primer:

Gorelovo

Poleg tega se lahko v eni oznaki pojavi več imenskih prostorov. Spodaj je primer mešanja več imenskih prostorov:

Element knjige izhaja iz imenskega prostora kataloga, atribut ISBN pa iz reda.

Ime skupaj s predpono, na primer

imenovano razširjeno, kvalificirano ali kvalificirano ime (OName. Qualified Name). Del imena, ki je zapisan za dvopičjem, se imenuje krajevni del imena.

Nomenklatura imen spletnih virov je lahko zmedena. Enotni iskalnik virov ( Uniform Resource Locator, URL) označuje vir v smislu protokola dostopa in omrežne lokacije. Enotni identifikator vira ( Enotni identifikator vira, URI) je edinstveno ime za neki vir. Na URI glejte preprosto kot na edinstven niz znakov, ki identificira imenski prostor.

V skladu s pravili SGML in XML se lahko dvopičje uporablja v imenih kot navaden znak, zato je ime s predpono le trik; vsak program, ki ne "pozna" imenskega prostora, razčlenjuje dokument, obravnava kvalificirano ime kot običajno ime. Iz tega izhaja zlasti, da v izjava o vrsti dokumenta(Izjava o vrsti dokumenta) predpon imena ni mogoče izpustiti.

Atribut xmlns se lahko pojavi na katerem koli elementu XML, ne samo na korenskem elementu. Predpono, ki jo definira, je mogoče uporabiti v elementu, v katerem je zapisan atribut xmlns, in v vseh elementih, ki so v njem ugnezdeni. Poleg tega je v enem elementu mogoče definirati več imenskih prostorov.

V ugnezdenih elementih lahko imenski prostor preglasite tako, da predpono povežete z drugim identifikatorjem.

Pojav imena oznake brez predpone v dokumentu, ki uporablja imenski prostor, pomeni, da ime pripada privzetemu imenskemu prostoru.

Dobro oblikovan dokument mora uporabljati imenske prostore za vse svoje elemente.

Predpone, ki se začnejo z znaki xml, so v vsakem primeru rezervirane za sam jezik XML. Predpona xmlns se uporablja za povezovanje druge, definirane predpone z identifikatorjem imenskega prostora. Predpone xmlns ni treba definirati, uvedena je s priporočilom »Imenski prostori v XML« in je tam povezana z identifikatorjem imenskega prostora http://www.w3.ori/2000 /xmlns/.

Druga predpona, xml, je v istem priporočilu povezana z identifikatorjem http://www.w3.org/XML/1998/namespace. Prav tako ga ni treba definirati v dokumentu XML. S temi identifikatorji ni mogoče povezati nobene druge predpone. Save navodi, da ostanejo presledki nedotaknjeni. To je pomembno za nekatera besedila, kot so programske kode. Privzeta vrednost pušča presledke po presoji upravljavca.

Obseg

Deklaracije imenskega prostora imajo obseg, tako kot deklaracije spremenljivk v programskih jezikih. To je pomembno, ker imenski prostori niso vedno deklarirani na začetku dokumenta XML; včasih so deklarirani v naslednjih razdelkih. Deklaracija imenskega prostora velja za element, v katerem se pojavi, kot tudi za potomce tega elementa, tudi če tam ni izrecno definiran. Ime se lahko nanaša na imenski prostor le, če je uporabljeno znotraj obsega njegove deklaracije.

Vendar pa bomo morali tudi zmešati obsege imenskega prostora na elementih, ki bi sicer podedovali druge imenske prostore. V zvezi s tem sta opredeljena dva načina deklaracije obsega: privzeti in kvalificirani.

Privzeti obseg

Kot bi lahko pričakovali, postane predpona vsakega imena v dokumentu hitro dolgočasna. Pravzaprav lahko z uvedbo koncepta obsega imena v naš dokument pomešamo veliko število predpon. Če definiramo privzeti imenski prostor, se domneva, da ima v lasti vsa nekvalificirana imena v obsegu svoje deklaracije. Tako se privzeti imenski prostor, deklariran v korenskem elementu, šteje za privzetega za celoten dokument in ga je mogoče preglasiti samo z bolj specifičnim imenskim prostorom, deklariranim v dokumentu.

Če želite, da imenski prostor postane privzeti imenski prostor za obseg, preprosto izpustite deklaracijo predpone.

Če je predpona deklarirana in nato uporabljena v povezavi z imenom, se reče, da je imenski prostor eksplicitno vzpostavljen. Če želite imenskemu prostoru dodeliti nekvalificirano ime, morate deklarirati privzeti prostor, ki vključuje nekvalificirano ime (brez predpone).

Kvalificirano področje uporabe

Zgornja metoda deluje dobro, če lahko jasno ločite svoje imenske prostore. Toda včasih je treba v dokument vključiti posamezna imena iz zunanjih imenskih prostorov. Namesto da deklarirate imenske prostore za celoten obseg, lahko uporabite kvalificirana imena. Imenske prostore, ki jih potrebujete, deklarirajte na začetku dokumenta in jih nato kvalificirajte na točki uporabe.

Bo pomagal.
Pot do podpore za imenski prostor v PHP je bila težavna. Toda na srečo je bil dodan jeziku v PHP 5.3 in struktura kode PHP se je od takrat bistveno izboljšala. Toda kako natančno naj jih uporabimo?

Kaj so imenski prostori?

"Ne pozabite na poševnico nazaj, ko shranjujete ime imenskega prostora kot niz!"

Imenski prostor si predstavljajte kot škatlo, v katero lahko postavite karkoli: svinčnik, ravnilo, kos papirja itd. To so tvoje stvari. Tik pod vašo škatlo je škatla nekoga drugega in njen lastnik hrani iste stvari v njej. Da bi se izognili uporabi predmetov drug drugega, se odločite, da boste škatle označili tako, da bo jasno, kaj komu pripada.

Prej so morali razvijalci uporabljati podčrtane predpone v svojih razredih, funkcijah in konstantah za ločevanje kode. To je enakovredno temu, da vsak označi svoje stvari in jih shrani v eno veliko škatlo. Seveda je to vsaj nekakšna organizacija, vendar je zelo neučinkovita.

Imenski prostori, pomoč! Lahko deklarirate isto funkcijo, razred, vmesnik in definirate konstanto v ločenih imenskih prostorih, ne da bi dobili usodne napake. Imenski prostori v svojem bistvu niso nič drugega kot hierarhično označeni bloki kode, ki vsebujejo navadno kodo PHP.

Uporabljate jih!

Pomembno je razumeti, da imenske prostore uporabljate posredno; Od PHP 5.3 vse definicije, ki še niso deklarirane v uporabniško določenih imenskih prostorih, spadajo pod globalni imenski prostor.

Globalni imenski prostor shranjuje tudi vse notranje definicije PHP-ja, kot sta mysqli_connect() in razred Exception. Ker globalni imenski prostor nima enoličnega identifikacijskega imena, ga najpogosteje imenujemo globalni imenski prostor.

Upoštevajte, da uporaba imenskega prostora ni obvezna.
Vaš skript PHP bo dobro deloval brez njih in to vedenje se ne bo kmalu spremenilo.

Definicija imenskega prostora

Datoteka, ki vsebuje imenski prostor, mora vsebovati svojo deklaracijo na začetku pred katero koli drugo kodo. Edina stvar, ki jo je mogoče deklarirati pred imenskim prostorom, je rezervirana beseda declare , izraz declare se lahko pojavi pred deklaracijo imenskega prostora, da nakaže kodiranje datoteke.

Imenski prostori so deklarirani z uporabo rezervirane besede namespace. Imenski prostori sledijo istim pravilom kot drugi identifikatorji v PHP. Imenski prostor bi torej moral začnejo se s črko ali podčrtajem, ki mu sledi poljubno število črk, številk ali podčrtajev.

Če želite definirati blok kode v globalnem prostoru, lahko uporabite ključno besedo namespace brez dodajanja imena.

V eni datoteki lahko uporabite več imenskih prostorov.

Isti imenski prostor lahko uporabite tudi za več različnih datotek; postopek povezovanja datotek jih bo samodejno združil. Dobra praksa kodiranja je, da omejite število definicij imenskega prostora na eno datoteko, tako kot bi lahko storili z razredi.

Imenski prostori se uporabljajo za preprečevanje nedoslednih definicij in v programsko kodo vnesejo več prilagodljivosti in organizacije.

Upoštevajte, da so zaviti oklepaji popolnoma neobvezni. Pravzaprav je uporaba pravila enega imenskega prostora na datoteko in izpuščanje zavitih oklepajev naredila vašo kodo veliko čistejšo - ni potrebe po zamiku ugnezdene kode.

Podimenski prostori

Imenski prostori lahko sledijo določeni hierarhiji, tako kot imeniki v datotečnem sistemu v računalniku. Podimenski prostori so izjemno uporabni za organizacijo strukture projekta. Na primer, če vaš projekt zahteva dostop do baze podatkov, lahko postavite kodo za obravnavo izjem baze podatkov in kodo za obravnavo povezave v podimenski prostor imenske baze podatkov.

Zaradi prilagodljivosti je pametno shraniti ugnezdene imenske prostore v podimenike. To pomaga strukturirati projekt in olajša uporabo samodejnih nalagalnikov, ki sledijo standardu PSR-4.

PHP uporablja poševnico nazaj kot ločilo imenskega prostora.

Zanimivost: v RFC je bila za odločitev, kateri ločilnik imenskega prostora uporabiti, upoštevana možnost uporabe emotikona.

// myproject/database/connection.phpUporabite lahko poljubno število ugnezdenih imenskih prostorov.

Definiranje podimenskega prostora z ugnezdenimi bloki kode ni podprto. Naslednji primer bo vrnil usodno napako: "Deklaracij imenskega prostora ni mogoče ugnezditi."

Klicna koda iz imenskega prostora

Če želite ustvariti nov primerek predmeta, poklicati funkcijo ali uporabiti konstante iz različnih imenskih prostorov, uporabite poševnico nazaj. Obstajajo tri vrste definicij imen imenskega prostora:
  • Nekvalificirano ime
  • Kvalificirano ime
  • Popolnoma kvalificirano ime

Nepopolno ime

To je ime razreda, funkcije ali konstante in ne vključuje sklicevanja na noben imenski prostor. Za tiste, ki šele začenjajo delati z imenskimi prostori, je to običajno stališče.

Polno ime

Tako dostopamo do hierarhije podimenskega prostora; ločeni s poševnico nazaj.

Spodnji primer bo vrnil usodno napako: »Usodna napaka: Razred »MyProject\Database\MyProject\FileAccess\Input« ni bil najden«, ker MyProject\FileAccess\Input ni pomemben za imenski prostor, v katerem ste.

Absolutno ime

Polna in delna imena se uporabljajo glede na imenski prostor, v katerem se trenutno nahajate. Uporabljajo se lahko le za definiranje dostopa na tej ravni ali za poglobitev v hierarhijo imenskega prostora.

Če želite dostopati do funkcije, razreda ali konstante, ki je na višji ravni hierarhije, potem morate uporabiti polno ime – absolutno pot, ne relativno. Klic se mora začeti s poševnico nazaj. S tem PHP ve, da mora biti ta klic opravljen iz globalnega prostora, namesto da bi do njega dostopal glede na vašo trenutno lokacijo.

Za notranje funkcije PHP nam ni treba uporabiti polnega imena. Nekvalificirana imena za funkcije in konstante bodo definirana v globalnem imenskem prostoru, če niso definirana v trenutnem imenskem prostoru.

Ker vemo to, lahko zdaj preobremenimo notranje funkcije PHP, medtem ko še vedno lahko kličemo izvirno funkcijo (ali konstanto).

"; }

Dinamični klici

PHP je dinamičen programski jezik; tako da lahko to funkcijo uporabite za klic kode iz imenskega prostora. To je v bistvu enako kot uporaba dinamičnega imena razreda ali povezovanje dinamične datoteke z uporabo spremenljivke za shranjevanje njenega imena. Ločilo imen PHP uporablja iste metaznake v nizih. Ne pozabite na poševnico nazaj, ko shranjujete ime imenskega prostora kot niz!

ključna beseda imenskega prostora

Ključna beseda imenskega prostora se ne uporablja samo za definiranje imenskega prostora, lahko se uporablja tudi za klicanje trenutnega imenskega prostora, funkcionalno podobno ključni besedi self za razrede.

__NAMESPACE__ konstanta

Tako kot ključne besede self ni mogoče uporabiti za definiranje imena trenutnega razreda, ključne besede namespace ni mogoče uporabiti za trenutni imenski prostor. Zato uporabljamo konstanto __NAMESPACE__

Ta konstanta je precej uporabna, ko se začnete učiti imenskega prostora; zelo uporaben je tudi za odpravljanje napak. Ker gre za niz, ga je mogoče uporabiti v povezavi s klici dinamične kode, o katerih smo govorili zgoraj.

Uvozite ali ustvarite vzdevek imena

ni treba uporabljati v imenskih prostorih

Pomembna značilnost imenskih prostorov v PHP je možnost sklicevanja na zunanje absolutno ime z psevdonim, oz uvažanje.

Uvozi so zelo uporaben in temeljni vidik imenskih prostorov. To vam daje možnost uporabe zunanjih paketov, kot so knjižnice, brez skrbi glede navzkrižja imen. Uvoz se izvede s ključno besedo use. Če želite, lahko določite vzdevek po meri s ključno besedo as.

Uporabite kot

Kako ga uporabljati

Absolutno ime je mogoče povezati s krajšim nekvalificiranim imenom, tako da vam ni treba pisati njegovega absolutnega imena vsakič, ko ga želite uporabiti. Ustvarjanje ali uvoz vzdevka se mora zgoditi v nadrejenem imenskem prostoru ali globalnem. Poskus, da to storite znotraj metode ali funkcije, je neveljavna sintaksa.

Druga možnost je dodelitev vzdevka z drugim imenom

Uvozite lahko tudi globalne razrede, kot je Exception. Pri uvozu vam ni treba napisati njegovega absolutnega imena.

Upoštevajte, da za imena v imenskem prostoru poševnica nazaj ni potrebna in njena prisotnost tam ni priporočljiva, saj morajo biti uvožena imena absolutna in niso razčlenjena glede na trenutni imenski prostor.

Čeprav obstaja podpora za priklic dinamičnega imenskega prostora, dinamični uvoz ni podprt.

Zaključek

Imenski prostori se uporabljajo za izogibanje konfliktom definicij in v programsko kodo vnesejo več prilagodljivosti in organizacije. Ne pozabite, da vam ni treba uporabljati imenskih prostorov; Ta funkcija se uporablja v kombinaciji z objektno usmerjenim pristopom. Upam, da boste razmislili o tem, da bi svoj (prihodnji) projekt PHP dvignili na višjo raven z uporabo imenskega prostora.