<分区>
创建一个名为“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)
我不知道你为什么要在类中定义枚举。如果你有一个专门用于日志记录的命名空间,那么在命名空间中定义所有与日志记录相关的东西。所以我更喜欢这个:
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
希望对您有所帮助。