Про́стір назв, також про́стір іме́н або іменни́й про́стір[] (англ. namespace) — концепція у програмуванні, призначена для розмежування різних множин ідентифікаторів і уникнення конфліктів між їхніми назвами.
Ідентифікатор, зосереджений у просторі імен, асоціюється з цим простором. Один і той самий ідентифікатор може бути незалежно визначений у декількох просторах. Значення, пов'язане з ідентифікатором, який знаходиться в одному просторі імен, може мати (чи не мати) таке ж саме значення, як і той самий ідентифікатор, визначений у іншому просторі. Мови з підтримкою просторів імен визначають правила, завдяки яким, можна визначити до якого простору імен належить ідентифікатор (тобто його значення).
Приклад: Андрій працює в компанії X, а ID. Він має ідентифікатор працівника, який дорівнює 123. Олег працює в компанії Y, а його ID так само дорівнює 123. Значення в обох єдине (з точки зору якоїсь системи обліку), завдяки чому Андрія та Олега можна розрізнити при співпадаючих ID, це характеризує їх приналежність до різних підприємств. Різниця компаній, у цьому випадку, являє собою систему різних просторів імен (одна компанія - один простір). Наявність двох працівників у компанії з однаковими ID створює значні проблеми при їх використанні, наприклад, по платіжному чеку, в якому буде вказано працівник з ID 123, буде досить важко визначити працівника, якому цей чек призначається.
У великих базах даних можуть існувати сотні та тисячі ідентифікаторів. Простори назв (або схожі структури) реалізують механізм для приховування локальних ідентифікаторів. Угрупування логічно пов'язаних ідентифікаторів, у відповідних просторах імен, створює модульну систему. Обмеження видимості змінних може також проводитися шляхом завдання класу її пам'яті .
Операційні системи, а також більшість серед сучасних мов програмування, забезпечують підтримку власної моделі просторів імен: використовують каталоги, (або папки) як модель простору імен. Це дозволяє існувати двом файлам з однаковим ім'ям (за умови, що вони знаходяться в різних каталогах). У деяких мовах програмування (наприклад, , Python) ідентифікатори імен просторів самі асоціюються з необхідними просторами. У таких мовах простір імен може вкладатися один до одного, формуючи дерево просторів імен. Корінь такого дерева отримує назву глобального простору імен.
Використання у мовах
Java-пакети втілюють ідею просторів імен. Увесь код, зосереджений усередині пакету, який не потребує явно заданого ім'я. Код з інших пакетів доступний при префіксному посиланню на ім'я пакету перед відповідним ідентифікатором, наприклад, клас String в пакеті java.lang може бути викликаний як java.lang.
String
(даний спосіб відомий як повне ім'я класу ). Як і в C ++, Java пропонує конструкцію, що робить необов'язковим вказівку ім'я пакета ( import
). У той самий час, деякі особливості (як, наприклад, відображення ) вимагають від програміста використання повного імені.
На відміну від C ++, простір імен у Java не є ієрархічно впорядкованим через синтаксис мови. Проте, пакети іменуються в ієрархічному стилі. Наприклад, усі пакети, які починаються з java
, є частиною платформи Java - пакет java.lang,
що містить базові класи мови, у той самий час у java.lang.reflect [Архівовано 31 січня 2019 у Wayback Machine.] містяться базові класи, специфічні для відображення (рефлексії).
У мові Java (так само, як і в Ада , C # та інших мовах) простори імен / пакети відображають семантичні категорії коду. Як приклад, у C # namespace System
містить код, що реалізується системою (платформа . NET). Як саме визначаються ці категорії і наскільки глибока ієрархія - залежить від самої мови.
Функція і клас можуть бути визначені, як неявний простір імен, складно пов'язані з видимістю, доступністю і періодом життя об'єкта .
У мові C # існують простори імен, які вживаються аналогічно C ++.
В Python кожен ідентифікатор може знаходитись в локальному або глобальному просторі назв, або всередині певного об'єкта (модуля, або будь-якого іншого). Функція locals()
повертає словник (асоціативний масив) з ідентифікаторами локального простору назв, globals()
— глобального. Функція dir()
покаже список ідентифікаторів доступних з поточного фрейму, якщо викликана без параметрів, і список ідентифікаторів всередині об'єкта, якщо викликана з якимось об'єктом.
Змінна оголошена всередині іншої функції потрапляє в локальний простір назв, якщо перед цим не задекларувати її глобальною використавши ключове слово global
.
У Python ідея просторів імен реалізована у модулях. (Так само, як і у пакетах Java)
[en] всі ідентифікатори знаходяться в глобальному просторі назв, тому часті випадки існування двох різних об'єктів з однаковими назвами, що призводить до помилок. Щоб цьому запобігти глобальний простір назв ділять на менші. Наприклад стандартну бібліотеку винесено в область названу std.
Простір імен визначається блоком інструкцій, а саме:
namespace foo { int bar; }
Усередині цього блоку ідентифікатори можуть викликатися у той спосіб, яким вони були оголошені. Важливо, що поза блоком потрібна вказівка назви простору імен перед ідентифікатором. Наприклад, поза namespace foo
ідентифікатор bar
має вказуватися, як foo::bar
. У мові C ++ містяться деякі інші конструкції, які роблять подібні вимоги необов'язковими. Так, при додаванні рядка:
using namespace foo;
Більше не потрібно вказується префікс foo::
у код, . Ще один приклад:
namespace Namespace12 { int foo=0; } void func1() { using namespace Namespace12; // тепер всі імена з простору імен Namespace12 буде видно тут без додаткових префіксів ++foo; } void func2() { // а тут ім'я потрібно уточнити: Namespace12::foo = 42; }
Код, який не оголошено явно у просторі імен, за замовчуванням, вважається оголошеним у глобальному просторі імен.
Дозвіл просторів імен в C ++ прописується ієрархічно. Це означає, що у гіпотетичному просторі назв їжа::бульйон
, ідентифікатор курка
буде позначати їжа::бульйон::курка
(якщо простір існує). У випадку, якщо не існує, то тоді він перепосилається на їжа::курка
(такий простір існує). Якщо ж і цей простір не існуючий-то: курка
посилається на ідентифікатор у глобальному просторі.
Зазвичай, простір імен у C ++ використовується для уникнення випадків колізій імен
namespace { int a; void f() { /*...*/ } int g() { /*...*/ } }
Неможливо здійснити доступ з однієї одиниці трансляції до частини анонімного простору імен до іншої одиниці.
Хоча простір імен активно використовуються у сучасному коді, значна частина старого коду не має подібних можливостей. Наприклад, уся визначена всередині namespace std
, але до стандартизації багато компонентів спочатку були визначені у глобальному просторі.
Також можна зробити відкритим до перегляду не весь простір, а окремі імена всередині нього, наприклад:
namespace foo { int bar; int somelse; } int main () { using foo::bar; //Робить видимим тільки bar, somelse невидимий! return 0; }
Створення просторів назв
Щоб створити простір назв використовують ключове слово namespace
. Код:
namespace <назва_простору> { // Оголошення }
Доступ до ідентифікаторів з просторів назв
Щоб отримати доступ до об'єктів з простору назв з за його меж використовують оператор дозволу області видимості ( :: ). Наприклад:
namespace some { int something; } something=1; // Помилка, something невидиме. some::something=1; // Ми вказали в якій області його шукати.
Правда такий спосіб може бути незручним, якщо ми використовуємо багато ідентифікаторів не з нашої області видимості. Щоб полегшити нам життя придумана директива using. Хай ми маємо простір кімнати:
namespace room { Wall wall1, wall2, wall3, wall4; Ceil ceil; }
Можна внести стелю в наш простір назв, написавши, що ми її будемо використовувати:
using room::ceil; ceil = 42; // Тепер стеля видима wall1 = wall2; // А таке все ще викличе помилку!
А можна взагалі розкрити увесь простір назв:
using room; wall1 = wall2 = wall3; // Всі ідентифікатори з кімнати доступні
Мова надає можливість для реалізації просторів імен, незважаючи на відсутність формальної підтримки, використовуючи об'єктну концепцію мови:
var NameSpace_1 = {}; var NameSpace_2 = new Object(); //Створюються два простори імен NameSpace_1.a = 100; NameSpace_2.a = "Суниця"; //Змінні a - у кожного свої with(NameSpace_1) //Вказуємо простір імен за замовчуванням { a += 10; NameSpace_2.a += a; //Змінна a простору імен NameSpace_2 дорівнюватиме "Суниця110" }
XML
У XML специфікація просторів XML імен визначає унікальність імен елементів і атрибутів у документі, аналогічно ролям просторів імен у мовах програмування. За допомогою просторів імен XML-документи можуть містити імена елементів або атрибутів з більш ніж одного словника XML.
<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 Namespace) - простір імен XML. Підключаються RDF (для створення документа RDF ), FOAF і RDF Schema ( формат оформлення RDF ).
FOAF — це теж простір RDF документа, тому перевіряється його оформлення згідно зі словником (правилами, специфікації) RDF.
Починаючи з версії 5.3.0 у PHP введено поняття простору імен.
<?php namespace my\name; // визначимо новий простір імен class MyClass {} function myfunction() {} const MYCONST = 1; $a = new MyClass; // виклик всередині простору my\name $c = new \my\name\MyClass; // використовуємо повне ім'я, яке включає назву простору імен $d = new \globalClass; // звернення до класу з глобального простору імен ?>
Важливо те, що директива namespace повинна бути першим рядком коду у файлі. Виняток є ключове слово declare, яке може передувати директиві namespace. Не допускається, навіть, виведення HTML перед першою конструкцією «<?php».
Опис є на офіційному сайті проекту PHP.
У стандартному синтаксисі Common Lisp є табличні простори імен, які реалізуються через систему пакетів. Необхідно вказати назву ідентифікатора (символу) для використання, а саме: повну назву (назва пакету, двокрапка та назва самого символу).
У Allegro Common Lisp реалізовано нестандартне розширення Common Lisp - ієрархічний простір імен, де пакети розділяються використанням крапки, у стилі Java , а ідентифікатор від пакетів відокремлюється двокрапкою. Також, можливі звернення до суміжних вузлів в ієрархії просторів імен через посилання до відносних шляхів, використовуючи двокрапку. Простори імен у Common Lisp є динамічними - вони створюються, наповнюються і знищуються під час виконання програми, хоча здебільшого застосовується декларативна форма їх опису за допомогою форми defpackage
.
PureBasic
У PureBasic 5.20 , була введена підтримка простору імен, реалізована у вигляді модулів. Простір імен визначається блоком команд Module і EndModule і не залежить від розташування у первинних файлах. Це означає, що в одному файлі, можуть існувати декілька модулів, чи навпаки - код модуля може бути розділений на декілька файлів. За замовчуванням, увесь простір модуля приховано, для того щоб зробити видимим окремі його елементи, їх необхідно оголосити у спеціальному блоці команд DeclareModule / EndDeclareModule. Усе, що не оголошено у цьому блоці, не можливо переглянути поза межами модуля, і спроба доступу приведе до повідомлення компілятора про порушення прав доступу.
DeclareModule Count x=0 ; Public elements Declare Counter() EndDeclareModule Module Count y=0 ; Private elements Procedure Counter() y+1 ProcedureReturn y EndProcedure EndModule Count::x = 10 ; Запис числа у змінну (для прикладу). Debug Count::Counter() ; Виклик процедури, що використовує ім'я модуля. UseModule Count ; Відображення модуля у дійсний простір. Debug Counter() ; Відкритий доступ (Public) до елементів без вказівок на ім'я модуля. UnuseModule Count ; Скасування дії UseModule.
Для отримання доступу елементів модуля з іншого модуля або глобального простору, необхідно вказати ім'я модуля і його елемент. Наприклад: Count :: x. Також, можна використати команду UseModule, яка дозволяє відобразити всі видимі елементи модуля до поточного простору. Команда UnuseModule скасовує цю дію. Одночасне відображення видимих елементів декількох модулів можливе, за умови попереджання проблеми конфлікту імен. Припустимо, що у проекті є модулі з іменами x, y і z.
UseModule x UseModule y ; Код. UseModule z ; Ще код. UnuseModule y ; Ще код. UnuseModule x UnuseModule z
Цей приклад відображає можливість відображання у поточний простір декількох модулів, а також особливість, що не важлива послідовність відображення елементів модулів і його скасування.
Мови програмування без власної підтримки просторів імен простору можуть емулюватися розширенням, використовуючи угоди про найменування ідентифікаторів Прикладом цього є, бібліотеки мови С, такі як Libpng, часто використовують фіксований префікс для всіх функцій і змінних, що є частиною їх зовнішнього інтерфейсу. Libpng підтримує зовнішні ідентифікатори, такі як:
- png_create_write_struct
- png_get_signature
- png_read_row
- png_set_invalid
Це надає обґрунтовану гарантію, що ідентифікатори будуть унікальні і, таким чином, можуть бути використані у великих програмах без побоювання колізії імен ідентифікаторів .
Далі перераховані недоліки емуляції просторів імен [ ]
- Відсутній нормально функціонуючий облік вкладених просторів; ідентифікатори подовжуються занадто.
- Програмісти/організації можуть використати різко несумісні угоди про найменування, тим самим потенційно провокуючи велику заплутаність.
- Складні операції чи операції запиту над групами ідентифікаторів, заснованих на просторі імен, де вони оголошені, обробляються занадто неоптимально, інколи, взагалі нездійсненні.
- Усі виклики ідентифікаторів повинні здійснюватися з повним ім'ям просторів
Мови з безпосередньою підтримкою просторів імен, зазвичай, надають програмісту можливість попередньо оголошувати, що він хоче використовувати деякі (а то і всі разом) ідентифікатори у програмі тільки з одного простору, які вони згодом можуть використовувати без вказівки належності до простору.
Деякі особливості просторів назв
Можна робити простори назв без назви. Це просто для того, щоб зробити локальні змінні невидимими поза областю. Крім того можна описувати кілька просторів назв з одною назвою. Тоді це буде один, і той же простір, просто рознесений в різні частини файлу, чи взагалі в різні файли.
Неназваний простір назв або простір назв визначений прямо чи непрямо в неназваному просторі назв3 має внутрішнє зв'язування (англ. internal linkage).
Див. також
Примітки
- Дудзяний, І. М. (2006). (PDF). Львів: Видавничий центр ЛНУ імені Івана Франка. с. 9, 20. Архів оригіналу (PDF) за 2 квітня 2018. Процитовано 1 квітня 2018.
- Сопронюк, Т. М. (2007). (PDF). Чернівці: ЧНУ. с. 55—56. Архів оригіналу (PDF) за 2 квітня 2018. Процитовано 1 квітня 2018.
- Парфьонов, Ю. Є.; Федорченко, В. М.; Лосєв, М. Ю.; Щербаков, О. В. (2010). (PDF). Харків: Вид. ХНЕУ. с. 13—14. Архів оригіналу (PDF) за 10 січня 2017. Процитовано 4 липня 2022.
- Фурник, Р. В.; Ромадін, Р. В. (2011). (PDF). Черкаси. с. 19—20, 25. Архів оригіналу (PDF) за 23 січня 2022. Процитовано 24 березня 2022.
- Литвин, В. В. (2010). Пасічник, В. В. (ред.). Технології менеджменту знань. Консолідована інформація. Львів: Видавництво Львівської політехніки. с. 189, 216. ISBN .
- Парфьонов, Ю. Є.; Федорченко, В. М.; Лосєв, М. Ю.; Щербаков, О. В. (2010). (PDF). Харків: Вид. ХНЕУ. с. 98—101, 156, 197, 243, 261, 298, 305. Архів оригіналу (PDF) за 10 січня 2017. Процитовано 4 липня 2022.
- Грицюк, Юрій; Рак, Тарас (2011). УІБ/Грицюк Ю.І/C++.pdf Програмування мовою C++ (PDF). Львів: Вид-во ЛДУ БЖД. с. 36. ISBN .[недоступне посилання з липня 2019]
- . Архів оригіналу за 8 грудня 2017. Процитовано 7 грудня 2017.
- . Архів оригіналу за 8 грудня 2017. Процитовано 7 грудня 2017.
- . Архів оригіналу за 8 грудня 2017. Процитовано 7 грудня 2017.
- . Архів оригіналу за 8 грудня 2017. Процитовано 7 грудня 2017.
- . Архів оригіналу за 31 січня 2019. Процитовано 30 січня 2019.
- (англ.). www.cs.northwestern.edu. Архів оригіналу за 24 грудня 2018. Процитовано 23 грудня 2018.
- . lispmethods.com. Архів оригіналу за 16 березня 2019. Процитовано 23 грудня 2018.
- (англ.). franz.com. Архів оригіналу за 24 грудня 2018. Процитовано 10 червня 2017.
- . www.lispworks.com. Архів оригіналу за 1 лютого 2019. Процитовано 10 червня 2017.
- ISO/IEC 14882:2011, 3.5 Program and linkage.
Посилання
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Pro stir nazv takozh pro stir ime n abo imenni j pro stir dzherelo angl namespace koncepciya u programuvanni priznachena dlya rozmezhuvannya riznih mnozhin identifikatoriv i uniknennya konfliktiv mizh yihnimi nazvami Identifikator zoseredzhenij u prostori imen asociyuyetsya z cim prostorom Odin i toj samij identifikator mozhe buti nezalezhno viznachenij u dekilkoh prostorah Znachennya pov yazane z identifikatorom yakij znahoditsya v odnomu prostori imen mozhe mati chi ne mati take zh same znachennya yak i toj samij identifikator viznachenij u inshomu prostori Movi z pidtrimkoyu prostoriv imen viznachayut pravila zavdyaki yakim mozhna viznachiti do yakogo prostoru imen nalezhit identifikator tobto jogo znachennya Priklad Andrij pracyuye v kompaniyi X a ID Vin maye identifikator pracivnika yakij dorivnyuye 123 Oleg pracyuye v kompaniyi Y a jogo ID tak samo dorivnyuye 123 Znachennya v oboh yedine z tochki zoru yakoyis sistemi obliku zavdyaki chomu Andriya ta Olega mozhna rozrizniti pri spivpadayuchih ID ce harakterizuye yih prinalezhnist do riznih pidpriyemstv Riznicya kompanij u comu vipadku yavlyaye soboyu sistemu riznih prostoriv imen odna kompaniya odin prostir Nayavnist dvoh pracivnikiv u kompaniyi z odnakovimi ID stvoryuye znachni problemi pri yih vikoristanni napriklad po platizhnomu cheku v yakomu bude vkazano pracivnik z ID 123 bude dosit vazhko viznachiti pracivnika yakomu cej chek priznachayetsya U velikih bazah danih mozhut isnuvati sotni ta tisyachi identifikatoriv Prostori nazv abo shozhi strukturi realizuyut mehanizm dlya prihovuvannya lokalnih identifikatoriv Ugrupuvannya logichno pov yazanih identifikatoriv u vidpovidnih prostorah imen stvoryuye modulnu sistemu Obmezhennya vidimosti zminnih mozhe takozh provoditisya shlyahom zavdannya klasu yiyi pam yati Operacijni sistemi a takozh bilshist sered suchasnih mov programuvannya zabezpechuyut pidtrimku vlasnoyi modeli prostoriv imen vikoristovuyut katalogi abo papki yak model prostoru imen Ce dozvolyaye isnuvati dvom fajlam z odnakovim im yam za umovi sho voni znahodyatsya v riznih katalogah U deyakih movah programuvannya napriklad C Python identifikatori imen prostoriv sami asociyuyutsya z neobhidnimi prostorami U takih movah prostir imen mozhe vkladatisya odin do odnogo formuyuchi derevo prostoriv imen Korin takogo dereva otrimuye nazvu globalnogo prostoru imen Vikoristannya u movahJava Java paketi vtilyuyut ideyu prostoriv imen Uves kod zoseredzhenij useredini paketu yakij ne potrebuye yavno zadanogo im ya Kod z inshih paketiv dostupnij pri prefiksnomu posilannyu na im ya paketu pered vidpovidnim identifikatorom napriklad klas String v paketi java lang mozhe buti viklikanij yak java lang String danij sposib vidomij yak povne im ya klasu Yak i v C Java proponuye konstrukciyu sho robit neobov yazkovim vkazivku im ya paketa import U toj samij chas deyaki osoblivosti yak napriklad vidobrazhennya vimagayut vid programista vikoristannya povnogo imeni Na vidminu vid C prostir imen u Java ne ye iyerarhichno vporyadkovanim cherez sintaksis movi Prote paketi imenuyutsya v iyerarhichnomu stili Napriklad usi paketi yaki pochinayutsya z java ye chastinoyu platformi Java paket java lang sho mistit bazovi klasi movi u toj samij chas u java lang reflect Arhivovano 31 sichnya 2019 u Wayback Machine mistyatsya bazovi klasi specifichni dlya vidobrazhennya refleksiyi U movi Java tak samo yak i v Ada C ta inshih movah prostori imen paketi vidobrazhayut semantichni kategoriyi kodu Yak priklad u C namespace System mistit kod sho realizuyetsya sistemoyu platforma NET Yak same viznachayutsya ci kategoriyi i naskilki gliboka iyerarhiya zalezhit vid samoyi movi Oblast vidimosti Funkciya i klas mozhut buti viznacheni yak neyavnij prostir imen skladno pov yazani z vidimistyu dostupnistyu i periodom zhittya ob yekta C U movi C isnuyut prostori imen yaki vzhivayutsya analogichno C Python V Python kozhen identifikator mozhe znahoditis v lokalnomu abo globalnomu prostori nazv abo vseredini pevnogo ob yekta modulya abo bud yakogo inshogo Funkciya locals povertaye slovnik asociativnij masiv z identifikatorami lokalnogo prostoru nazv globals globalnogo Funkciya dir pokazhe spisok identifikatoriv dostupnih z potochnogo frejmu yaksho viklikana bez parametriv i spisok identifikatoriv vseredini ob yekta yaksho viklikana z yakimos ob yektom Zminna ogoloshena vseredini inshoyi funkciyi potraplyaye v lokalnij prostir nazv yaksho pered cim ne zadeklaruvati yiyi globalnoyu vikoristavshi klyuchove slovo global U Python ideya prostoriv imen realizovana u modulyah Tak samo yak i u paketah Java C en vsi identifikatori znahodyatsya v globalnomu prostori nazv tomu chasti vipadki isnuvannya dvoh riznih ob yektiv z odnakovimi nazvami sho prizvodit do pomilok Shob comu zapobigti globalnij prostir nazv dilyat na menshi Napriklad standartnu biblioteku C vineseno v oblast nazvanu std Prostir imen viznachayetsya blokom instrukcij a same namespace foo int bar Useredini cogo bloku identifikatori mozhut viklikatisya u toj sposib yakim voni buli ogolosheni Vazhlivo sho poza blokom potribna vkazivka nazvi prostoru imen pered identifikatorom Napriklad poza namespace foo identifikator bar maye vkazuvatisya yak foo bar U movi C mistyatsya deyaki inshi konstrukciyi yaki roblyat podibni vimogi neobov yazkovimi Tak pri dodavanni ryadka using namespace foo Bilshe ne potribno vkazuyetsya prefiks foo u kod She odin priklad namespace Namespace12 int foo 0 void func1 using namespace Namespace12 teper vsi imena z prostoru imen Namespace12 bude vidno tut bez dodatkovih prefiksiv foo void func2 a tut im ya potribno utochniti Namespace12 foo 42 Kod yakij ne ogolosheno yavno u prostori imen za zamovchuvannyam vvazhayetsya ogoloshenim u globalnomu prostori imen Dozvil prostoriv imen v C propisuyetsya iyerarhichno Ce oznachaye sho u gipotetichnomu prostori nazv yizha buljon identifikator kurka bude poznachati yizha buljon kurka yaksho prostir isnuye U vipadku yaksho ne isnuye to todi vin pereposilayetsya na yizha kurka takij prostir isnuye Yaksho zh i cej prostir ne isnuyuchij to kurka posilayetsya na identifikator u globalnomu prostori Zazvichaj prostir imen u C vikoristovuyetsya dlya uniknennya vipadkiv kolizij imennamespace int a void f int g Nemozhlivo zdijsniti dostup z odniyeyi odinici translyaciyi do chastini anonimnogo prostoru imen do inshoyi odinici Hocha prostir imen aktivno vikoristovuyutsya u suchasnomu kodi znachna chastina starogo kodu ne maye podibnih mozhlivostej Napriklad usya standartna biblioteka movi C viznachena vseredini namespace std ale do standartizaciyi bagato komponentiv spochatku buli viznacheni u globalnomu prostori Takozh mozhna zrobiti vidkritim do pereglyadu ne ves prostir a okremi imena vseredini nogo napriklad namespace foo int bar int somelse int main using foo bar Robit vidimim tilki bar somelse nevidimij return 0 Stvorennya prostoriv nazv Shob stvoriti prostir nazv vikoristovuyut klyuchove slovo namespace Kod namespace lt nazva prostoru gt Ogoloshennya Dostup do identifikatoriv z prostoriv nazv Shob otrimati dostup do ob yektiv z prostoru nazv z za jogo mezh vikoristovuyut operator dozvolu oblasti vidimosti Napriklad namespace some int something something 1 Pomilka something nevidime some something 1 Mi vkazali v yakij oblasti jogo shukati Pravda takij sposib mozhe buti nezruchnim yaksho mi vikoristovuyemo bagato identifikatoriv ne z nashoyi oblasti vidimosti Shob polegshiti nam zhittya pridumana direktiva using Haj mi mayemo prostir kimnati namespace room Wall wall1 wall2 wall3 wall4 Ceil ceil Mozhna vnesti stelyu v nash prostir nazv napisavshi sho mi yiyi budemo vikoristovuvati using room ceil ceil 42 Teper stelya vidima wall1 wall2 A take vse she vikliche pomilku A mozhna vzagali rozkriti uves prostir nazv using room wall1 wall2 wall3 Vsi identifikatori z kimnati dostupni JavaScript Mova nadaye mozhlivist dlya realizaciyi prostoriv imen nezvazhayuchi na vidsutnist formalnoyi pidtrimki vikoristovuyuchi ob yektnu koncepciyu movi var NameSpace 1 var NameSpace 2 new Object Stvoryuyutsya dva prostori imen NameSpace 1 a 100 NameSpace 2 a Sunicya Zminni a u kozhnogo svoyi with NameSpace 1 Vkazuyemo prostir imen za zamovchuvannyam a 10 NameSpace 2 a a Zminna a prostoru imen NameSpace 2 dorivnyuvatime Sunicya110 XML U XML specifikaciya prostoriv XML imen viznachaye unikalnist imen elementiv i atributiv u dokumenti analogichno rolyam prostoriv imen u movah programuvannya Za dopomogoyu prostoriv imen XML dokumenti mozhut mistiti imena elementiv abo atributiv z bilsh nizh odnogo slovnika XML lt 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 gt lt foaf Person rdf about JW gt xmlns XML Namespace prostir imen XML Pidklyuchayutsya RDF dlya stvorennya dokumenta RDF FOAF i RDF Schema format oformlennya RDF FOAF ce tezh prostir RDF dokumenta tomu pereviryayetsya jogo oformlennya zgidno zi slovnikom pravilami specifikaciyi RDF PHP Pochinayuchi z versiyi 5 3 0 u PHP vvedeno ponyattya prostoru imen lt php namespace my name viznachimo novij prostir imen class MyClass function myfunction const MYCONST 1 a new MyClass viklik vseredini prostoru my name c new my name MyClass vikoristovuyemo povne im ya yake vklyuchaye nazvu prostoru imen d new globalClass zvernennya do klasu z globalnogo prostoru imen gt Vazhlivo te sho direktiva namespace povinna buti pershim ryadkom kodu u fajli Vinyatok ye klyuchove slovo declare yake mozhe pereduvati direktivi namespace Ne dopuskayetsya navit vivedennya HTML pered pershoyu konstrukciyeyu lt php Opis ye na oficijnomu sajti proektu PHP Common Lisp U standartnomu sintaksisi Common Lisp ye tablichni prostori imen yaki realizuyutsya cherez sistemu paketiv Neobhidno vkazati nazvu identifikatora simvolu dlya vikoristannya a same povnu nazvu nazva paketu dvokrapka ta nazva samogo simvolu U Allegro Common Lisp realizovano nestandartne rozshirennya Common Lisp iyerarhichnij prostir imen de paketi rozdilyayutsya vikoristannyam krapki u stili Java a identifikator vid paketiv vidokremlyuyetsya dvokrapkoyu Takozh mozhlivi zvernennya do sumizhnih vuzliv v iyerarhiyi prostoriv imen cherez posilannya do vidnosnih shlyahiv vikoristovuyuchi dvokrapku Prostori imen u Common Lisp ye dinamichnimi voni stvoryuyutsya napovnyuyutsya i znishuyutsya pid chas vikonannya programi hocha zdebilshogo zastosovuyetsya deklarativna forma yih opisu za dopomogoyu formi defpackage PureBasic U PureBasic 5 20 bula vvedena pidtrimka prostoru imen realizovana u viglyadi moduliv Prostir imen viznachayetsya blokom komand Module i EndModule i ne zalezhit vid roztashuvannya u pervinnih fajlah Ce oznachaye sho v odnomu fajli mozhut isnuvati dekilka moduliv chi navpaki kod modulya mozhe buti rozdilenij na dekilka fajliv Za zamovchuvannyam uves prostir modulya prihovano dlya togo shob zrobiti vidimim okremi jogo elementi yih neobhidno ogolositi u specialnomu bloci komand DeclareModule EndDeclareModule Use sho ne ogolosheno u comu bloci ne mozhlivo pereglyanuti poza mezhami modulya i sproba dostupu privede do povidomlennya kompilyatora pro porushennya prav dostupu DeclareModule Count x 0 Public elements Declare Counter EndDeclareModule Module Count y 0 Private elements Procedure Counter y 1 ProcedureReturn y EndProcedure EndModule Count x 10 Zapis chisla u zminnu dlya prikladu Debug Count Counter Viklik proceduri sho vikoristovuye im ya modulya UseModule Count Vidobrazhennya modulya u dijsnij prostir Debug Counter Vidkritij dostup Public do elementiv bez vkazivok na im ya modulya UnuseModule Count Skasuvannya diyi UseModule Dlya otrimannya dostupu elementiv modulya z inshogo modulya abo globalnogo prostoru neobhidno vkazati im ya modulya i jogo element Napriklad Count x Takozh mozhna vikoristati komandu UseModule yaka dozvolyaye vidobraziti vsi vidimi elementi modulya do potochnogo prostoru Komanda UnuseModule skasovuye cyu diyu Odnochasne vidobrazhennya vidimih elementiv dekilkoh moduliv mozhlive za umovi poperedzhannya problemi konfliktu imen Pripustimo sho u proekti ye moduli z imenami x y i z UseModule x UseModule y Kod UseModule z She kod UnuseModule y She kod UnuseModule x UnuseModule z Cej priklad vidobrazhaye mozhlivist vidobrazhannya u potochnij prostir dekilkoh moduliv a takozh osoblivist sho ne vazhliva poslidovnist vidobrazhennya elementiv moduliv i jogo skasuvannya Movi programuvannya bez vlasnoyi pidtrimki prostoriv imen prostoru mozhut emulyuvatisya rozshirennyam vikoristovuyuchi ugodi pro najmenuvannya identifikatoriv Prikladom cogo ye biblioteki movi S taki yak Libpng chasto vikoristovuyut fiksovanij prefiks dlya vsih funkcij i zminnih sho ye chastinoyu yih zovnishnogo interfejsu Libpng pidtrimuye zovnishni identifikatori taki yak png create write struct png get signature png read row png set invalid Ce nadaye obgruntovanu garantiyu sho identifikatori budut unikalni i takim chinom mozhut buti vikoristani u velikih programah bez poboyuvannya koliziyi imen identifikatoriv Dali pererahovani nedoliki emulyaciyi prostoriv imen dzherelo ne vkazano 1910 dniv Vidsutnij normalno funkcionuyuchij oblik vkladenih prostoriv identifikatori podovzhuyutsya zanadto Programisti organizaciyi mozhut vikoristati rizko nesumisni ugodi pro najmenuvannya tim samim potencijno provokuyuchi veliku zaplutanist Skladni operaciyi chi operaciyi zapitu nad grupami identifikatoriv zasnovanih na prostori imen de voni ogolosheni obroblyayutsya zanadto neoptimalno inkoli vzagali nezdijsnenni Usi vikliki identifikatoriv povinni zdijsnyuvatisya z povnim im yam prostoriv Movi z bezposerednoyu pidtrimkoyu prostoriv imen zazvichaj nadayut programistu mozhlivist poperedno ogoloshuvati sho vin hoche vikoristovuvati deyaki a to i vsi razom identifikatori u programi tilki z odnogo prostoru yaki voni zgodom mozhut vikoristovuvati bez vkazivki nalezhnosti do prostoru Deyaki osoblivosti prostoriv nazv Mozhna robiti prostori nazv bez nazvi Ce prosto dlya togo shob zrobiti lokalni zminni nevidimimi poza oblastyu Krim togo mozhna opisuvati kilka prostoriv nazv z odnoyu nazvoyu Todi ce bude odin i toj zhe prostir prosto roznesenij v rizni chastini fajlu chi vzagali v rizni fajli Nenazvanij prostir nazv abo prostir nazv viznachenij pryamo chi nepryamo v nenazvanomu prostori nazv3 maye vnutrishnye zv yazuvannya angl internal linkage Div takozhDovidka Prostir nazvPrimitkiDudzyanij I M 2006 PDF Lviv Vidavnichij centr LNU imeni Ivana Franka s 9 20 Arhiv originalu PDF za 2 kvitnya 2018 Procitovano 1 kvitnya 2018 Sopronyuk T M 2007 PDF Chernivci ChNU s 55 56 Arhiv originalu PDF za 2 kvitnya 2018 Procitovano 1 kvitnya 2018 Parfonov Yu Ye Fedorchenko V M Losyev M Yu Sherbakov O V 2010 PDF Harkiv Vid HNEU s 13 14 Arhiv originalu PDF za 10 sichnya 2017 Procitovano 4 lipnya 2022 Furnik R V Romadin R V 2011 PDF Cherkasi s 19 20 25 Arhiv originalu PDF za 23 sichnya 2022 Procitovano 24 bereznya 2022 Litvin V V 2010 Pasichnik V V red Tehnologiyi menedzhmentu znan Konsolidovana informaciya Lviv Vidavnictvo Lvivskoyi politehniki s 189 216 ISBN 978 966 553 975 9 Parfonov Yu Ye Fedorchenko V M Losyev M Yu Sherbakov O V 2010 PDF Harkiv Vid HNEU s 98 101 156 197 243 261 298 305 Arhiv originalu PDF za 10 sichnya 2017 Procitovano 4 lipnya 2022 Gricyuk Yurij Rak Taras 2011 UIB Gricyuk Yu I C pdf Programuvannya movoyu C PDF Lviv Vid vo LDU BZhD s 36 ISBN 978 966 3466 85 9 nedostupne posilannya z lipnya 2019 Arhiv originalu za 8 grudnya 2017 Procitovano 7 grudnya 2017 Arhiv originalu za 8 grudnya 2017 Procitovano 7 grudnya 2017 Arhiv originalu za 8 grudnya 2017 Procitovano 7 grudnya 2017 Arhiv originalu za 8 grudnya 2017 Procitovano 7 grudnya 2017 Arhiv originalu za 31 sichnya 2019 Procitovano 30 sichnya 2019 angl www cs northwestern edu Arhiv originalu za 24 grudnya 2018 Procitovano 23 grudnya 2018 lispmethods com Arhiv originalu za 16 bereznya 2019 Procitovano 23 grudnya 2018 angl franz com Arhiv originalu za 24 grudnya 2018 Procitovano 10 chervnya 2017 www lispworks com Arhiv originalu za 1 lyutogo 2019 Procitovano 10 chervnya 2017 ISO IEC 14882 2011 3 5 Program and linkage PosilannyaCe nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi