2009-06-13 2 views
18

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

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

+7

Не сдавайтесь - степень CS не является хорошим предиктором хорошего разработчика, и я подозреваю, что большинство разработчиков во всем мире не так страдают! –

ответ

13

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

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

3

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

2

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

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

2

От php.net:

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

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

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

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

15

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

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

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

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

В рубине модуль в основном тот же объект пространства имен на C++.

например:

module Foo 
    BAZ = 1 
end 

module Bar 
    BAZ = 2 
end 

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

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

42

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

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

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

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

+1

Благодарим вас за прекрасное объяснение. Так просто, когда объясняется так. – Sam

+6

Другой пример: если у вас есть 'Building :: Key' и' Piano :: Key' в том же приложении, пространства имен разделяют классы Key. –

2

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

+0

Что вы подразумеваете под «областью» в этом контексте? –

+0

Область охвата включает контекст, в котором связаны объекты. См. Http://winterdom.com/dev/cpp/nspaces. Вы согласны? – Ninad

Смежные вопросы