Именски простор (информатика)

Именски простор је апстрактни контејнер или окружење израђено да садржи логично груписање јединствених идентификатора или симбола (тј. имена). Идентификатор дефинисан у именском простору је асоциран са тим именским простором. Исти идентификатор може бити независно дефинисан у више именских простора. То јест значење асоцирано са идентификатором дефинисано у једном именском простору може и не мора имати исто значење као исти идентификатор дефинисан у неком другом именском простору. Језици који подржавају именске просторе одређују правила која утврђују којем именском простору идентификатор (тј. не његова дефиниција) припада.

На пример, Пера ради за фирму Х и његов Р број је 123. Мика ради за фирму У и његовог Р број је такође 123. Пера и Мика могу имати исти Р број зато што они раде за различите фирме. Различите фиирме би у овом случају симболизовале различите именске просторе. Дошло би до озбиљне забуне ако би две особе радиле за исту фирму, а и даље имале исти Р број. На пример, чек са платом издат запосленом број Р123 не би идентификовао који човек треба да прими чек.

У великим компјутерским програмима или документима није неуобичајено да постоји стотине или хиљаде идентификатора. Именски простори (или слична техника, нпр. емулирани именски простори), обезбеђују механизам за скривање локалних идентификатора. Они обезбеђују средства за груписање логички повезаних идентификатора у одговарајуће именске просторе, тим путем чине систем модуларним.

Компјутерски уређаји за складиштење података и многи модерни програмски језици обезбеђују подршку за именске просторе. Уређаји за чување података користе директоријуме (или фолдере) као именске просторе. Ово омогућава да две датотеке са истим именом буду сачуване на уређају све док се налазе у различитим директоријумима. У неким програмским језицима (нпр. C++, Пајтон) идентификатори који именују именске просторе и сами су асоцирани са именским простором који их обухвата. Дакле, у овим језицима именски простори се могу угнездити, формирајући стабло именских простора. У корену овог стабла је неименован глобални именски простор.

Употреба у уобичајеним језицима уреди

C++ уреди

У C++ језику, именски простор је дефинисан са блоком именског простора.

namespace abc {
 int bar;
)

У оквиру овог блока, идентификатори се могу користити управо онако како су декларисани. Изван овог блока, спецификатор именског простора мора имати префикс. На пример, ван namespace abc bar мора се написати abc::bar да би му се приступило. C++ поседује још једну конструкцију која чини овај вербализам непотребном. Додавање линије

using namespace abc;

делу кода, чини префикс abc:: непотребним.

Код који није експлицитно декларисан унутар именског простора сматра се да је у глобалном именском простору.

Разрешавање именског простора у C++ је хијерархијско. То значи да се у оквиру хипотетичког именског простора храна::супа идентификатор пилећа односи на храна::супа::пилећа ако постоји. Ако не постоји, онда се односи на храна::пилећа, ако то постоји. Ако ни то не постоји, пилећа се односи на глобални идентификатор у именском простору.

Именски простори у C++ најчешће се користе како би се избегле колизије именовања. Иако су именски простори у широкој употреби у скорашњем C++ коду, већина старијег кода не користи ову погодност. На пример, цела C++ стандардна библиотека дефинисана је у оквиру namespace std, а пре стандардизације многе компоненте су првобитно биле у глобалном именском простору.

Јава уреди

У Јава програмском језику идеја именског простор је отелотворена у Јава пакетима. Сав код припада пакету, мада тај пакет не мора бити изричито именован. Коду из других пакета приступа се стављањем имена пакета пре одговарајућег идентификатора, на пример class String у package java.lang може се навести као java.lang.String (ово се назива потпуно квалификованим именима класа. Попут C++, Јава нуди конструкт који чини унос имена пакета непотребним import. Међутим, неке функције (као што је одраз) захтевају да програмер користи у потпуности квалификовано име.

За разлику од C++ именски простори у Јави нису хијерархијски што се тиче синтаксе језика. Међутим, пакети су именовани на хијерархијски начин. На пример, сви пакети који почињу са java део су Јава платформа-пакета java.lang који садржи основне класе језика, а java.lang.reflect садржи класе које се посебно односе на рефлексију.

У Јави (као и у Ади, C, и другим језицима), именски простори / пакети изражавају семантичке категорије кода. На пример, у C#, namespace System садржи код који је обезбедио систем (.NET фрејмворк). Колико специфичне су ове категорије и колико дубоко иду хијерархије разликује се од језика до језика.

Функција и обим класа може се посматрати као имплицитни именски простори који су нераскидиво повезани са видљивошћу, доступношћу и животним веком објекта.

XML именски простор уреди

У XML спецификацији именског простора омогућава да имена елемената и атрибута у XML документу буду јединствена, што је слично улози именских простора у програмским језицима. Користећи XML именске просторе, XML документи могу да садрже имена елемента или атрибута из више од једног XML речника.

Емулирање именских простора уреди

У програмским језицима које не пружају језичку подршку за именске просторе, именски простори могу бити донекле емулирани употребом конвенције именовања идентификатора. На пример, C библиотеке попут Libpng често користе фиксни префикс за све функције и променљиве које су део њиховог изложеног интерфејса. Libpng излаже идентификаторе попут:

png_create_write_struct
png_get_signature
png_read_row
png_set_invalid

Ово донекле осигурава јединственост идентификаторa и да се стога могу користити у већим програмима, без бојазни од колизија именовања идентификатора.

Нажалост, ова техника има неколико недостатака:

  • Не преноси се добро на угнежђене именске просторе; идентификатори постају претерано дугачки.
  • Појединци или организације могу да користе драстично недоследне конвенције именовања, потенцијално уводећи нежељено запетљавање.
  • Сложене или „засноване на упиту“ операције на групама идентификатора, засноване на именским просторима у којима су декларисани, показују се као непогодне за руковање или непрактичне.
  • Све употребе идентификатора морају, у ствари, бити у[потпуности квалификоване за именски простор. Језици са директном подршком за именске просторе обично обезбеђују начине да програмер унапред декларише да жели да користи неке или све идентификаторе из одређеног именског простора, који се онда могу користити без квалификација за остатак блока.

Види још уреди