Пространство от имена (програмиране)

Пространство от имена(англ. namespace ) е набор, което означава модел, абстрактно хранилище или среда, създадена за логическо групиране на уникални идентификатори (т.е. имена).

Идентификатор, дефиниран в пространство от имена, е свързан с това пространство от имена. Един и същи идентификатор може да бъде дефиниран независимо в множество пространства. По този начин стойност, свързана с идентификатор, дефиниран в едно пространство от имена, може или не може да има същата стойност като същия идентификатор, дефиниран в друго пространство от имена. Езиците, които познават пространството от имена, дефинират правила, които показват към кое пространство от имена принадлежи идентификаторът (т.е. неговата дефиниция).

Например, Андрей работи във фирма X, а >Identifier - идентификатор) ​​на него като служител е 123. Олег работи във фирма Y и неговият ID също е 123. Единственото нещо (от гледна точка на определена счетоводна система), поради което Андрей и Олег могат да бъдат разграничени със съвпадащи идентификатори, е принадлежността им към различни компании. Разликата между компаниите в този случай е система от различни пространства от имена (една компания - едно пространство). Наличието на двама служители в компания с един и същи идентификатор създава големи проблеми при използването им, например ще бъде много трудно да се определи служителят, за когото е предназначена тази проверка, от заплата, която ще посочи служител с ID 123.

В големите бази данни може да има стотици или хиляди идентификатори. Пространствата от имена (или подобни структури) осигуряват механизъм за скриване на локални идентификатори. Тяхното значение е да групират логически свързани идентификатори в съответните им пространства от имена, като по този начин правят систематамодулен. Ограничаването на видимостта на променливите може да се извърши и чрез указване на класа на тяхното съхранение.

Операционни системи, много съвременни езици за програмиране поддържат собствен модел на пространство от имена: те използват директории (или папки) като модел на пространство от имена. Това позволява да съществуват два файла с едно и също име (стига да са в различни директории). В някои езици за програмиране (напр. C++, Python) идентификаторите на имена на пространства сами по себе си се свързват със съответните интервали. Следователно в тези езици пространствата от имена могат да се влагат едно в друго, образувайки дърво от пространства от имена. Коренът на такова дърво се наричаглобално пространство от имена.

Съдържание

В езиците за програмиране един от начините за указване на границата на пространството от имена може да бъде използването на т.нар.Обхвати.

Пространството от имена се определя от блок от инструкции:

В рамките на този блок идентификаторите могат да бъдат извикани точно както са били декларирани. Но извън блока, името на пространството от имена трябва да бъде посочено преди идентификатора. Например, извън пространството на имената foo, лентата с идентификатор трябва да бъде посочена като foo::bar. C++ съдържа някои други конструкции, които правят тези изисквания незадължителни. Така че, когато добавяте линия

в кода префиксът foo:: вече не се изисква. Друг пример:

Кодът, който не е изрично деклариран в пространството от имена, се предполага, че е деклариран в глобалното пространство от имена.

Резолюцията на пространството от имена в C++ е йерархична. Това означава, че в хипотетичното пространство от имена food::soup , идентификаторът chicken би бил food::soup::chicken (ако пространството от имена съществува). Ако не съществува, тогава сочи към food::chicken (ако това пространство съществува). Акои това пространство не съществува, тогава пилето се отнася до идентификатор в глобалното пространство.

Пространствата от имена често се използват в C++, за да се избегнат сблъсъци на имена.

Не можете да получите достъп до член на анонимно пространство от имена от една единица за превод от друга единица.

Въпреки че пространствата от имена се използват широко в съвременния код, голяма част от по-стария код няма тези функции. Например, цялата стандартна библиотека на C++ е дефинирана в пространството от имена std, но преди стандартизацията много компоненти първоначално са били дефинирани в глобалното пространство.

Можете също така да направите видимо не цялото пространство, а отделни имена в него, например:

Идеята за пространства от имена е въплътена в Java пакети. Целият код е дефиниран в пакет и пакетът не се нуждае от изрично име. Кодът от други пакети е достъпен чрез префикс на името на пакета със съответния идентификатор, например класът String в пакета java.lang може да бъде извикан като java.lang.String (това е известно като пълно квалифицирано име на клас). Както в C++, Java предоставя конструкция, която прави указването на името на пакета ( import ) незадължително. Въпреки това, някои функции (като отражение) изискват от програмиста да използва напълно квалифицираното име.

За разлика от C++, пространствата от имена на Java не са йерархично подредени поради синтаксиса на самия език. Пакетите обаче са именувани в йерархичен стил. Например, всички пакети, започващи с java, са част от платформата Java - пакетът java.lang съдържа базовите класове на езика, а java.lang.reflect съдържа базовите класове, специфични за отражението.

Зона на видимост

Функцията и класът могат да бъдат определени като имплицитно пространство от имена, трудносвързани с видимостта, наличността и живота на даден обект.

В езика C# има пространства от имена, използването е подобно на C++.

В Python идеята за пространства от имена е реализирана в модули. (Същото като в Java пакетите)

Въпреки липсата на официална поддръжка за пространства от имена, те са лесни за имплементиране с помощта на обектната концепция на езика:

В XML спецификацията на пространствата от имена на XML дефинира уникалността на имената на елементите и атрибутите в документ, подобно на ролята на пространствата от имена в езика за програмиране. С пространства от имена XML документите могат да съдържат имена на елементи или атрибути от повече от един XML речник.

xmlns (XML Namespace) - XML ​​пространство от имена. Включени са RDF (за създаване на RDF документ), FOAF и RDF схема (формат за RDF дизайн).

FOAF също е пространството на RDF документ, така че неговият дизайн се проверява според речника (правила, спецификации) на RDF.

От версия 5.3.0 PHP въведе концепцията за пространство от имена.

Важен момент. Директивата за пространство от имена трябва да бъде първият ред от код във файла. Изключение е ключовата дума declare, която може да предхожда директивата за пространство от имена. Дори HTML изход преди първата конструкция " [1] не е разрешен.

Common Lisp

Стандартният синтаксис на Common Lisp има пространства от имена на таблици, реализирани чрез пакетната система [2] . За да използвате идентификатор (символ), трябва да посочите пълното му име: име на пакета, двоеточие и името на самия символ [3] .

Allegro Common Lisp реализира нестандартно Common Lisp разширение - йерархични пространства от имена, в които пакетите са разделени с точка в стил Java, а идентификаторът от пакетите е разделен с двоеточие. Възможно е също така да се обърнете към съседни възли вйерархии на пространството от имена чрез указване на относителни пътища през две точки [4] . Пространствата от имена в Common Lisp са динамични – те се създават, попълват и унищожават по време на изпълнение на програмата [източник?], въпреки че преобладаващо се използва декларативната форма за тяхното описание с помощта на формата defpackage [5].

В PureBasic 5.20 беше въведена поддръжка на пространство от имена, реализирана като модули. Пространството от имена се дефинира от блока Module и EndModule от команди и не зависи от местоположението в изходните файлове. Това означава, че в един файл може да има няколко модула или обратното - кодът на модула може да бъде разделен на няколко файла. По подразбиране цялото пространство на модула е скрито и за да станат видими отделните му елементи, те трябва да бъдат декларирани в специален блок от команди DeclareModule / EndDeclareModule. Всичко, което не е декларирано в този блок, не е достъпно извън модула и опитът за достъп ще доведе до съобщение за нарушение на достъпа от компилатора.

За достъп до модулни елементи от друг модул или глобално пространство, трябва да посочите името на модула и неговия елемент, например: Count::x. Можете също да използвате командата UseModule, която ви позволява да показвате всички видими модулни елементи в текущото пространство. Действието му се отменя от командата UnuseModule. Трябва да се отбележи, че е възможно да се показват видимите елементи на няколко модула едновременно, при условие че няма конфликт на имена. Да кажем, че проектът има модули с имена x, y и z.

Този пример показва, че е възможно да се съпоставят няколко модула в текущото пространство и че редът, в който елементите на модула се показват и отменят, не е важен.

В езиците за програмиране без собствена поддръжка за пространства от имена, пространствата от имена могатемулирани от разширение, използващо конвенции за именуване на идентификатори. Например C библиотеки като Libpng често използват фиксиран префикс за всички функции и променливи като част от своя преден край. Libpng поддържа външни идентификатори като:

png_create_write_struct png_get_signature png_read_row png_set_invalid

Това дава разумна гаранция, че идентификаторите ще бъдат уникални и по този начин могат да се използват в големи програми без страх от сблъсъци на имена на идентификатори.

Недостатъците на емулацията на пространство от имена включват [източникът не е посочен 1973 дни] :

  • Липса на нормално отчитане на вложените пространства; идентификаторите стават твърде дълги.
  • Програмисти или организации могат да използват изключително непоследователни конвенции за именуване, което потенциално причинява много объркване.
  • Сложните операции или операциите за заявки върху групи от идентификатори въз основа на пространствата от имена, в които са декларирани, се обработват твърде неоптимално или изобщо не се обработват.
  • Всички извиквания към идентификатори трябва действително да се правят с пълното име на интервали (англ.) български. . Езиците с директна поддръжка за пространства от имена обикновено позволяват на програмиста да декларира предварително, че иска да използва някои (или всички) от идентификаторите в програмата само от едно пространство, което след това може да използва, без да посочва членството в пространството.