Некоторые языки программирования (например, Java и C ++) имеют языковые функции, называемые «пакетами» или «пространствами имен». Насколько полезно иметь пространства имен? Можно пометить функции и классы как принадлежащие некоторой конкретной библиотеке, не используя такую языковую функцию, как SDL (например SDL_BlitSurface()
). Разве пространства имен не достаточно полезны, чтобы их стоило иметь? Они полезны в библиотеках, но не в приложениях? Они полезны везде, кроме небольших проектов? Мысли?
organization
naming
packages
compman
источник
источник
using
конкретным пространством имен, и тогда вам не нужно ставить префикс в начале идентификаторов в этом пространстве имен.using
, посредствомimport xxxxxxxxx as yyy
, и т. Д.using SDL;
или печататьSDL_*
везде?Большинство (все?) Языков с пространствами имен имеют тенденцию быть объектно-ориентированными. Во многих случаях подходит удобочитаемое имя для типа, даже если существует несколько несовместимых реализаций. (это поднимает другие проблемы по объектно-ориентированному повторному использованию, но это не тот вопрос). Например, в Java у вас есть Timer, который используется для фоновых задач пользовательского интерфейса, и Timer, который используется для фоновых приложений (не привязанных к AWT / Swing). Пространство имен позволяет вам иметь эти одноименные объекты, живущие в разных под-API.
Причина появления пространств имен была связана с необоснованной задачей предугадывать, как другие разработчики будут называть свои объекты. C ++ ввел эту концепцию (или, по крайней мере, был первым языком, с которым я познакомился с этой концепцией), и он был полезен, даже несмотря на то, что не было руководящих принципов по наилучшему использованию. Java адаптировала концепцию и добавила некоторые «лучшие практики», которые включали название вашей компании в пространство имен. Таким образом, вам нужно было беспокоиться только о своей собственной компании.
Префикс может стать довольно грязным. Когда вы применяете это? Когда ты не применяешь это? Получают ли префиксы структуры / классы / глобальные методы? Как насчет методов? Как насчет свойств в структуре. Я видел все эти вещи в коде, хотя, к счастью, не все сразу. Пространства имен обеспечивают некоторую предсказуемость для всех этих вопросов и делают его языковой функцией, а не личной «лучшей практикой».
источник
Я думаю, что пространства имен - отличная идея. Они помогают предотвратить конфликты имен, ограничивая область действия имени. В пакетах Java предлагаемое соглашение об именовании пакетов основано на доменных именах, которые должны быть уникальными, что помогает предотвратить конфликты имен в пользовательских библиотеках. В целом, они делают именование немного более уникальным в широком смысле, в то же время предоставляя программисту большую свободу в наименовании своих произведений без необходимости следовать некоторым неясным правилам именования.
источник
Пространства имен / Модули / Пакеты полезны для избежания конфликтов имен. То же относится и к префиксам имен, но пространства имен имеют дополнительное удобство - возможность импортировать символы в текущее пространство имен, так что вам не нужно беспокоиться обо всем пространстве имен :: *.
Некоторые языки (например, Python) расширяют эту возможность, позволяя вам импортировать только определенные символы в текущий модуль или импортировать символы под другим именем. Это полезно, если вас интересуют только несколько классов / функций / констант или если некоторые символы конфликтуют с символами в вашем пространстве имен, а некоторые нет.
Некоторые языки (например, Ruby) позволяют включать методы модуля в ваш класс. Это полезно для полиморфизма и дженериков. Например, если у вас есть несколько классов, которые имеют итераторы, которые действуют одинаково, вы можете смешивать методы со всеми этими классами из отдельного модуля, который предоставляет методы для сортировки и фильтрации данных в объекте. Это позволяет
has a
отношения, а такжеis a
(наследование) отношения.источник