Пространство имен

редактировать
Контейнер для набора идентификаторов

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

Пространства имен обычно структурированы как иерархии, чтобы позволить повторное использование имен в разных контекстах. В качестве аналогии рассмотрим систему именования людей, в которой каждый человек имеет свое имя, а также фамилию, общую для своих родственников. Если имена членов семьи уникальны только в пределах каждой семьи, то каждого человека можно однозначно идентифицировать по комбинации имени и фамилии; есть только одна Джейн Доу, хотя Джейн может быть много. В пространстве имен семейства Доу достаточно просто «Джейн», чтобы однозначно обозначить этого человека, в то время как в «глобальном» пространстве имен всех людей должно использоваться полное имя.

Яркими примерами пространств имен являются файловые системы, которые присваивают имена файлам. Некоторые языки программирования организуют свои переменные и подпрограммы в пространствах имен. Компьютерные сети и распределенные системы присваивают имена ресурсам, например компьютеры, принтеры, веб-сайты и удаленные файлы. Операционные системы могут разделять ресурсы ядра по изолированным пространствам имен для поддержки виртуализации контейнеров.

Подобным образом иерархические файловые системы организуют файлы в каталогах. Каждый каталог представляет собой отдельное пространство имен, поэтому каталоги "письма" и "счета-фактуры" могут содержать файл "to_jane".

В компьютерном программировании пространства имен обычно используются с целью группировки символов и идентификаторов вокруг определенной функциональности и для предотвращения конфликтов имен между несколькими идентификаторами, которые используют одни и те же имя.

В сети Система доменных имен организует веб-сайты (и другие ресурсы) в иерархические пространства имен.

Содержание
  • 1 Конфликты имен
    • 1.1 Решение с помощью префикса
  • 2 Система имен
    • 2.1 Примеры
    • 2.2 Делегирование
    • 2.3 Иерархия
    • 2.4 Пространство имен в зависимости от области
  • 3 В языках программирования
    • 3.1 Соображения по информатике
      • 3.1.1 Использование в общие языки
    • 3.2 Эмуляция пространств имен
  • 4 См. также
  • 5 Ссылки
Конфликты имен

Имена элементов определяются разработчиком. Это часто приводит к конфликту при попытке смешать XML-документы из разных XML-приложений.

Этот XML-код содержит информацию о таблице HTML :

ApplesOranges

Этот XML-код содержит информацию о таблице (т.е. мебели):

Африканский журнальный столик80120

Если бы эти фрагменты XML были сложены вместе, возник бы конфликт имен. Оба содержат элемент

...
, но эти элементы имеют разное содержание и значение.

Анализатор XML не знает, как обрабатывать эти различия.

Решение с помощью префикса

Конфликтов имен в XML можно легко избежать, используя префикс имени.

Следующий XML различает информацию о таблице HTML и мебели с помощью префиксов «h» и «f» в начале элементов.

ЯблокиАпельсиныАфриканский журнальный столик80120
Система имен

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

В расширенной форме Бэкуса – Наура :

name = separator 

Когда локальные имена используются сами по себе, разрешение имен используется для определения того, какие (если any) конкретное имя ссылается на какое-то конкретное локальное имя.

Примеры

Примеры имен в пространстве имен
КонтекстИмяИдентификатор пространства именЛокальное имя
Путь /home/user/readme.txt/home/user (родительский путь)readme.txt (имя файла)
Имя домена www.example.comexample.com (имя субдомена)www (имя конечного домена)
C++std::arraystdarray
UN / LOCODE US NYCUS (страна)NYC (местность)
XML xmlns: xhtml = "http: // www. w3.org/1999/xhtml ". http://www.w3.org/1999/xhtml body
Perl $DBI::errstrDBI$ errstr
Java java.util.Datejava.utilДата
Универсальное имя ресурса (URN)urn: nbn : fi-fe19991055 urn: nbn (номера национальной библиографии)fi-fe19991055
Handle System 10.1000 / 18210 (дескриптор уполномоченного по присвоению имен)1000/182 (дескриптор локального имени)
Идентификатор цифрового объекта 10.1000 / 18210.1000 (издатель)182 (публикация)
MAC-адрес 01-23-45-67-89-ab01-23-45 (организационно уникальный идентификатор )67-89-ab (зависит от сетевой карты)
PCI ID 1234 abcd1234 (идентификатор поставщика)abcd (идентификатор устройства)
USB VID / PID 2341 003f2341 ( идентификатор поставщика)003f (идентификатор продукта)
SPARQL dbr:Sydneydbr (ранее объявленная онтология, например путем указания @prefix dbr: <http://dbpedia.org/resource/ >)Sydney

Delegation

Делегирование ответственности между сторонами важно в реальных приложениях, таких как структура всемирной паутины. Пространства имен позволяют делегировать назначение идентификаторов нескольким организациям, выдающим имена, сохраняя при этом глобальную уникальность. Центральный орган регистрации регистрирует присвоенные идентификаторы пространства имен, выделенные. Каждый идентификатор пространства имен назначается организации, которая впоследствии отвечает за присвоение имен в выделенном им пространстве имен. Эта организация может быть организацией, выдающей имена, которая присваивает имена себе, или другим органом регистрации, который далее делегирует части своего пространства имен разным организациям.

Иерархия

Схема именования, которая позволяет субделегировать пространства имен третьим сторонам, представляет собой иерархическое пространство имен .

Иерархия является рекурсивной, если синтаксис идентификаторов пространства имен одинаков для каждого подделегирование. Примером рекурсивной иерархии является система доменных имен.

Примером нерекурсивной иерархии является унифицированное имя ресурса, представляющее Internet Assigned Numbers Authority (IANA) количество.

Иерархическая структура пространства имен для urn: isbn: 978-3-16-148410-0, идентификатор книги Карла Поппера «Логика научных открытий», 10-е издание.
РеестрРегистраторПример идентификатораИдентификатор пространства именПространство имен
Универсальное имя ресурса (URN)Интернет Администрация по присвоению номеров urn: isbn: 978-3-16-148410-0 urnПространство имен формальных URN
Пространство имен формальных URN Управление по присвоению номеров Интернета urn: isbn: 978 -3-16-148410-0 ISBNМеждународные стандартные номера книг как единообразные названия ресурсов
Международный артикульный номер (EAN) GS1 978-3-16-148410-0978Bookland
Международный стандартный номер книги (ISBN)Международное агентство ISBN 3-16-148410-X3Немецкоязычные страны
Немецкое издательство код Agentur für Buchmarktstandards 3-16-148410-X 16Мор Зибек

Пространство имен по сравнению с областью действия

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

Примеры систем именования с локальной и глобальной областью действия, с пространствами имен и без них
Без пространства именС пространством имен
Локальная область действияРегистрационная табличка транспортного средства Стандарт иерархии файловой системы
Глобальная область действияУниверсальный уникальный идентификатор Система доменных имен
В языках программирования

Для многих языков программирования пространство имен является контекстом для их идентификаторов. В операционной системе примером пространства имен является каталог. Каждое имя в каталоге однозначно идентифицирует один файл или подкаталог.

Как правило, имена в пространстве имен не могут иметь более одного значения; то есть разные значения не могут иметь одно и то же имя в одном пространстве имен. Пространство имен также называется контекстом, потому что одно и то же имя в разных пространствах имен может иметь разные значения, каждое из которых соответствует своему пространству имен.

Ниже приведены другие характеристики пространств имен:

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

#include // Вот как можно ввести имя в текущий объем. В этом случае он // переносит их в глобальную область видимости. используя std :: cout; используя std :: endl; пространство имен box1 {int box_side = 4; } пространство имен box2 {int box_side = 12; } int main () {int box_side = 42; cout << box1::box_side << endl; // Outputs 4. cout << box2::box_side << endl; // Outputs 12. cout << box_side << endl; // Outputs 42. }

Соображения, связанные с информатикой

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

Эту концепцию можно проиллюстрировать аналогией. Представьте, что две компании, X и Y, присваивают своим сотрудникам идентификационные номера. X не должен иметь двух сотрудников с одинаковым идентификационным номером, как и Y; но использование одного и того же идентификационного номера в обеих компаниях не является проблемой. Например, если Билл работает в компании X, а Джейн работает в компании Y, то для каждого из них не проблема быть сотрудником № 123. В этой аналогии идентификационный номер является идентификатором, а компания - пространством имен. Это не вызывает проблем, если один и тот же идентификатор идентифицирует разных людей в каждом пространстве имен.

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

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

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

C

. Можно использовать анонимные структуры в качестве пространств имен в C с C99.

/ / helper.c static int _add (int a, int b) {return a + b; } const struct {двойной пи; int (* добавить) (int, int); } helper = {3.14, _add}; // helper.h const struct {double pi; int (* добавить) (int, int); } помощник; // main.c #include #include "helper.h" int main () {printf ("3 + 2 =% d \ n", helper.add (3, 2)); printf ("пи - это% f \ n", helper.pi); }
C ++

В C ++ пространство имен определяется с помощью блока пространства имен.

пространство имен abc {int bar; }

Внутри этого блока идентификаторы могут использоваться точно так, как они объявлены. Вне этого блока спецификатор пространства имен должен иметь префикс. Например, за пределами пространства имен abc, barдолжен быть записан abc :: barдля доступа. C ++ включает еще одну конструкцию, которая делает ненужным многословие. Добавив строку

с использованием пространства имен abc;

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

Идентификаторы, которые явно не объявлены в пространстве имен, считаются находящимися в глобальном пространстве имен.

int foo;

Эти идентификаторы могут использоваться точно так, как они объявлены, или, поскольку глобальное пространство имен не имеет имени, спецификатор пространства имен ::может иметь префикс. Например, fooтакже можно записать :: foo.

Разрешение пространства имен в C ++ является иерархическим. Это означает, что в гипотетическом пространстве имен food :: soupидентификатор курицаотносится к food :: soup :: chicken. Если food :: soup :: chickenне существует, тогда это относится к food :: chicken. Если ни food :: soup :: chicken, ни food :: chickenне существует, курицаотносится к :: курица, идентификатор в глобальное пространство имен.

Пространства имен в C ++ чаще всего используются для предотвращения конфликтов имен. Хотя пространства имен широко используются в недавнем коде C ++, в большинстве более старого кода это средство не используется, потому что его не было в ранних версиях языка. Например, вся Стандартная библиотека C ++ определена в пространстве имен std, но до стандартизации многие компоненты изначально находились в глобальном пространстве имен. Программист может вставить директиву using, чтобы обойти требования разрешения пространства имен и получить обратную совместимость со старым кодом, который ожидает, что все идентификаторы будут в глобальном пространстве имен. Однако использование директивы usingпо причинам, отличным от обратной совместимости (например, для удобства), считается противоречащим хорошей практике кода.

Java

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

В отличие от C ++, пространства имен в Java не являются иерархическими в том, что касается синтаксиса языка. Однако пакеты именуются иерархически. Например, все пакеты, начинающиеся с java, являются частью платформы Java - пакет java.lang содержит основные классы для language, а java.lang.reflect содержит базовые классы, специально относящиеся к отражению.

В Java (и Ada, C# и др.) Пространства имен / пакеты выражают семантические категории кода. Например, в C # пространство имен Systemсодержит код, предоставленный системой (.NET Framework ). Насколько специфичны эти категории и насколько глубока иерархия, зависит от языка к языку.

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

C#

Пространства имен широко используются на языке C #. Все классы.NET Framework организованы в пространствах имен для более четкого использования и во избежание хаоса. Более того, настраиваемые пространства имен широко используются программистами как для организации своей работы, так и для предотвращения конфликтов имен. При ссылке на класс следует указать либо его полное имя, что означает пространство имен, за которым следует имя класса,

System.Console.WriteLine ("Hello World!"); int я = System.Convert.ToInt32 ("123");

или добавьте с помощью оператора . Это избавляет от необходимости упоминать полное имя всех классов в этом пространстве имен.

с помощью системы; Console.WriteLine («Привет, мир!»); int i = Convert.ToInt32 ("123");

В приведенных выше примерах System - это пространство имен, а Console и Convert - классы, определенные в System .

Python

В Python пространства имен определяются отдельными модулями, и, поскольку модули могут содержаться в иерархических пакетах, пространства имен также являются иерархическими. Как правило, когда модуль импортируется, имена, определенные в модуле, определяются через пространство имен этого модуля, и доступ к ним осуществляется из вызывающих модулей с использованием полного имени.

# предположим, что модуль a определяет две функции: func1 () и func2 () и один класс: class1 import modulea modulea.func1 () modulea.func2 () a = modulea.class1 ()

из... import...может использоваться для вставки соответствующих имен непосредственно в пространство имен вызывающего модуля, и к этим именам можно получить доступ из вызывающего модуля без полного имени:

# предположим, что modulea определяет две функции : func1 () и func2 () и один класс: class1 из modulea import func1 func1 () func2 () # это не сработает как неопределенное имя, как и полное имя modulea.func2 () a = class1 () # это будет потерпеть неудачу как неопределенное имя, как и полное имя modulea.class1 ()

Поскольку он напрямую импортирует имена (без уточнения), он может перезаписывать существующие имена без предупреждений.

Специальная форма оператора - from... import *, которая импортирует все имена, определенные в названном пакете, непосредственно в пространство имен вызывающего модуля. Использование этой формы импорта, хотя и поддерживается в языке, обычно не рекомендуется, поскольку она загрязняет пространство имен вызывающего модуля и приводит к перезаписи уже определенных имен в случае конфликта имен.

Python также поддерживает import x as yкак способ предоставления псевдонима или альтернативного имени для использования вызывающим модулем:

import numpy as np a = np.arange (1000)
Пространство имен XML

В XML спецификация пространства имен XML позволяет именам элементов и атрибутов в XML-документе быть уникальными, подобно роли пространств имен в языках программирования. Используя пространства имен XML, документы XML могут содержать имена элементов или атрибутов из более чем одного словаря XML.

PHP

Пространства имен были введены в PHP, начиная с версии 5.3. Можно избежать конфликта имен классов, функций и переменных. В PHP пространство имен определяется с помощью блока пространства имен.

# Файл phpstar / foobar.php namespace phpstar; class FooBar {публичная функция foo () ->void {echo 'Привет, мир, из функции foo'; } публичная панель функций () ->void {echo 'Привет, мир, из панели функций'; }}

Мы можем ссылаться на пространство имен PHP следующими различными способами:

# Файл index.php # Включить файл include "phpstar / foobar.php"; # Вариант 1. Прямой префикс имени класса пространством имен $ obj_foobar = new \ phpstar \ FooBar (); # Вариант 2: импортировать пространство имен с помощью phpstar \ FooBar; $ obj_foobar = новый FooBar (); # Вариант 2a: импорт и псевдоним пространства имен использовать phpstar \ FooBar как FB; $ obj_foobar = новый FB (); # Доступ к свойствам и методам обычным способом $ obj_foobar->foo (); $ obj_foobar->bar ();

Эмуляция пространств имен

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

png_create_write_struct png_get_signature png_read_row png_set_invalid

Это соглашение об именах обеспечивает разумную уверенность в том, что идентификаторы уникальны и поэтому могут использоваться в больших программах без конфликтов имен. Аналогичным образом, многие пакеты, изначально написанные на Fortran (например, BLAS, LAPACK ), резервируют первые несколько букв имени функции, чтобы указать, к какой группе она принадлежит.

Этот метод имеет несколько недостатков:

  • Он плохо масштабируется для вложенных пространств имен; идентификаторы становятся чрезмерно длинными, так как все виды использования идентификаторов должны быть полностью квалифицированными в пространстве имен.
  • Отдельные лица или организации могут использовать несогласованные соглашения об именах, потенциально вводя нежелательную обфускацию.
  • Составные или "основанные на запросах" операции для групп идентификаторов на основе пространств имен, в которых они объявлены, представляются громоздкими или невыполнимыми.
  • В языках с ограниченной длиной идентификатора использование префиксов ограничивает количество символов, которые могут использоваться для определения того, что функция делает. Это особая проблема для пакетов, изначально написанных на FORTRAN 77, который предлагал только 6 символов на идентификатор. Например, имя функции BLAS DGEMMуказывает, что она работает с числами двойной точности ("D") и общими матрицами ("GE"), и только с последними два символа показывают, что он на самом деле делает: умножение матрицы на матрицу («ММ»).

Есть несколько преимуществ:

  • Никаких специальных программных инструментов для поиска имен в файлах исходного кода не требуется. Простая программа, такая как grep suffices.
  • Нет конфликтов имен пространств имен.
  • Нет необходимости в изменении имен и, следовательно, нет потенциальных проблем несовместимости.
См. Также
Найдите пространство имен в Wiktionary, бесплатном словаре.
Ссылки
Последняя правка сделана 2021-05-31 08:55:39
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте