best practices по поводу констант
От: FrozenHeart  
Дата: 24.01.14 10:00
Оценка:
Здравствуйте.

Вопрос по дизайну и правилам хорошего тона.

До недавних пор всё время придерживался политики "любой литерал в коде должен быть представлен в виде соответствующего макроса, добавленного в предкомпиляционный заголовочный файл или в какой-нибудь common.h". Делал я так даже в том случае, если контекст использования данной константы (по крайней мере, на текущий момент) сильно ограничен (например, она используется лишь внутри одной функции / класса / etc). С недавних пор решил поступать иначе — заводить константные объекты внутри этих самых модулей:

void foo()
{
    const int SOME_CONSTANT_VALUE = 0;
    // ...
}


class Foo
{
public:
    Foo() : SOME_CONSTANT_VALUE(0) {}

private:
    const int SOME_CONSTANT_VALUE;
};


Такой вариант мне тоже не очень нравится. Например, в классах, при наличии довольно большого кол-ва констант, будет(ут) довольно некрасивый(ые) конструктор(ы):

class Foo
{
public:
    Foo()
    : SOME_CONSTANT_VALUE(0)
    , ANOTHER_CONSTANT_VALUE(0.0)
    , YET_ANOTHER_CONSTANT_VALUE(0.0)
    , SOME_CONSTANT_VALUE_AGAIN(0.0) {}

private:
    const int SOME_CONSTANT_VALUE;
    const double ANOTHER_CONSTANT_VALUE;
    const double YET_ANOTHER_CONSTANT_VALUE;
    const double SOME_CONSTANT_VALUE_AGAIN;
};


Да, с delegating costructors из C++11 такое можно написать всего лишь в одном конструкторе, но особо положения дел это не меняет, на мой взгляд.

Более того, когда все константы вынесены в отдельный заголовочный файл, их проще находить и редактировать. При чтении же конкретного модуля, я думаю, не составит труда перейти на определение символа под курсором.

Да и смотрится это как-то, честно говоря, странно — вроде и член класса, но при этом константа. Не называть же объект как-нибудь _SOME_CONSTANT_VALUE, чтобы подчеркнуть и то, и другое?

Как Вы поступаете в подобных случаях?
avalon/1.0.433
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.