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