创建一个名为“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);
这对你来说有点奇怪吗? (即double :: log :: log)
答案 0 :(得分:2)
我不知道为什么你在课堂上定义了枚举。如果您已将`命名空间专用于日志记录,则在命名空间中定义所有与日志记录相关的内容。所以我更喜欢这个:
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
希望有所帮助。