2010-11-17 6 views
3

Было бы плохой практикой использовать пространства под-имен для чисто организационных целей? Например:Подпространства для организации плохой практики?

namespace vehicles 
{ 
    namespace cars 
    { 
     // Stuff here 
    } 

    namespace boats 
    { 
     // More stuff here 
    } 
} 

Я могу видеть, как это будет проблемой на больших проектах, потому что это было бы неудобно набирать vehicles::cars::function много. А как же небольшие проекты?

+0

Зависит от того, что Вздор и больше материала –

+0

Также обратите внимание, что единственной причиной наблюдения стиля в небольших программах является привыкание к нему в ожидании больших программ. Стиль, передовая практика, шаблоны проектирования и т. Д. Редко бывают важны в небольших программах, потому что большинство из них служат для удобного обслуживания и легкой расширяемости. –

ответ

7

Почему было бы неудобно вводить vehicles::cars::function в небольшом проекте?

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

Если вы изобретаете такую ​​сложную структуру пространства имен, что у меня возникает соблазн просто поместить несколько using namespace ... в верхнюю часть каждого файла, то это победит цель пространства имен.

Это также на самом деле не говорит мне, что я уже не знал. Что вы собираетесь вставить в пространство имен boats, которое я не знал бы из названия, было лодкой? Мне понадобится разъяснение, что «это принадлежит лодкам» на чем-либо в пространстве имен? Скорее всего, нет, и тогда нет смысла иметь пространство имен.

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

Если это не решит настоящую актуальную проблему, тогда это плохая идея, независимо от чего-либо еще.

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

.NET использует глубоко вложенные пространства имен с длинными именами. Полное имя для простого динамического массива - System.Collections.Generic.List<T>.

В результате никто не использует пространство имен. Все просто помещают using System.Collections.Generic в начало каждого файла, который должен использовать Список.

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

C++ использует очень плоскую структуру namespcae, где пространства имен также имеют очень короткие имена.

Эквивалентный класс на C++ - это просто std::vector. В результате люди обычно печатают префикс пространства имен, поэтому, когда я добавляю в свой проект еще один векторный класс, * он работает '. Нет конфликтов имен, потому что я использую префикс std::, когда хочу ссылаться на стандартный вектор библиотеки.

+0

Я бы поспорил с частью «и не намного больше». Я думаю, что наиболее ценной вещью в пространствах имен является ADL и возможность включать автономные функции в интерфейс класса –

+0

@Armen: вы могли бы иметь и те, которые не имеют пространств имен. В конечном счете, пространство имен должно * подразделить * ваш код. ADL - это способ обойти это, связав код обратно вместе. – jalf

+0

@Armen: но я согласен с тем, что ADL является важной частью того, что делает пространства имен * работать * на C++. Без этого мы, скорее всего, закончили бы «использование пространства имен ...» всюду на C++, отрицая преимущества пространств имен. – jalf

3

ИМХО это не плохая практика! Также рассмотрите возможность использования псевдонимов для того, чтобы каждый раз набирать полное имя и не вводить полное пространство имен, где это необходимо ...

2

Одна из причин пространств имен - это организационные цели, насколько мелкозернистые вы делаете их по личным предпочтениям - я сохраняю их довольно общие лично, например, у меня есть TransferObjects. Транспортные средства, но не идут ни с чем мелкозернистым. Если у вас много разных типов, я не вижу смысла в этом разбираться. Но это зависит от вас.

Если это небольшой проект, то должна ли база кода быть относительно небольшой и легко перемещаемой, что устраняет необходимость такого подхода?

4

Ну, для чего это стоит, я пытался использовать глубоко вложенные пространства имен в проекте среднего размера пару лет назад, и это был абсолютный ад - я все время писал typedefs :) В Java пакеты работайте очень хорошо, потому что вы можете просто импортировать вещи вверху каждого .java-файла и не иметь серьезных проблем. В C++ это боль в прикладе, потому что это плохая практика поместить с помощью директив/деклараций в заголовочные файлы. В результате вы получаете либо (a) полное отбор всех в заголовках (bleurgh), либо (b) используя много typedefs (также bleurgh). Не круто - мой совет будет избегать, как чумы, если вы не любите писать такие вещи, как:

centipede::autoseg::hierarchygeneration::ragbuilders::RAGBuilder<...> 

Это не типа, это предложение ...

+0

Зачем вам использовать typedefs? Я думаю, что «использование» директив будет правильным инструментом. Конечно, вы не ставите их в верхнюю часть заголовка, но можете использовать их локально, внутри функций, и они ничего не будут загрязнять. Если вы используете что-то много в функции, поставьте 'abcd :: efgh :: MyClass;' в верхней части функции. Другой способ - это локальное пространство имен po = boost :: program_options; 'для сокращения пространства имен. – Ela782

+0

@ Ela782: вы можете использовать функции внутри функций (хотя вам придется повторять их в каждой функции), но вы все равно должны полностью квалифицировать типы переменных-членов, если вы это делаете. Вы можете обойти это без typedefs, завернув свой класс в фиктивное пространство имен, импортируя вещи в это пространство имен с помощью директивы using, а затем импортируя свой класс обратно в охватываемое пространство имен, но это становится немного взломанным. Аббревиатуры пространства имен работают, но, возможно, немного затрудняют читаемость и помогают решить проблему, которой вы, скорее всего, не существовали (вложенные пространства имен). –

+0

Хорошо, я также согласен с вашим последним предложением :-) Что вы имеете в виду с _ "вы все еще в конечном итоге должны полностью квалифицировать типы переменных-членов" _? – Ela782

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