Загрязнение глобального пространства имен

Я думаю, что большинство программистов на 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;

Какой ты предпочитаешь? Бывают ли случаи, когда допустимо использовать первый метод?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
3 371
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

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

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

Andreas Magnusson 06.11.2008 12:20

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

Не будем впадать в крайности: от того, чтобы вообще не использовать пространства имен, до отказа от глобального пространства имен ИМХО. Глобальное пространство имен и есть пространство имен. Что-то вроде CObject для классов MFC;) Тоже может пригодиться.

Marcin Gil 06.11.2008 11:17

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

Chris Jester-Young 06.11.2008 11:19

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

using ns::MY_TYPE;

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

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

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

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

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

Другие вопросы по теме