Соглашение об именах между пространствами имен и классами в C ++?

Создавая библиотеку с именем «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)

1

Решение

Я не знаю, почему вы определили перечисление внутри класса. Если вы выделили пространство имен для ведения журнала, то определите все связанные с ведением журнала вещи в пространстве имен. Поэтому я бы предпочел это вместо:

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

Надеюсь, это поможет.

1

Другие решения

Других решений пока нет …