Пространство имен (программирование) | это… Что такое Пространство имен (программирование)?
Пространство имён (от англ. 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++ определена внутри
, но до стандартизации многие компоненты первоначально были определены в глобальном пространстве.
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, 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
- Термин
- Понятие
- Множество
- Пространство понятий
- Пространство параметров
Ссылки
Пространства имён | Kubernetes
Kubernetes поддерживает несколько виртуальных кластеров в одном физическом кластере. Такие виртуальные кластеры называются пространствами имён.
Причины использования нескольких пространств имён
Пространства имён применяются в окружениях с многочисленными пользователями, распределенными по нескольким командам или проектам. Пространства имён не нужно создавать, если есть кластеры с небольшим количеством пользователей (например, десяток пользователей). Пространства имён имеет смысл использовать, когда необходима такая функциональность.
Пространства имён определяют область имён. Имена ресурсов должны быть уникальными в пределах одного и того же пространства имён. Пространства имён не могут быть вложенными, а каждый ресурс Kubernetes может находиться только в одном пространстве имён.
Пространства имён — это способ разделения ресурсов кластера между несколькими пользователями (с помощью квоты ресурсов).
По умолчанию в будущих версиях Kubernetes объекты в одном и том же пространстве имён будут иметь одинаковую политику контроля доступа.
Не нужно использовать пространства имён только для разделения слегка отличающихся ресурсов, например, в случае разных версий одного и того же приложения. Используйте метки, чтобы различать ресурсы в рамках одного пространства имён.
Использование пространств имён
Создание и удаление пространств имён описаны в руководстве администратора по пространствам имён.
Просмотр пространств имён
Используйте следующую команду, чтобы вывести список существующих пространств имён в кластере:
kubectl get namespace
NAME STATUS AGE default Active 1d kube-system Active 1d kube-public Active 1d
По умолчанию в Kubernetes определены три пространства имён:
default
— пространство имён по умолчанию для объектов без какого-либо другого пространства имён.kube-system
— пространство имён для объектов, созданных Kuberneteskube-public
— создаваемое автоматически пространство имён, которое доступно для чтения всем пользователям (включая также неаутентифицированных пользователей). Как правило, это пространство имён используется кластером, если некоторые ресурсы должны быть общедоступными для всего кластера. Главная особенность этого пространства имён — оно всего лишь соглашение, а не требование.
Определение пространства имён для отдельных команд
Используйте флаг --namespace
, чтобы определить пространство имён только для текущего запроса.
Примеры:
kubectl run nginx --image=nginx --namespace=<insert-namespace-name-here> kubectl get pods --namespace=<insert-namespace-name-here>
Определение пространства имён для всех команд
Можно определить пространство имён, которое должно использоваться для всех выполняемых команд kubectl в текущем контексте.
kubectl config set-context --current --namespace=<insert-namespace-name-here> # Проверка kubectl config view --minify | grep namespace:
Пространства имён и DNS
При создании сервиса создаётся соответствующая ему DNS-запись.
Эта запись вида <service-name>.<namespace-name>.svc.cluster.local
означает, что если контейнер использует только <service-name>
, то он будет локальным сервисом в пространстве имён. Это позволит применять одну и ту же конфигурацию в нескольких пространствах имен (например, development, staging и production). Если нужно обращаться к другим пространствам имён, то нужно использовать полностью определенное имя домена (FQDN).
Объекты без пространства имён
Большинство ресурсов Kubernetes (например, поды, сервисы, контроллеры репликации и другие) расположены в определённых пространствах имён. При этом сами ресурсы пространства имён не находятся ни в других пространствах имён. А такие низкоуровневые ресурсы, как узлы и persistentVolumes, не принадлежат ни одному пространству имён.
Чтобы посмотреть, какие ресурсы Kubernetes находятся в пространстве имён, а какие — нет, используйте следующие команды:
# Ресурсы в пространстве имён kubectl api-resources --namespaced=true # Ресурсы, не принадлежавшие ни одному пространству имён kubectl api-resources --namespaced=false
Что дальше
- Узнать подробнее про создание нового пространства имён.
- Узнать подробнее про удаление пространства имён.
php — Что такое пространства имен?
Нам часто нужно дать ресурсу имя, метку, которая поможет нам понять и рассказать о том, что это такое. Но именование — это не просто задача присвоения последовательности символов. Имена служат для того, чтобы отличить одну вещь от другой.
Хотя идентификатор относится к одному ресурсу, это не означает, что нет двух идентичных идентификаторов.
Мы можем предотвратить или уменьшить коллизии идентификаторов с помощью GUID или добавления информации о пространство имен . namespace — это домен, из которого выбираются имена или идентификаторы . Когда мы добавляем пространство имен к идентификатору, мы создаем квалифицированных имен .
Пример Время!
предположим, что есть только один JOHN_SMITH
с почтовым индексом 99501. Также есть только один JOHN_SMITH
с почтовым индексом 86302. Итак, когда мы упоминаем JOHN_SMITH
, как мы узнаем, о каком JOHN002SMITH00 мы говорим?
Когда речь идет о почтовом индексе 99501 и упоминание JOHN_SMITH
, мы говорим о JOHN_SMITH
, который уезжает с почтовым индексом 99501.
Когда мы говорим в контексте почтового индекса 86302 и упоминаем JOHN_SMITH
, мы говорим о JOHN_SMITH
, который отправляется с почтовым индексом 86302.
Что произойдет, если один человек с почтовым индексом 99501 и другой человек с почтовым индексом 86302 захотят поговорить о JOHN_SMITH
?
PHP_EOL; эхо \zc86302\ДЖОН_СМИТ . PHP_EOL; ?>
Здесь \zc99501\JOHN_SMITH
и \zc86302\JOHN_SMITH
являются квалифицированными именами.
Другой пример.
Предположим, что в одном контексте мы имеем в виду Название книги
, когда используем константу название
. И Имя автора
По имя
.
в другом контексте мы имеем в виду Титул персонажа
под название
. И Имя персонажа
By имя
.
Когда мы хотим название
и имя
в обоих контекстах, мы должны специально различать название книги
и название персонажа
. Мы также должны различать Имя автора
и Имя персонажа
.
Здесь \Book\title
, \Book\name
, \Character\title
и \Character\name
являются квалифицированными именами.
ПРИМЕЧАНИЕ: В PHP пространства имен затрагивают только четыре типа кода: классы, интерфейсы, функции и константы.
Вот так.
Пространства имен | Kubernetes
В Kubernetes пространства имен предоставляют механизм изоляции групп ресурсов в пределах одного кластера. Имена ресурсов должны быть уникальными в пространстве имен, но не между пространствами имен. Область действия на основе пространства имен применима только к объектам с пространством имен (например, развертывания, службы и т. д.) , но не для объектов всего кластера (например, StorageClass, Nodes, PersistentVolumes и т. д.) .
Когда использовать несколько пространств имен
Пространства имен предназначены для использования в средах с большим количеством пользователей, распределенных по нескольким команды или проекты. Для кластеров с несколькими и десятками пользователей не следует нужно создавать или вообще думать о пространствах имен. Начните использовать пространства имен, когда вы нужны функции, которые они предоставляют.
Пространства имен предоставляют область для имен. Имена ресурсов должны быть уникальными в пространстве имен, но не через пространства имен. Пространства имен не могут быть вложены друг в друга, и каждый Kubernetes ресурс может находиться только в одном пространстве имен.
Пространства имен — это способ разделения ресурсов кластера между несколькими пользователями (через квоту ресурсов).
Нет необходимости использовать несколько пространств имен для разделения слегка различающихся ресурсов, таких как разные версии одного и того же программного обеспечения: используйте этикетки, чтобы отличать ресурсы в одном и том же пространстве имен.
Примечание: Для рабочего кластера рассмотрите , а не , используя пространство имен по умолчанию
. Вместо этого создайте другие пространства имен и используйте их.
Исходные пространства имен
Kubernetes запускается с четырьмя исходными пространствами имен:
-
по умолчанию
- Kubernetes включает это пространство имен, чтобы вы могли начать использовать новый кластер без предварительного создания пространства имен.
-
kube-node-lease
- Это пространство имен содержит объекты Lease, связанные с каждым узлом. Аренда узлов позволяет kubelet отправлять тактовые импульсы, чтобы плоскость управления могла обнаружить сбой узла.
-
куб-общедоступный
- Это пространство имен доступно для чтения всем клиентам (включая не прошедших проверку подлинности). Это пространство имен в основном зарезервировано для использования в кластере на тот случай, если некоторые ресурсы должны быть видимы и доступны для чтения во всем кластере. Публичный аспект этого пространства имен является лишь соглашением, а не требованием.
-
kube-system
- Пространство имен для объектов, созданных системой Kubernetes.
Работа с пространствами имен
Создание и удаление пространств имен описано в Документация Руководства администратора по пространствам имен.
Примечание: Избегайте создания пространств имен с префиксом kube-
, так как он зарезервирован для системных пространств имен Kubernetes.
Просмотр пространств имен
Вы можете просмотреть текущие пространства имен в кластере, используя:
kubectl get namespace
ИМЯ СТАТУС ВОЗРАСТ по умолчанию активный 1d kube-node-аренда Active 1d куб-публичный активный 1d kube-система Active 1d
Установка пространства имен для запроса
Чтобы установить пространство имен для текущего запроса, используйте флаг --namespace
.
Например:
kubectl run nginx --image=nginx --namespace=kubectl получить модули --namespace=
Настройка предпочтения пространства имен
Вы можете навсегда сохранить пространство имен для всех последующих команд kubectl в этом контекст.
kubectl config set-context --current --namespace=# Подтвердить это представление конфигурации kubectl --minify | пространство имен grep:
Пространства имен и DNS
Когда вы создаете Службу,
он создает соответствующую запись DNS.
Эта запись имеет форму
, что означает
что если контейнер использует только
, он будет разрешаться в службу, которая
является локальным для пространства имен. Это полезно для использования одной и той же конфигурации в
несколько пространств имен, таких как Development, Staging и Production. Если вы хотите достичь
в пространствах имен необходимо использовать полное доменное имя (FQDN).
В результате все имена пространств имен должны быть действительными. DNS-метки RFC 1123.
Предупреждение:
Путем создания пространств имен с тем же именем, что и общедоступное пространство верхнего уровня. домены, Услуги в них пространства имен могут иметь короткие DNS-имена, которые пересекаются с общедоступными записями DNS. Рабочие нагрузки из любого пространства имен, выполняющие поиск DNS без конечной точки, будут быть перенаправлены на эти службы, имеющие приоритет над общедоступным DNS.
Чтобы избежать этого, ограничьте права на создание пространств имен доверенными пользователями. Если при необходимости вы можете дополнительно настроить сторонние элементы управления безопасностью, такие как как допуск вебхуки, заблокировать создание любого пространства имен с именем public ДВУ.
Не все объекты находятся в пространстве имен
Большинство ресурсов Kubernetes (например, модули, сервисы, контроллеры репликации и другие) в некоторых пространствах имен.