Nimiavaruus ( eng. namespace ) - jokin joukko , joka tarkoittaa mallia, abstraktia tallennustilaa tai ympäristöä, joka on luotu yksilöllisten tunnisteiden (eli nimien) loogiseen ryhmittelyyn .
Nimiavaruudessa määritetty tunniste liitetään kyseiseen nimiavaruuteen . Sama tunniste voidaan määrittää itsenäisesti useaan tilaan. Näin ollen yhdessä nimiavaruudessa määritettyyn tunnisteeseen liittyvällä arvolla voi olla sama arvo kuin toisessa nimiavaruudessa määritetyllä tunnisteella. Nimitilatietoiset kielet määrittelevät säännöt , jotka osoittavat, mihin nimiavaruuteen tunniste kuuluu (eli sen määritelmä).
Esimerkiksi Andrey työskentelee yrityksessä X, ja hänen henkilöllisyystodistuksensa (lyhennetty sanasta Englanti Identifier - identifier) työntekijänä on 123. Oleg työskentelee yrityksessä Y, ja hänen henkilöllisyystodistuksensa on myös 123. tietyn kirjanpitojärjestelmän näkökulmasta), minkä ansiosta Andrey ja Oleg voidaan erottaa vastaavista tunnuksista, on heidän kuulumisensa eri yrityksiin. Yritysten välinen ero tässä tapauksessa on erilaisten nimiavaruuksien järjestelmä (yksi yritys - yksi tila). Kahden työntekijän läsnäolo yrityksessä samalla henkilöllisyydellä aiheuttaa suuria ongelmia heidän käytössään, esimerkiksi 123-tunnuksen omaavaa työntekijää osoittavasta palkasta on erittäin vaikea määrittää työntekijää, jolle sekki on tarkoitettu.
Suurissa tietokannoissa voi olla satoja tai tuhansia tunnisteita. Nimiavaruudet (tai vastaavat rakenteet ) tarjoavat mekanismin paikallisten tunnisteiden piilottamiseen. Niiden tarkoitus on ryhmitellä loogisesti toisiinsa liittyvät tunnisteet vastaaviin nimiavaruuksiin, jolloin järjestelmästä tulee modulaarinen . Muuttujien näkyvyyden rajoittaminen voidaan tehdä myös määrittämällä sen tallennusluokka .
Käyttöjärjestelmät , monet nykyaikaiset ohjelmointikielet tukevat omaa nimitilamalliaan: ne käyttävät hakemistoja (tai kansioita) nimitilan mallina. Tämä sallii kahden samannimisen tiedoston olemassaolon (kunhan ne ovat eri hakemistoissa). Joissakin ohjelmointikielissä (esim. C++ , Python ) tilanimien tunnisteet liitetään itse vastaaviin välilyönteihin. Siksi näissä kielissä nimiavaruudet voivat pesiytyä toistensa sisällä muodostaen nimiavaruuksien puun . Tällaisen puun juuria kutsutaan globaaliksi nimiavaruudeksi .
Ohjelmointikielissä yksi tapa määrittää nimiavaruuden raja voi olla ns. soveltamisala .
Nimiavaruus määritellään komentolohkolla:
nimiavaruus foo { int bar ; }Tässä lohkossa tunnisteita voidaan kutsua täsmälleen sellaisina kuin ne on ilmoitettu. Mutta lohkon ulkopuolella nimitilan nimi on määritettävä ennen tunnistetta. Esimerkiksi namespace footunnisteen ulkopuolella bartulisi määrittää muodossa foo::bar. C++ sisältää joitain muita rakenteita, jotka tekevät näistä vaatimuksista valinnaisia. Joten riviä lisättäessä
käyttäen nimiavaruutta foo ;koodia, sinun foo::ei enää tarvitse määrittää etuliitettä. Toinen esimerkki:
nimiavaruus Nimiavaruus12 { int foo = 0 ; } tyhjä toiminto1 () { käyttäen nimiavaruutta Nimiavaruus12 ; // nyt kaikki nimiavaruuden nimiavaruuden12 nimet näkyvät täällä ilman lisäetuliitteitä ++ foo ; } tyhjä toiminto2 () { // ja tässä on määritettävä nimi: Nimiavaruus12 :: foo = 42 ; }Koodin, jota ei ole nimenomaisesti ilmoitettu nimiavaruudessa, oletetaan olevan ilmoitettu globaalissa nimiavaruudessa.
Nimitilan tarkkuus C++:ssa on hierarkkinen. Tämä tarkoittaa, että hypoteettisessa nimiavaruudessa еда::супtunniste курицаtarkoittaa еда::суп::курица(jos tila on olemassa). Jos sitä ei ole olemassa, se osoittaa еда::курица(jos tämä tila on olemassa). Jos tätä tilaa ei myöskään ole, se курицаviittaa globaalissa avaruudessa olevaan tunnisteeseen.
Nimiavaruuksia käytetään usein C++:ssa nimien törmäysten välttämiseksi.
nimiavaruus { int a ; void f () { /*...*/ } int g () { /*...*/ } }Et voi käyttää anonyymin nimitilan jäsentä yhdestä käännösyksiköstä toisesta yksiköstä.
Vaikka nimiavaruuksia käytetään laajasti nykyaikaisessa koodissa, useimmissa vanhemmissa koodeissa ei ole näitä ominaisuuksia. Esimerkiksi koko C++-standardikirjasto on määritetty sisällä namespace std, mutta ennen standardointia monet komponentit määriteltiin alun perin globaalissa avaruudessa.
Voit myös tehdä näkyväksi koko tilan sijasta yksittäisiä nimiä siinä, esimerkiksi:
nimiavaruus foo { int bar ; int somelse ; } int main () { käyttäen foo :: bar ; //Tekee vain palkin näkyväksi, jostain näkymättömäksi! paluu 0 ; }Nimiavaruuksien idea sisältyy Java-paketteihin . Kaikki koodi määritellään paketin sisällä, eikä paketti tarvitse nimenomaista nimeä. Muiden pakettien koodi on saatavilla lisäämällä paketin nimen eteen vastaava tunniste, esimerkiksi Stringpaketissa olevaa luokkaa java.langvoidaan kutsua nimellä java.lang.String(tämä tunnetaan täydellisenä luokan nimenä ). Kuten C++:ssa, Java tarjoaa rakenteen, joka tekee paketin nimen ( import) määrittämisestä valinnaista. Jotkut ominaisuudet (kuten heijastus ) edellyttävät kuitenkin, että ohjelmoija käyttää täydellistä nimeä.
Toisin kuin C++, Java-nimiavaruudet eivät ole hierarkkisessa järjestyksessä kielen syntaksin vuoksi. Paketit on kuitenkin nimetty hierarkkisesti. Esimerkiksi kaikki paketit, jotka alkavat javaovat osa Java-alustaa - paketti java.langsisältää kielen perusluokat ja java.lang.reflectsisältää heijastukselle (heijastukselle) ominaiset perusluokat.
Javassa (samoin kuin Adassa , C# :ssa ja muissa kielissä) nimitilat/paketit heijastavat koodin semanttisia luokkia. Esimerkiksi C# namespace Systemsisältää koodin, jonka järjestelmä toteuttaa ( .NET -alusta ). Se, kuinka tarkasti nämä luokat määritellään ja kuinka syvä hierarkia on, riippuu kielestä itsestään.
LaajuusFunktio ja luokka voidaan määritellä implisiittiseksi nimiavaruudeksi, joka liittyy monimutkaisesti objektin näkyvyyteen, saavutettavuuteen ja käyttöikään .
C#-kielessä on nimiavaruuksia, käyttö on samanlaista kuin C++.
Pythonissa nimiavaruuksien idea toteutetaan moduuleissa. (Sama kuin Java-paketeissa)
Huolimatta nimiavaruuksien muodollisen tuen puutteesta, ne on helppo toteuttaa käyttämällä kielen objektikäsitettä:
var Nimiavaruus_1 = {}; var Nimiavaruus_2 = uusi objekti (); //kaksi nimiavaruutta Nimiavaruus_1 . a = 100_ _ Nimiavaruus_2 . a = "Mansikka" ; // Muuttujat a - jokaisella on omansa with ( NameSpace_1 ) // Määritä oletusnimiavaruus { a += 10 ; Nimiavaruus_2 . a += a ; //Muuttuja a nimiavaruus NameSpace_2 on yhtä suuri kuin "Strawberry110" }XML : ssä XML-nimiavaruuksien määrittely määrittelee elementtien ja attribuuttien nimien ainutlaatuisuuden dokumentissa, samalla tavalla kuin nimiavaruuksien rooli ohjelmointikielessä. Nimiavaruuksia käytettäessä XML-dokumentit voivat sisältää elementtien tai attribuuttien nimiä useammasta kuin yhdestä XML-sanakirjasta.
<rdf:RDF xmlns:rdf= "http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:foaf= "http://xmlns.com/foaf/0.1/" xmlns:rdfs= "http://www.w3.org/2000/01/rdf-schema#" > <foaf:Person rdf:about= "#JW" > …xmlns (XML-nimiavaruus) - XML-nimiavaruus. Mukana ovat RDF (RDF-asiakirjan luomiseksi ) , FOAF ja RDF Schema ( RDF - suunnittelumuoto ).
FOAF on myös RDF -dokumentin tila, joten sen suunnittelu tarkistetaan RDF :n sanaston (säännöt, spesifikaatiot ) mukaan .
Versiosta 5.3.0 lähtien PHP otti käyttöön nimitilan käsitteen.
<?php namespace my\name ; // määritä uusi nimiavaruus luokka Omaluokka {} funktio myfunction () {} const MYCONST = 1 ; $a = uusi MyClass ; // kutsu oma\nimiavaruudessa $c = uusi \oma\nimi\Oma luokka ; // käytä koko nimeä, mukaan lukien nimitilan nimi $d = new \globalClass ; // luokan kutsuminen globaalista nimiavaruudesta ?>Tärkeä pointti. Nimiavaruusdirektiivin on oltava tiedoston ensimmäinen koodirivi. Poikkeuksena on deklarointiavainsana, joka voi edeltää nimiavaruusdirektiiviä. Edes HTML-tulostus ennen ensimmäistä "<?php"-rakennetta ei ole sallittu.
Syntaksikuvaus on PHP-projektin virallisella verkkosivustolla [1] .
Tavallisessa Common Lisp -syntaksissa on taulukoiden nimiavaruudet, jotka on toteutettu pakettijärjestelmän kautta [2] . Tunnisteen (symbolin) käyttämiseksi sinun on määritettävä sen koko nimi: paketin nimi, kaksoispiste ja itse symbolin nimi [3] .
Allegro Common Lisp toteuttaa standardista poikkeavan Common Lisp -laajennuksen - hierarkkiset nimitilat, joissa paketit erotetaan Java -tyylillä pisteellä ja pakettien tunniste erotetaan kaksoispisteellä. On myös mahdollista viitata vierekkäisiin solmuihin nimiavaruushierarkiassa määrittämällä suhteelliset polut kahden pisteen kautta [4] . Common Lispin nimitilat ovat dynaamisia - niitä luodaan, täytetään ja tuhotaan ohjelman suorittamisen aikana. , vaikka niiden kuvauksessa käytetään pääosin deklaratiivista muotoa defpackage[5] .
PureBasic 5.20 :ssa otettiin käyttöön nimitilan tuki, joka toteutettiin moduuleina. Nimiavaruuden määrittävät Module- ja EndModule-komentolohkot, eikä se riipu lähdetiedostojen sijainnista. Tämä tarkoittaa, että yhdessä tiedostossa voi olla useita moduuleja tai päinvastoin - moduulikoodi voidaan jakaa useisiin tiedostoihin. Oletuksena koko moduulitila on piilotettu, ja jotta sen yksittäiset elementit tulisi näkyviin, ne on ilmoitettava erityisessä komentolohkossa DeclareModule / EndDeclareModule. Mikään, mitä ei ole ilmoitettu tässä lohkossa, ei ole saatavilla moduulin ulkopuolella, ja pääsyn yrittäminen johtaa pääsyn rikkomusviestiin kääntäjältä.
DeclareModule Count x = 0 ; Julkiset elementit Declare Counter () EndDeclareModule Moduulien määrä y = 0_ _ Yksityiset elementit Vastamenettely () y + 1 menettely palautus y lopetusmenettely EndModule Count: : x = 10 ; Numeron kirjoittaminen muuttujaan (esimerkiksi). Debug Count :: Laskuri () ; Proseduurin kutsuminen moduulin nimellä. UseModule Count ; Moduulin yhdistäminen nykyiseen tilaan. Virheenkorjauslaskuri ( ) ; Pääsy julkisiin (julkisiin) elementteihin määrittelemättä moduulin nimeä. UnuseModule Count ; Peruuta UseModule-toiminto.Jos haluat käyttää moduulielementtejä toisesta moduulista tai globaalista tilasta, sinun on määritettävä moduulin nimi ja sen elementti, esimerkiksi: Count::x. Voit myös käyttää UseModule-komentoa, jonka avulla voit näyttää kaikki nykyisen tilan näkyvät moduulielementit. Sen toiminta peruutetaan UnuseModule-komennolla. On huomattava, että useiden moduulien näkyvät elementit voidaan näyttää samanaikaisesti, mikäli nimiristiriitaa ei ole. Oletetaan, että projektissa on moduuleja, joiden nimet ovat x, y ja z.
UseModule x UseModule y ; Koodi. Käytä moduulia z ; Lisää koodia. UnuseModule y ; Lisää koodia. UnuseModule x UnuseModule zTämä esimerkki osoittaa, että on mahdollista kartoittaa useita moduuleja nykyiseen tilaan ja että moduulielementtien näyttö- ja peruutusjärjestys ei ole tärkeä.
Ohjelmointikielissä, joissa ei ole natiivitukea nimiavaruuksille, välilyöntejä voidaan emuloida laajennuksella käyttämällä tunnisteiden nimeämiskäytäntöjä . Esimerkiksi C - kirjastot , kuten Libpng , käyttävät usein kiinteää etuliitettä kaikille funktioille ja muuttujille osana käyttöliittymäään. Libpng tukee ulkoisia tunnisteita, kuten:
png_create_write_struct png_get_signature png_read_row png_set_invalidTämä antaa kohtuullisen takuun siitä, että tunnisteet ovat yksilöllisiä ja siten niitä voidaan käyttää suurissa ohjelmissa ilman pelkoa tunnisteiden nimien törmäyksistä .
Nimiavaruuden emuloinnin haittoja ovat mm :