- Пространство имен (программирование)
-
Пространство имён (от англ. namespace) - некоторое множество, под которым подразумевается модель, абстрактное хранилище или окружение, созданное для логической группировки уникальных идентификаторов (т.е. имён). Идентификатор, определенный в пространстве имён, ассоциируется с этим пространством. Один и тот же идентификатор может быть независимо определён в нескольких пространствах. Таким образом, значение, связанное с идентификатором, определённым в одном пространстве имён, может иметь (или не иметь) такое же (а скорее, другое) значение, как и такой же идентификатор, определённый в другом пространстве. Языки с поддержкой пространств имён определяют правила, указывающие, к какому пространству имён принадлежит идентификатор (т.е. его определение).
Например, Андрей работает в компании X, а ID (сокр. от англ. идентификатор) его как работника равен 123. Олег работает в компании Y, а его ID также равен 123. Единственное (с точки зрения некоей системы учета), благодаря чему Андрей и Олег могут быть различимы при совпадающих ID, это их принадлежность к разным компаниям. Различие компаний в этом случае весьма представляет собой систему различных пространств имён (одна компания - одно пространство). Наличие двух работников в компании с одинаковыми ID представляет большие проблемы при их использовании (например, во многих программах. Например, по платёжному чеку, в котором будет указан работник с ID 123, будет весьма затруднительно определить работника, которому этот чек предназначается.
В больших базах данных могут существовать сотни и тысячи идентификаторов. Пространства имён (или схожие структуры) реализуют механизм для сокрытия локальных идентификаторов. Их смысл заключается в группировке логически связанных идентификаторов в соответствующих пространствах имён, таким образом делая систему модульной.
Операционные системы, многие современные языки программирования обеспечивают поддержку своей модели пространств имён: используют каталоги (или папки) как модель пространства имён. Это позволяет существовать двум файлам с одинаковыми именами (пока они находятся в разных каталогах). В некоторых языках программирования (например, C++, дерево пространств имён. Корень такого дерева называется глобальным пространством имён.
Содержание
Границы
В языках программирования одним из способом задания границы пространства имен может быть использование т.н. области видимости.
Использование в языках
C++
Пространство имён определяется блоком инструкций.
namespace foo { int bar; }
Внутри этого блока идентификаторы могут вызываться именно так, как они были объявлены. Но вне блока требуется указание имени пространства имён перед идентификатором. Например, вне
namespace fooидентификаторbarдолжен указываться какfoo::bar. C++ содержит некоторые другие конструкции, делающие подобные требования необязательными. Так, при добавлении строкиusing namespace foo;
в код, указывать префикс
foo::больше не требуется. Еще пример:namespace Namespace12 { int foo; } void func1() { using namespace Namespace12; // теперь все имена из пространства имён Namespace12 будут видны здесь без дополнительных префиксов ++foo; } void func2() { // а тут имя нужно уточнить: Namespace12::foo = 42; }
Код, не объявленный явным образом в пространстве имён, подразумевается объявленным в глобальном пространстве имён.
Разрешение пространств имён в C++ иерархично. Это означает, что в гипотетическом пространстве имён
еда::суп, идентификаторкурицабудет обозначатьеда::суп::курица(если пространство существует). Если не существует, то тогда он указывает наеда::курица(если это пространство существует). Если и это пространство не существует, токурицассылается на идентификатор в глобальном пространстве.Зачастую пространства имён в C++ используются для избежания коллизий имён. Хотя пространства имён широко используются в современом коде, большая часть старого кода не имеет подобных возможностей. Например, вся стандартная библиотека языка C++ определена внутри
namespace std, но до стандартизации многие компоненты первоначально были определены в глобальном пространстве.Java-пакеты. Весь код определен внутри пакета, причем этот пакет не нуждается в явно заданном имени. Код из других пакетов доступен при префиксном указании имени пакета перед соответствующим идентификатором, например
class Stringвpackage java.langможет быть вызван какjava.lang.String(данный способ известен как полное имя класса). Как и в C++, Java предлагает конструцию, делающую необязательным указание имя пакета (import). Тем не менее, некоторые особенности (как, например, отражение) требуют от программиста использования полного имени.В отличие от C++, пространства имён в Java не являются иерархически упорядоченными из-за синтаксиса самого языка. тем не менее, пакеты именуются в иерархическом стиле. Например, все пакеты, начинающиеся с
java, являются частью платформы Java—пакетjava.langсодержит базовые классы языка, аjava.lang.reflectсодержит базовые классы, специфичные для отражения (рефлексии).В языке Java (также как и в Ада, C# и других языках) пространства имён/пакеты отражают семантические категории кода. Например, в C#
namespace Systemсодержит код, реализуемой системой (платформа .NET). Как именно определяются эти категории и какова глубина иерархии - зависит от самого языка.Область видимости
Функция и класс может быть определена как неявное пространство имён, сложно связанное с видимостью, доступностью и периодом жизни объекта.
В Википедии
Идея реализована в виде категоризации (структурирование схожих статей по темам).
C#
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), формат оформления RDF).
RDF документа, поэтому проверяется его оформление согласно словарю (правилам, спецификации) RDF.
Эмуляция пространств имён
В языках программирования, не поддерживающих языковую поддержку пространств имён, пространства могут эмулироваться расширением, используя соглашения о наименовании идентификаторов. Например, библиотеки языка Си, такие как Libpng поддерживает внешние идентификаторы, такие как:
png_create_write_struct png_get_signature png_read_row png_set_invalid
Это дает обоснованную гарантию того, что идентификаторы будут уникальны и таким образом могут быть использованы в больших программах без опасения коллизии имен идентификаторов.
Недостатки
Основные:
- Нету нормального учета вложенных пространств; идентификаторы становятся чересчур длинными.
- Программисты или организации могут использовать удручающе несовместимые соглашения о наименовании, тем самым потенциально провоцируя большую запутанность.
- Сложные операции или операции запроса над группами идентификаторов, основанных на пространства имён, в которых они объявлены, обрабатываются слишком неоптимально или вообще невыполнимы.
- Все вызовы идентификаторов должны на самом деле осуществлять с полным именем пространств. Языки с непосредственной поддержкой пространств имён обычно предоставляют программисту возможность предварительно объявлять, что они хотят использовать некоторые (а то и все) идентификаторы в программе только из одного пространства, которые они впоследствии могут использовать без указания принадлежности к пространству.
Примечания
См. также
- Первичный ключ
- Видимость (программирование)
- Разрешение имени
- Plan 9 - Использует метафору все что угодно есть файл, заменяя файлы именами.
-
- Package (Java)
- Пространства имён JavaScript
- Термин
- Понятие
- Множество
- Пространство понятий
- Пространство параметров
Ссылки
Wikimedia Foundation. 2010.