Что такое пространство имен? - PullRequest
19 голосов
/ 13 июня 2009

Я не пошел обычным CS-путем к изучению программирования, и я часто слышу о пространствах имен, но я не совсем понимаю эту концепцию. Описания, которые я нашел в Интернете, обычно находятся в контексте языка Си, с которым я не знаком.

Я занимаюсь Ruby 2 года и пытаюсь глубже понять язык и ООП.

Ответы [ 7 ]

45 голосов
/ 13 июня 2009

Я собираюсь предоставить более банальное описание.

Скажем, у моей жены есть сестра по имени Сью, и я тоже. Как я могу отличить их в разговоре? Используя их фамилии ("Сью Ларсон" против "Сью Джонс"). Фамилия - это пространство имен .

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

Но в остальном это похожая концепция.

16 голосов
/ 13 июня 2009

Определение пространства имен из Википедии:

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

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

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

В ruby ​​модуль - это то же самое, что пространство имен в C ++.

например:

module Foo
  BAZ = 1
end

module Bar
  BAZ = 2
end

puts Foo::BAZ #=> 1
puts Bar::BAZ #=> 2

Итак, у вас есть константа BAZ, объявленная в двух модулях (или пространства имен в ruby)

14 голосов
/ 13 июня 2009

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

В Ruby это достигается с помощью модулей.

3 голосов
/ 13 июня 2009

просто представьте, что это логическая группировка объектов и функциональности

2 голосов
/ 05 мая 2011

Кратчайший ответ: пространства имен создают область действия.

2 голосов
/ 13 июня 2009

С php.net :

Что такое пространства имен? В самом широком Пространства имен определения являются способом инкапсулирующие элементы. Это видно как абстрактное понятие во многих местах. Например, в любой операционной системе каталоги служат для группы связанных файлы, и выступать в качестве пространства имен для файлы внутри них. Как бетон Например, файл foo.txt может существовать в оба каталога / home / greg и в / home / other, но две копии файла foo.txt не может сосуществовать в одном каталоге. Кроме того, для доступа к foo.txt файл вне / home / greg каталог, мы должны предварять имя каталога с именем файла, используя разделитель каталогов, чтобы получить /home/greg/foo.txt. Это же Принцип распространяется на пространства имен в мир программирования.

Таким образом, как упоминалось в другом плакате, пространства имен можно использовать для группировки элементов.

Чтобы понять, почему это может быть полезно, предположим, что вы хотите написать плагин для, скажем, Wordpress, и вы хотите создать класс с именем «MyClass». Проблема, однако, в том, что вы не представляете, написал ли какой-либо другой разработчик другой плагин Wordpress, используя класс с именем «MyClass». Поэтому, чтобы избежать конфликтов имен, вместо этого вы называете свой класс «MyPluginMyClass». Это раздражает, но, вероятно, позволяет избежать конфликтов имен.

Но затем наступает выпуск PHP 5.3, который наконец поддерживает пространства имен (предположим, что Wordpress и все серверы, на которых он развернут, обновлен до PHP 5.3). Теперь вы можете создать пространство имен, скажем «MyPlugin», и заключить в него «MyClass». Сделав это, вы можете опубликовать свой плагин, не беспокоясь о том, что ваша версия «MyClass» будет конфликтовать с чужой версией «MyClass».

2 голосов
/ 13 июня 2009

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

Ключевым моментом является то, что, когда вы не можете «логически сгруппировать» имена в пространства имен, т.е. у вас есть только одно недифференцированное «пространство», в котором живут все имена, чтобы избежать случайных столкновений, вы в конечном итоге неуклюже повторно реализуете элементарное пространство имен, такие трюки, как префиксы имен и т. д. Например, «рисовать» означает нечто совершенно иное для художника или стрелка; если бы у вас не было отдельных пространств имен для артиста и стрелка, вы бы получили такие идентификаторы, как artist_draw и gunslinger_draw, а все еще рискуют случайными конфликтами, если некоторые авторы библиотеки используют различные соглашения и т. д. и т. д.

...