Создавая библиотеку с именем «snap», мне нужен класс с именем «log», который я помещаю в подпространство имен. Это нормально, если пространство имен тоже «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)
Я не знаю, почему вы определили перечисление внутри класса. Если вы выделили пространство имен для ведения журнала, то определите все связанные с ведением журнала вещи в пространстве имен. Поэтому я бы предпочел это вместо:
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
Надеюсь, это поможет.
Других решений пока нет …