Именованное пространство имен в файле реализации для группировки строковых литералов констант - хорошо / плохо? - PullRequest
3 голосов
/ 11 августа 2010

Я сгруппировал несколько строк сообщений в именованное (неанонимное) пространство имен в файле .cpp для вывода обработки класса, как видно из кода ниже:

namespace Messages
{
  static const std::string AppTitle = "The Widgetizer - Serving all your Widget needs";
  static const std::string SuccessMsg = "Great success! Widgets for all! ";
  static const std::string FailMsg = "No widgets for you!";
};

void Display::printTitle()
{
  out << Messages::AppTitle << std::endl;
}

void Display::printSuccessMsg()
{
  out << Messages::SuccessMsg << std::endl;
}

void Display::printFailMsg()
{
  out << Messages::FailMsg << std::endl;
}

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

Это вообще хорошая практика или есть подводные камни, которых я не вижу?

Нужно ли статическое ключевое слово, если оно находится в пространстве имен области файла, как это?

С точки зрения передового опыта и принятой идиомы и стиля C ++, было бы лучше, если бы это было анонимное пространство имен? Или просто как статические члены класса const?

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

Ответы [ 4 ]

1 голос
/ 11 августа 2010

Я думаю, все в порядке, вы не потеряете ни одного очка за это. Меня не волнует термин «лучшая практика», это не обычная практика. Многие программы написаны с учетом локализации, есть несколько миллиардов потенциальных клиентов, которые не понимают по-английски. Никакого стандартного решения C ++ для этого, только обычные практики на вашей платформе. Как строковые ресурсы.

0 голосов
/ 11 августа 2010

Это хорошая практика в целом или есть подводные камни, которых я не вижу?

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

Нужно ли ключевое слово static, если они находятся в пространстве имен области файла, например?

Вам нужно либо static, либо const, чтобы дать им внутреннюю связь, но может быть лучше вместо этого заключить ваше пространство имен в безымянное пространство имен.Использование static в области имен не рекомендуется, а просто использование const означает, что вы будете удивлены, если кто-то объявит extern объекты с одинаковыми именами.принятая идиома и стиль C ++, лучше ли это как анонимное пространство имен?Или просто как статические члены класса const?

Если группировка их в именованном пространстве имен делает код более выразительным, то сделайте это;иначе не надо.Я бы предпочел не делать их членами класса без необходимости, чтобы избежать добавления ненужных объявлений в заголовочный файл.

0 голосов
/ 11 августа 2010

Это нормально, если вы хотите ясности.

Обычно я предпочитаю:

  1. Чтобы определить статические переменные уровня файла без пространства имен (для меня они всегда находятся в начале файла).
  2. Чтобы определить анонимное пространство имен и использовать нестатические переменные.
  3. Поместите определения в приватную часть моей подсистемы в отдельный файл с заголовочным файлом.

В конкретном случае, когда я использовал описанный вами метод, это была ошибка. У меня был довольно большой файл 3000+ строк с несколькими внутренними классами. Оглядываясь назад, я должен был поместить свои классы области в отдельные файлы во внутренней части моей подсистемы.

Обычно я предпочитаю 1 или 2 для простых вещей и 3 для сложных / больших вещей.

0 голосов
/ 11 августа 2010

Это хорошая практика в целом или есть ли подводные камни к этому, что я не видишь?

Похоже, что нет проблем с использованием пространства имен для этого.

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

Нужно ли статическое ключевое слово, если они находятся в пространстве имен области файла, как это?

Это не обязательно.

С точки зрения передового опыта и принятой идиомы и стиля C ++, было бы лучше, если бы это было анонимное пространство имен? Или просто как статические члены класса const?

Статический член класса был бы излишним и бессмысленным. Если вам не нужен экземпляр, не пишите класс.

Анонимное пространство имен будет полезно, только если код ограничен конкретным файлом CPP.

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

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

...