среда, 19 ноября 2014 г.

[prog.flame] Масло маслянное?

Написал вчера вот такую строчку:

static const threading threading = THREADING;

Почему-то вспомнился термин тавтология ;)

Это я местами пытаюсь следовать стилю именования классов из C++/Boost, где не принято давать суффиксы _t именам нешаблонных классов. Если же вернуться к моему старому, проверенному годами, стилю, то было бы вот так:

static const threading_t threading = THREADING;

Тоже не образец изящного стиля, но для меня чуть понятнее.

Собственно, пока в C++ не начал широко использоваться STL, использование нотации с суффиксом _t для имен типов не вызывало особых сложностей. Но вот когда STL, а затем и Boost, пошел в массы, возникают штуки, когда суффикс не то, чтобы мешает, но выставляет наружу слишком много информации. Ну, например, если суффикс _t используется:

std::sort(a.begin(), a.end(), my_predicate_t(b, c, d));

tools::adaptor_t< reader_t, multithreading_t::safe, file_logger_t > adaptor;

Глядя на такой код программист понимает, что при вызове std::sort в качестве предиката создается экземпляр типа my_predicate_t. А в параметрах шаблона adaptor_t используются имена типов reader_t, multithreading_t, file_logger_t.

С одной стороны это хорошо. Но с другой, при сопровождении кода, это знание может только мешать. Например, если my_predicate должен стать вызовом возвращающей хитрый объект функции. Или, если со временем multithreading_t перестанет быть типом, а станет, скажем, пространством имен. А reader_t из типа превратится в константу. Если бы в коде было изначально записано вот так:

std::sort(a.begin(), a.end(), my_predicate(b, c, d));

tools::adaptor_t< reader, multithreading::safe, file_logger > adaptor;

То при сопровождении вообще менять бы ничего не пришлось.

На такие вещи я периодически натыкаюсь. И поэтому мой старый стиль именования типов мне иногда не нравится. А для имен типов, которые могут быть предикатами или параметрами шаблонов, стараюсь использовать имена без суффикса _t. Что терпимо, но некоторой шизофренией отдает: здесь _t используется, а вот здесь не используется, а вот здесь не понятно :(

С другой стороны, от суффикса _t оказываться так же не хочется. Ибо с ним можно запросто писать вот так:

threading_t threading = threading_t::single;
if( is_multicore_environment() )
   threading = threading_t::multi;

Не доводя дело до "масла масляного":

threading threading = threading::single;
if( is_multicore_environment() )
   threading = threading::multi;

PS. Как бы мелко эта тема не выглядела, она, тем не менее, затрагивает одну из фундаментальнейших и сложно разрешимых проблем в программировании: выбор удачных названий для идентификаторов ;)

PPS. CamelCase -- это пройденный этап. Кому интересно, отправляю в историю: "О том, как я от CamelCase к lower_case пришел".

Комментариев нет: