Я нахожу, что то, что я считал "лучшей практикой" для использования пространства имен в С++, вредит читабельности моего кода и заставляет меня задаться вопросом, как их использовать.
Моя программа состоит из нескольких различных модулей, которые в основном встроены в библиотеки, которые использует "основное" приложение. Каждая библиотека использует свое собственное пространство имен, а их пространства имен являются "внутренними" пространствами имен проектов, чтобы помочь проекту против конфликтов имен с сторонним кодом. Поэтому я заканчиваю именами классов, такими как "myproject:: logging:: Logger" и "myproject:: reporting:: ReportType" (как составленные примеры).
Пока все хорошо. И в моих .cpp файлах у меня нет проблем. Например, я использую "using myproject:: logging" наверху и могу чисто ссылаться на мой класс Logging. В маловероятном случае конфликта между двумя моими пространствами имен я могу просто сказать, какой из них я хочу. Это хорошо работает.
Файлы заголовков разные. Он считал, что неправильная практика заключается в том, чтобы использовать операторы в заголовках, поскольку они будут влиять на несвязанный код, который их не ожидает. Поэтому я всегда полностью квалифицирую все имена в файлах .hpp. Это было несколько уродливо, но управляемо до сих пор, поэтому я смирился с этим. Но теперь я увеличиваю использование кода шаблона в своих библиотеках, а это значит, что в моих .hpp файлах есть гораздо более актуальный код. И, чтобы полностью квалифицировать каждое имя, он делает код практически нечитаемым из-за длины имен типов.
Я начинаю чувствовать, что преимущества пространства имен и наилучшей практики для их использования начинают перевешиваться непрочитанным кодом, который мне приходится писать. Я начинаю задаваться вопросом, лучше ли мне отказаться от использования пространств имен, чтобы получить преимущество от читаемого кода и исправлять любые конфликты имен, если и когда они появятся.
Альтернативой является использование коротких одноэлементных пространств имен, поэтому вместо "myproject:: logging:: Logger" я бы просто имел "log:: Logger", который бы очень помог, но вероятность того, что конфликты пространства имен значительно выше, а также пространства имен передают менее полезную информацию.
Как я уже сказал, это действительно влияет на код в .hpp файлах, так как я с радостью использую "использование пространства имен" в своих файлах реализации, чтобы сделать это управляемым, но это становится проблемой, поскольку я смотрю на свой шаблонный код в .hpp файлах и подумайте "eww....", что не может быть хорошим: P
Кто-нибудь получил практические советы?