繁体   English   中英

实现文件中命名的命名空间,用于对const字符串文字进行分组 - 好/坏?

[英]Named namespace in implementation file to group const string literals - Good/Bad?

我已经将几个消息字符串分组到.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类成员?

我承认这对我正在编写的小程序来说可能有些过分,因为它们可能只用于这些函数,但一般来说不是硬编码消息字符串是一个好习惯吗?

没关系,我想,你不会失去任何积分。 我对“最佳实践”一词并不在意,这不是一种常见的做法。 许多程序都是以本地化为基础编写的,有数十亿潜在客户不懂英语。 没有标准的C ++解决方案,只是您平台上的常见做法。 像字符串资源。

这是一般的好习惯还是存在陷阱,我没有看到?

使用命名空间来执行此操作似乎没有任何问题。

我经常看到在命名空间中放置常量值和全局配置变量(可能是在定义cpp之外访问它们)是一种很好的做法。 这样你就不必为分组创建一个类,你仍然可以使用名称封装工作。

如果静态关键字位于这样的文件范围命名空间中,那么它是否必要?

这不是必需的。

在最佳实践和公认的C ++习语和风格方面,这会像匿名命名空间一样更好吗? 或者只是作为静态const类成员?

静态类成员将是过度和无意义的。 如果您不需要实例,请不要编写类。

仅当代码仅限于特定CPP文件时,匿名命名空间才有用。

我承认这对我正在编写的小程序来说可能有些过分,因为它们可能只用于这些函数,但一般来说不是硬编码消息字符串是一个好习惯吗?

遵循DRY原则,看起来你做得很好,即使是一个小程序,即使你认为你的常量只会使用一次。 因为最终你永远不知道未来是什么。

如果您想要清晰度,这是可以的。

我的偏好通常是:

  1. 定义没有名称空间的文件级静态变量(对于我来说,这些变量总是在文件顶部附近)。
  2. 定义匿名命名空间并使用非静态变量。
  3. 将定义放在我子系统的私有部分中,放在自己的文件中,并带有头文件。

在特定情况下,我确实使用了您描述的方法,这是一个错误。 我有相当大的文件3000+行与许多内部类。 回想起来,我应该将我的作用域放在子系统内部的单独文件中。

一般来说,我喜欢简单的东西1或2,复杂/大的东西3。

这是一般的好习惯还是存在陷阱,我没有看到?

如果使代码更清晰,则在命名空间中对相关对象进行分组是很好的做法。 没有任何特殊的陷阱,但如果你不小心,深层嵌套的命名空间可能导致过于冗长的代码。

如果静态关键字位于这样的文件范围命名空间中,那么它是否必要?

您需要staticconst来为它们提供内部链接,但最好将命名空间封装在未命名的命名空间中。 不推荐在命名空间范围内使用static ,只使用const意味着如果有人声明具有相同名称的extern对象,您会感到惊讶。

在最佳实践和公认的C ++习语和风格方面,这会像匿名命名空间一样更好吗? 或者只是作为静态const类成员?

如果将它们分组到命名空间中会使代码更具表现力,那就去做吧; 否则,不要。 除非必要,否则我不想让它们成为类成员,以避免向头文件添加不必要的声明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM