Подтвердить что ты не робот

Согласованный подход для переименования пространств имен в С++

При использовании вложенных пространств имен иногда полностью квалифицированные имена заканчиваются довольно длинными. Я знаю, что я могу использовать namespace abc = aaa::bbb::ccc для уменьшения количества ввода (это может также улучшить читаемость в некоторых случаях).

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

Например, допустим что-то вроде:

project
  |- client
  |   |- core
  |   |- plugin
  |   |- util
  |- server
      ...

Я думал создать один заголовок для каталога, включая сокращенные имена. Например, project/client/core/core.h будет содержать namespace pr_cl_core = project::client::core (я знаю, пример для этого короткого имени довольно беден, но в реальных проектах они имеют больше смысла). Затем я включил бы core.h во все файлы заголовков в project/client/core, чтобы, когда заголовок из этого каталога включен, скажем, project/client/plugin/plugin_foo.h, короткие версии пространства имен легко доступны.

Это хороший подход? Есть ли другой лучший способ?

Я нашел несколько вопросов о пространствах имен С++ на SO (например, 1 и 2), но ни одна из них не связана с тем, как разрешать переименование пространства имен в рамках всего проекта.

EDIT: Кроме того, такой механизм можно использовать для систематического переименования длинных пространств имен (например, Boost) для всего проекта. Например, я обычно переименовываю некоторые пространства имен, например:

namespace ip = boost::asio::ip;
namespace ptime = boost::posix_time;

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

4b9b3361

Ответ 1

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

Предположим, что у вас будет то же самое с классами, многократно находясь набрав obj->sub()->subsub()->some_method(). Это было бы нарушением закона Закона Деметры. В случае классов вы должны реорганизовать свой код (путем написания функций обертки), чтобы классы в иерархии имели доступ только к методам на один уровень вверх.

То же самое должно быть сделано с пространствами имен: если вы должны вызвать project::client::core, тогда вы должны написать функции/классы оболочки в client, чтобы вывести необходимые интерфейсы в project. Если вам нужно сделать это повсюду, почему бы не сгладить структуру пространства имен, чтобы client и core находились на одном уровне?

Тот факт, что Boost использует вложенное пространство имен, отчасти истинно, потому что большинство вложенных пространств имен, таких как aux и detail, не должны вызываться клиентами. Например. Boost.MPL - действительно хороший пример библиотеки, которая осторожно не предоставляет скрытые пространства имен.