Загрязнение глобального пространства имен - PullRequest
2 голосов
/ 06 ноября 2008

Я думаю, что большинство программистов на C ++ согласились бы с тем, что загрязнение глобального пространства имен - плохая идея, но бывают ли случаи, когда это правило можно игнорировать?

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

mytypes.h

typedef int MY_TYPE;

foo.cpp

MY_TYPE myType;

Или используйте пространство имен:

mytypes.h

namespace ns {
typedef int MY_TYPE;
}

foo.cpp

ns::MY_TYPE myType;
...
using namespace ns;
MY_TYPE myType;

Что вы предпочитаете? Есть ли случаи, когда допустимо использовать первый метод?

Ответы [ 4 ]

7 голосов
/ 06 ноября 2008

Вы можете определить свой тип в отдельном пространстве имен и использовать

using ns::MY_TYPE;
4 голосов
/ 06 ноября 2008

Библиотеки не должны, Приложения могут.

Когда над приложением работают несколько человек, конечно, вам нужны четкие правила, и самое ясное правило - «не». Однако это не идеально во всех случаях.

операторы «using» должны идти только поверх файлов CPP, но не в заголовках, но это усложняет написание шаблонов, поскольку - для большинства компиляторов в ближайшем будущем - они должны находиться в заголовках.

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

YMMV с огромной командой или огромным проектом, который входит в одну компиляцию.

4 голосов
/ 06 ноября 2008

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

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

Итак, если ваш MY_TYPE используется во всем приложении, поместите его в глобальное пространство имен, в противном случае поместите его в именованное пространство имен.

3 голосов
/ 06 ноября 2008

Я совсем не согласен с использованием глобального пространства имен (ну, за исключением main, конечно). Для вещей, которые используются во всем приложении, вы можете просто использовать using namespace вверху ваших .cpp файлов после всех соответствующих #include строк.

...