3

创建一个名为“snap”的库,我想要一个名为“log”的类,我将它放在一个子命名空间中。如果命名空间也是“日志”可以吗?(我知道它在技术上有效,我想知道正确的命名约定,你会怎么做?)

namespace snap
{
  namespace log
  {
    class log {
      ...
      enum log_level_t { ..., LOG_LEVEL_ERROR, ... };
      ...
    };
  }
}

问题是我们最终会得到这样的结果:

snap::log::log::log_level_t ll(snap::log::log::LOG_LEVEL_ERROR);

你觉得这很奇怪吗?(即双::log::log)

4

1 回答 1

3

我不知道你为什么在类中定义了枚举。如果你有一个专门用于日志的命名空间,那么在命名空间中定义所有与日志相关的东西。所以我更喜欢这个:

namespace snap
{
  namespace log
  {
     enum log_level_t { ..., LOG_LEVEL_ERROR, ... };
     class log { };
  }
}

此外,由于命名空间log本身暗示了其中定义的内容,与日志记录相关(或应该与日志记录相关),我觉得其中的部分log似乎log_level_t是重复的。我会将上述内容进一步重构为:

namespace snap
{
  namespace logging //renamed
  {
     enum class level_t{verbose, info, error, ... }; //renamed, and used enum class!

     class logger { ... }; //renamed
  }
}

或者,也许,我会选择名称severity而不是level_t. 无论如何,在我看来,用法变得更好了:

logger.write(snap::logging::severity::error, message, etc);

或者你可以写一些友好的函数,这样你就可以这样写:

logger.verbose(message, etc);
logger.info(message, etc);
logger.error(message, etc);
//etc

希望有帮助。

于 2013-02-02T05:59:16.583 回答