Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

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

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

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

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

Конфликты имен [ править ]

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

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

<table>  <tr>  <td> Яблоки </td>  <td> Апельсины </td>  </tr> </table>

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

<table>  <name> Африканский журнальный столик </name>  <width> 80 </width>  <length> 120 </length> </table>

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

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

Решение через префикс [ править ]

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

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

<h: table>  <h: tr>  <h: td> Яблоки </ h: td>  <h: td> Апельсины </ h: td>  </ h: tr> </ h: table><f: table>  <f: name> Африканский журнальный столик </ f: name>  <f: width> 80 </ f: width>  <f: length> 120 </ f: length> </ f: table>

Система имен [ править ]

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

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

name = <идентификатор пространства имен> разделитель <локальное имя>

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

Примеры [ править ]

Делегирование [ править ]

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

Иерархия[ редактировать ]

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

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

Примером нерекурсивной иерархии является унифицированное имя ресурса, представляющее номер службы присвоения номеров в Интернете (IANA).

Пространство имен против области [ править ]

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

На языках программирования [ править ]

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

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

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

  • Имена в пространстве имен могут представлять объекты, а также концепцию , быть в пространстве имен с естественным или этническим языком , а сконструированный язык , в техническую терминологии по профессии, на диалект , а социолект , или язык искусственного (например, язык программирования ).
  • В языке программирования Java идентификаторы, которые появляются в пространствах имен, имеют короткое (локальное) имя и уникальное длинное «квалифицированное» имя для использования вне пространства имен.
  • Некоторые компиляторы (для таких языков, как C ++ ) объединяют пространства имен и имена для внутреннего использования в компиляторе в процессе, называемом преобразованием имен .

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

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

Соображения по информатике [ править ]

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

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

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

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

Использовать на общих языках [ править ]

C

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

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

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

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

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

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

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

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

int  foo ;

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

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

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

Ява

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

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

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

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

C #

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

Система . Консоль . WriteLine ( «Привет, мир!» ); int  i  =  System . Конвертировать . ToInt32 ( «123» );

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

используя  Систему ;Консоль . WriteLine ( «Привет, мир!» ); int  i  =  преобразовать . ToInt32 ( «123» );

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

Python

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

# предполагаем, что modulea определяет две функции: func1 () и func2 () и один класс: Class1 import  ModuleaModulea . func1 () Modulea . func2 () a  =  Modulea . Класс1 ()

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

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

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

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

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

импортировать  numpy  как  npа  =  нп . апельсин ( 1000 )
Пространство имен XML

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

PHP

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

# Файл phpstar / foobar.phpпространство имен  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 ();# Вариант 2а: импорт и псевдоним пространства имен использовать  phpstar \ FooBar  как  FB ; $ obj_foobar  =  новый  FB ();# Доступ к свойствам и методам обычным способом $ obj_foobar -> foo (); $ obj_foobar -> bar ();

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

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

png_create_write_structpng_get_signaturepng_read_rowpng_set_invalid

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

У этой техники есть несколько недостатков:

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

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

  • Для поиска имен в файлах исходного кода не требуется никаких специальных программных средств. Достаточно простой программы, такой как grep .
  • Нет конфликтов имен пространств имен.
  • Нет необходимости изменять имена и, следовательно, нет проблем с потенциальной несовместимостью.

См. Также [ править ]

  • 11-значный почтовый индекс пункта доставки
  • Биномиальная номенклатура (род-вид в биологии )
  • Химическая номенклатура
  • Десятичная классификация Дьюи
  • Идентификатор цифрового объекта
  • система доменных имен
  • Идентичность (объектно-ориентированное программирование)
  • Классификация Библиотеки Конгресса
  • Звездные каталоги и астрономические соглашения об именах
  • Пространство имен XML
  • Поиск имени, зависящего от аргумента

Ссылки [ править ]

  1. ^ Адья, Атул; Болоски, Уильям; Кастро, Мигель; Чермак, Джеральд; Чайкен, Ронни; Дусер, Джон; Хауэлл, Джон; Лорч, Джейкоб; Таймер, Марвин; Ваттенхофер, Роджер (2002). FARSITE: объединенное, доступное и надежное хранилище для не полностью доверенной среды (PDF) . Proc. USENIX Symp. по проектированию и внедрению операционных систем. Архивировано из оригинального (PDF) 28 июля 2010 года. Первичная конструкция, устанавливаемая файловой системой, - это иерархическое пространство имен каталогов, которое является логическим хранилищем файлов.
  2. ^ «C # FAQ: Что такое пространство имен» . http://en.csharp-online.net/ : C # Online Net. Архивировано из оригинала на 2013-10-20 . Проверено 23 февраля 2010 . Пространство имен - это не что иное, как группа сборок, классов или типов. Пространство имен действует как контейнер - как папка на диске - для классов, организованных в группы, обычно на основе функциональности. Синтаксис пространства имен C # допускает вложение пространств имен.
  3. ^ «Обзор пространств имен в PHP» . Руководство по PHP . Что такое пространства имен? В самом широком определении пространства имен - это способ инкапсуляции элементов. Во многих местах это можно рассматривать как абстрактное понятие. Например, в любой операционной системе каталоги служат для группировки связанных файлов и действуют как пространство имен для файлов внутри них.
  4. ^ «Создание и использование пакетов» . Документация по Java . Oracle. Пакет - это группа связанных типов, обеспечивающая защиту доступа и управление пространством имен. Обратите внимание, что типы относятся к классам, интерфейсам, перечислениям и типам аннотаций. Типы перечислений и аннотаций - это особые виды классов и интерфейсов соответственно, поэтому в этом уроке типы часто упоминаются просто как классы и интерфейсы.[ нужен лучший источник ]
  5. ^ Ядро XML Рабочая группа (8 декабря 2009). «Пространства имен в XML 1.0 (третье издание)» . W3C . Проверено 30 марта 2012 .
  6. ^ Moats, Райан (май 1997). «Синтаксис» . Синтаксис URN . IETF . п. 1 сек. 2. дои : 10,17487 / запрос RFC2141 . RFC 2141 . Проверено 30 марта 2012 .
  7. ^ Стивен Дж. Гауди. «Список USB-идентификаторов» . 2013.
  8. ^ Sollins & Masinter (декабрь 1994). «Требования к функциональным возможностям» . Функциональные требования к унифицированным именам ресурсов . IETF . п. 3. сек. 2. дои : 10,17487 / RFC1731 . RFC 1731 . Проверено 30 марта 2012 .
  9. ^ «C # FAQ: Что такое пространство имен» . http://en.csharp-online.net/ : C # Online Net. Архивировано из оригинального 20 октября 2013 года . Проверено 23 февраля 2010 . Например, [в Windows ] для доступа к классам и членам встроенного ввода-вывода (I / O) используйте пространство имен System.IO. Или, чтобы получить доступ к классам и членам, связанным с Интернетом, используйте пространство имен System.Web.
  10. ^ «Пространство имен» - это логическая группа имен, используемых в программе. " " . Webopedia.com . Проверено 26 июля 2011 .
  11. ^ «Пространства имен позволяют группировать сущности, такие как классы, объекты и функции, под именем» . Cplusplus.com . Проверено 26 июля 2011 .
  12. ^ «6. Модули» . Учебник по Python . Фонд программного обеспечения Python . Проверено 25 октября 2010 года .
  13. ^ «Области действия и пространства имен Python» . Docs.python.org . Проверено 26 июля 2011 .
  14. ^ https://docs.python.org/3/tutorial/modules.html "в целом практика импорта * из модуля или пакета не одобряется"
  15. ^ Дэнни Калев. «Почему я ненавижу пространства имен» . Архивировано 9 июля 2016 года.CS1 maint: bot: исходный статус URL неизвестен ( ссылка )