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

Поделись знанием:
Перейти к: навигация, поиск

Пространство имён (англ. namespace) — некоторое множество, под которым подразумевается модель, абстрактное хранилище или окружение, созданное для логической группировки уникальных идентификаторов (то есть имён). Идентификатор, определенный в пространстве имён, ассоциируется с этим пространством. Один и тот же идентификатор может быть независимо определён в нескольких пространствах. Таким образом, значение, связанное с идентификатором, определённым в одном пространстве имён, может иметь (или не иметь) такое же значение, как и такой же идентификатор, определённый в другом пространстве. Языки с поддержкой пространств имён определяют правила, указывающие, к какому пространству имён принадлежит идентификатор (то есть его определение).

Например, Андрей работает в компании X, а ID (сокр. от англ. Identifier — идентификатор) его как работника равен 123. Олег работает в компании Y, а его ID также равен 123. Единственное (с точки зрения некой системы учёта), благодаря чему Андрей и Олег могут быть различимы при совпадающих ID, это их принадлежность к разным компаниям. Различие компаний в этом случае представляет собой систему различных пространств имён (одна компания — одно пространство). Наличие двух работников в компании с одинаковыми ID представляет большие проблемы при их использовании, например, по платёжному чеку, в котором будет указан работник с ID 123, будет весьма затруднительно определить работника, которому этот чек предназначается.

В больших базах данных могут существовать сотни и тысячи идентификаторов. Пространства имён (или схожие структуры) реализуют механизм для сокрытия локальных идентификаторов. Их смысл заключается в группировке логически связанных идентификаторов в соответствующих пространствах имён, таким образом делая систему модульной. Ограничение видимости переменных может также производиться путём задания класса её памяти.

Операционные системы, многие современные языки программирования обеспечивают поддержку своей модели пространств имён: используют каталоги (или папки) как модель пространства имён. Это позволяет существовать двум файлам с одинаковыми именами (пока они находятся в разных каталогах). В некоторых языках программирования (например, C++, Python) идентификаторы имён пространств сами ассоциированы с соответствующими пространствами. Поэтому в этих языках пространства имён могут вкладываться друг в друга, формируя дерево пространств имён. Корень такого дерева называется глобальным пространством имён.





Границы

В языках программирования одним из способов задания границы пространства имен может быть использование т. н. области видимости.

Использование в языках

C++

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

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() { /*...*/ }
}

Нельзя осуществить доступ из одной единицы трансляции к члену анонимного пространства имён из другой единицы.

Хотя пространства имён широко используются в современном коде, большая часть старого кода не имеет подобных возможностей. Например, вся стандартная библиотека языка C++ определена внутри namespace std, но до стандартизации многие компоненты первоначально были определены в глобальном пространстве.

Также можно сделать видимым не всё пространство, а отдельные имена внутри него, например:

namespace foo {
  int bar;
  int somelse;
}
int main () {
 using foo::bar; //Делает видимым только bar, somelse невидим!
 return 0;
}

Java

Идея пространств имён воплощена в Java-пакетах. Весь код определён внутри пакета, причём этот пакет не нуждается в явно заданном имени. Код из других пакетов доступен при префиксном указании имени пакета перед соответствующим идентификатором, например, класс String в пакете java.lang может быть вызван как java.lang.String (данный способ известен как полное имя класса). Как и в C++, Java предлагает конструкцию, делающую необязательным указание имя пакета (import). Тем не менее, некоторые особенности (как, например, отражение) требуют от программиста использования полного имени.

В отличие от C++, пространства имён в Java не являются иерархически упорядоченными из-за синтаксиса самого языка. Тем не менее, пакеты именуются в иерархическом стиле. Например, все пакеты, начинающиеся с java, являются частью платформы Java — пакет [java.sun.com/javase/6/docs/api/java/lang/package-summary.html java.lang] содержит базовые классы языка, а [java.sun.com/javase/6/docs/api/java/lang/reflect/package-summary.html java.lang.reflect] содержит базовые классы, специфичные для отражения (рефлексии).

В языке Java (так же, как и в Ада, C# и других языках) пространства имён/пакеты отражают семантические категории кода. Например, в C# namespace System содержит код, реализуемой системой (платформа .NET). Как именно определяются эти категории и какова глубина иерархии — зависит от самого языка.

Область видимости

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

В Википедии

Существуют пространства имён, среди которых основное — пространство статей — имеет нулевой префикс в названии страницы, а остальные ненулевой (например, Википедия: или Шаблон:)

C#

В языке C# существуют пространства имён, употребление аналогично C++.

Python

В Python идея пространств имён реализована в модулях. (Так же, как и в пакетах Java)

JavaScript

Несмотря на отсутствие формальной поддержки пространств имён, их легко реализовать при помощи объектной концепции языка:

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="www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:foaf="xmlns.com/foaf/0.1/"
  xmlns:rdfs="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.

PHP

Начиная с версии 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.net/manual/ru/language.namespaces.basics.php официальном сайте проекта PHP]

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

Это дает обоснованную гарантию того, что идентификаторы будут уникальны и таким образом могут быть использованы в больших программах без опасения коллизии имен идентификаторов.

К недостаткам эмуляции пространств имён можно отнестиК:Википедия:Статьи без источников (тип: не указан)[источник не указан 3829 дней]:

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

Напишите отзыв о статье "Пространство имён (программирование)"

Примечания


К:Википедия:Статьи без источников (тип: не указан)

Отрывок, характеризующий Пространство имён (программирование)

Петя рассчитывал на успех своего представления государю именно потому, что он ребенок (Петя думал даже, как все удивятся его молодости), а вместе с тем в устройстве своих воротничков, в прическе и в степенной медлительной походке он хотел представить из себя старого человека. Но чем дальше он шел, чем больше он развлекался все прибывающим и прибывающим у Кремля народом, тем больше он забывал соблюдение степенности и медлительности, свойственных взрослым людям. Подходя к Кремлю, он уже стал заботиться о том, чтобы его не затолкали, и решительно, с угрожающим видом выставил по бокам локти. Но в Троицких воротах, несмотря на всю его решительность, люди, которые, вероятно, не знали, с какой патриотической целью он шел в Кремль, так прижали его к стене, что он должен был покориться и остановиться, пока в ворота с гудящим под сводами звуком проезжали экипажи. Около Пети стояла баба с лакеем, два купца и отставной солдат. Постояв несколько времени в воротах, Петя, не дождавшись того, чтобы все экипажи проехали, прежде других хотел тронуться дальше и начал решительно работать локтями; но баба, стоявшая против него, на которую он первую направил свои локти, сердито крикнула на него:
– Что, барчук, толкаешься, видишь – все стоят. Что ж лезть то!
– Так и все полезут, – сказал лакей и, тоже начав работать локтями, затискал Петю в вонючий угол ворот.
Петя отер руками пот, покрывавший его лицо, и поправил размочившиеся от пота воротнички, которые он так хорошо, как у больших, устроил дома.
Петя чувствовал, что он имеет непрезентабельный вид, и боялся, что ежели таким он представится камергерам, то его не допустят до государя. Но оправиться и перейти в другое место не было никакой возможности от тесноты. Один из проезжавших генералов был знакомый Ростовых. Петя хотел просить его помощи, но счел, что это было бы противно мужеству. Когда все экипажи проехали, толпа хлынула и вынесла и Петю на площадь, которая была вся занята народом. Не только по площади, но на откосах, на крышах, везде был народ. Только что Петя очутился на площади, он явственно услыхал наполнявшие весь Кремль звуки колоколов и радостного народного говора.
Одно время на площади было просторнее, но вдруг все головы открылись, все бросилось еще куда то вперед. Петю сдавили так, что он не мог дышать, и все закричало: «Ура! урра! ура!Петя поднимался на цыпочки, толкался, щипался, но ничего не мог видеть, кроме народа вокруг себя.
На всех лицах было одно общее выражение умиления и восторга. Одна купчиха, стоявшая подле Пети, рыдала, и слезы текли у нее из глаз.
– Отец, ангел, батюшка! – приговаривала она, отирая пальцем слезы.
– Ура! – кричали со всех сторон. С минуту толпа простояла на одном месте; но потом опять бросилась вперед.
Петя, сам себя не помня, стиснув зубы и зверски выкатив глаза, бросился вперед, работая локтями и крича «ура!», как будто он готов был и себя и всех убить в эту минуту, но с боков его лезли точно такие же зверские лица с такими же криками «ура!».
«Так вот что такое государь! – думал Петя. – Нет, нельзя мне самому подать ему прошение, это слишком смело!Несмотря на то, он все так же отчаянно пробивался вперед, и из за спин передних ему мелькнуло пустое пространство с устланным красным сукном ходом; но в это время толпа заколебалась назад (спереди полицейские отталкивали надвинувшихся слишком близко к шествию; государь проходил из дворца в Успенский собор), и Петя неожиданно получил в бок такой удар по ребрам и так был придавлен, что вдруг в глазах его все помутилось и он потерял сознание. Когда он пришел в себя, какое то духовное лицо, с пучком седевших волос назади, в потертой синей рясе, вероятно, дьячок, одной рукой держал его под мышку, другой охранял от напиравшей толпы.
– Барчонка задавили! – говорил дьячок. – Что ж так!.. легче… задавили, задавили!
Государь прошел в Успенский собор. Толпа опять разровнялась, и дьячок вывел Петю, бледного и не дышащего, к царь пушке. Несколько лиц пожалели Петю, и вдруг вся толпа обратилась к нему, и уже вокруг него произошла давка. Те, которые стояли ближе, услуживали ему, расстегивали его сюртучок, усаживали на возвышение пушки и укоряли кого то, – тех, кто раздавил его.
– Этак до смерти раздавить можно. Что же это! Душегубство делать! Вишь, сердечный, как скатерть белый стал, – говорили голоса.
Петя скоро опомнился, краска вернулась ему в лицо, боль прошла, и за эту временную неприятность он получил место на пушке, с которой он надеялся увидать долженствующего пройти назад государя. Петя уже не думал теперь о подаче прошения. Уже только ему бы увидать его – и то он бы считал себя счастливым!
Во время службы в Успенском соборе – соединенного молебствия по случаю приезда государя и благодарственной молитвы за заключение мира с турками – толпа пораспространилась; появились покрикивающие продавцы квасу, пряников, мака, до которого был особенно охотник Петя, и послышались обыкновенные разговоры. Одна купчиха показывала свою разорванную шаль и сообщала, как дорого она была куплена; другая говорила, что нынче все шелковые материи дороги стали. Дьячок, спаситель Пети, разговаривал с чиновником о том, кто и кто служит нынче с преосвященным. Дьячок несколько раз повторял слово соборне, которого не понимал Петя. Два молодые мещанина шутили с дворовыми девушками, грызущими орехи. Все эти разговоры, в особенности шуточки с девушками, для Пети в его возрасте имевшие особенную привлекательность, все эти разговоры теперь не занимали Петю; ou сидел на своем возвышении пушки, все так же волнуясь при мысли о государе и о своей любви к нему. Совпадение чувства боли и страха, когда его сдавили, с чувством восторга еще более усилило в нем сознание важности этой минуты.
Вдруг с набережной послышались пушечные выстрелы (это стреляли в ознаменование мира с турками), и толпа стремительно бросилась к набережной – смотреть, как стреляют. Петя тоже хотел бежать туда, но дьячок, взявший под свое покровительство барчонка, не пустил его. Еще продолжались выстрелы, когда из Успенского собора выбежали офицеры, генералы, камергеры, потом уже не так поспешно вышли еще другие, опять снялись шапки с голов, и те, которые убежали смотреть пушки, бежали назад. Наконец вышли еще четверо мужчин в мундирах и лентах из дверей собора. «Ура! Ура! – опять закричала толпа.
– Который? Который? – плачущим голосом спрашивал вокруг себя Петя, но никто не отвечал ему; все были слишком увлечены, и Петя, выбрав одного из этих четырех лиц, которого он из за слез, выступивших ему от радости на глаза, не мог ясно разглядеть, сосредоточил на него весь свой восторг, хотя это был не государь, закричал «ура!неистовым голосом и решил, что завтра же, чего бы это ему ни стоило, он будет военным.
Толпа побежала за государем, проводила его до дворца и стала расходиться. Было уже поздно, и Петя ничего не ел, и пот лил с него градом; но он не уходил домой и вместе с уменьшившейся, но еще довольно большой толпой стоял перед дворцом, во время обеда государя, глядя в окна дворца, ожидая еще чего то и завидуя одинаково и сановникам, подъезжавшим к крыльцу – к обеду государя, и камер лакеям, служившим за столом и мелькавшим в окнах.
За обедом государя Валуев сказал, оглянувшись в окно:
– Народ все еще надеется увидать ваше величество.
Обед уже кончился, государь встал и, доедая бисквит, вышел на балкон. Народ, с Петей в середине, бросился к балкону.
– Ангел, отец! Ура, батюшка!.. – кричали народ и Петя, и опять бабы и некоторые мужчины послабее, в том числе и Петя, заплакали от счастия. Довольно большой обломок бисквита, который держал в руке государь, отломившись, упал на перилы балкона, с перил на землю. Ближе всех стоявший кучер в поддевке бросился к этому кусочку бисквита и схватил его. Некоторые из толпы бросились к кучеру. Заметив это, государь велел подать себе тарелку бисквитов и стал кидать бисквиты с балкона. Глаза Пети налились кровью, опасность быть задавленным еще более возбуждала его, он бросился на бисквиты. Он не знал зачем, но нужно было взять один бисквит из рук царя, и нужно было не поддаться. Он бросился и сбил с ног старушку, ловившую бисквит. Но старушка не считала себя побежденною, хотя и лежала на земле (старушка ловила бисквиты и не попадала руками). Петя коленкой отбил ее руку, схватил бисквит и, как будто боясь опоздать, опять закричал «ура!», уже охриплым голосом.
Государь ушел, и после этого большая часть народа стала расходиться.
– Вот я говорил, что еще подождать – так и вышло, – с разных сторон радостно говорили в народе.
Как ни счастлив был Петя, но ему все таки грустно было идти домой и знать, что все наслаждение этого дня кончилось. Из Кремля Петя пошел не домой, а к своему товарищу Оболенскому, которому было пятнадцать лет и который тоже поступал в полк. Вернувшись домой, он решительно и твердо объявил, что ежели его не пустят, то он убежит. И на другой день, хотя и не совсем еще сдавшись, но граф Илья Андреич поехал узнавать, как бы пристроить Петю куда нибудь побезопаснее.


15 го числа утром, на третий день после этого, у Слободского дворца стояло бесчисленное количество экипажей.
Залы были полны. В первой были дворяне в мундирах, во второй купцы с медалями, в бородах и синих кафтанах. По зале Дворянского собрания шел гул и движение. У одного большого стола, под портретом государя, сидели на стульях с высокими спинками важнейшие вельможи; но большинство дворян ходило по зале.
Все дворяне, те самые, которых каждый день видал Пьер то в клубе, то в их домах, – все были в мундирах, кто в екатерининских, кто в павловских, кто в новых александровских, кто в общем дворянском, и этот общий характер мундира придавал что то странное и фантастическое этим старым и молодым, самым разнообразным и знакомым лицам. Особенно поразительны были старики, подслеповатые, беззубые, плешивые, оплывшие желтым жиром или сморщенные, худые. Они большей частью сидели на местах и молчали, и ежели ходили и говорили, то пристроивались к кому нибудь помоложе. Так же как на лицах толпы, которую на площади видел Петя, на всех этих лицах была поразительна черта противоположности: общего ожидания чего то торжественного и обыкновенного, вчерашнего – бостонной партии, Петрушки повара, здоровья Зинаиды Дмитриевны и т. п.
Пьер, с раннего утра стянутый в неловком, сделавшемся ему узким дворянском мундире, был в залах. Он был в волнении: необыкновенное собрание не только дворянства, но и купечества – сословий, etats generaux – вызвало в нем целый ряд давно оставленных, но глубоко врезавшихся в его душе мыслей о Contrat social [Общественный договор] и французской революции. Замеченные им в воззвании слова, что государь прибудет в столицу для совещания с своим народом, утверждали его в этом взгляде. И он, полагая, что в этом смысле приближается что то важное, то, чего он ждал давно, ходил, присматривался, прислушивался к говору, но нигде не находил выражения тех мыслей, которые занимали его.
Был прочтен манифест государя, вызвавший восторг, и потом все разбрелись, разговаривая. Кроме обычных интересов, Пьер слышал толки о том, где стоять предводителям в то время, как войдет государь, когда дать бал государю, разделиться ли по уездам или всей губернией… и т. д.; но как скоро дело касалось войны и того, для чего было собрано дворянство, толки были нерешительны и неопределенны. Все больше желали слушать, чем говорить.
Один мужчина средних лет, мужественный, красивый, в отставном морском мундире, говорил в одной из зал, и около него столпились. Пьер подошел к образовавшемуся кружку около говоруна и стал прислушиваться. Граф Илья Андреич в своем екатерининском, воеводском кафтане, ходивший с приятной улыбкой между толпой, со всеми знакомый, подошел тоже к этой группе и стал слушать с своей доброй улыбкой, как он всегда слушал, в знак согласия с говорившим одобрительно кивая головой. Отставной моряк говорил очень смело; это видно было по выражению лиц, его слушавших, и по тому, что известные Пьеру за самых покорных и тихих людей неодобрительно отходили от него или противоречили. Пьер протолкался в середину кружка, прислушался и убедился, что говоривший действительно был либерал, но совсем в другом смысле, чем думал Пьер. Моряк говорил тем особенно звучным, певучим, дворянским баритоном, с приятным грассированием и сокращением согласных, тем голосом, которым покрикивают: «Чеаек, трубку!», и тому подобное. Он говорил с привычкой разгула и власти в голосе.