Подтвердить что ты не робот

Что такое пространство имен?

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Но в остальном это аналогичное понятие.

Ответ 3

Определение namespace из Википедии:

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

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

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

В рубине модуль - это в основном то же самое, что пространство имен находится на С++.

например:

module Foo
  BAZ = 1
end

module Bar
  BAZ = 2
end

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

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

Ответ 4

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

Ответ 5

Wikipedia содержит короткую, но полезную статью об пространствах имен вообще, а также гораздо более подробную один для пространств имен в области информатики, с языковыми примерами & c.

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

Ответ 6

От 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.

Ответ 7

Самый короткий ответ: Пространства имен создают область.