Недавно довелось увидеть что-то вроде вот такого:
void data_holder::validate_data() { std::cout << "*** Data validation: 1/15 (checking) ***" << std::endl; check(); std::cout << "*** Data validation: 2/15 (sorting) ***" << std::endl; sorting(); std::cout << "*** Data validation: 3/15 (deduplication) ***" << std::endl; deduplicate(); std::cout << "*** Data validation: 4/15 (normalization) ***" << std::endl; normalize(); ... // И так еще несколько строк пока не будет сделан шаг 15 из 15. } |
Вот честно, удивлен такому трудолюбию, т.к. меня бы быстро задолбало выписывать однотипные строки печати в std::cout с инкрементом значений в них. Особенно с учетом того, что количество этих шагов увеличивается по мере развития проекта :)
Так что я бы чуть ли не сразу написал бы что-то вроде:
void data_holder::validate_data() { constexpr int total_steps = 15; auto inform = [step = int{1}](const char * name) mutable { std::cout << "*** Data validation: " << step << "/" << total_steps << " (" << name << ") ***" << std::endl; ++step; }; inform("checking"); check(); inform("sorting"); sorting(); inform("deduplication"); deduplicate(); inform("normalization"); normalize(); ... // И так еще несколько строк пока не будет сделан шаг 15 из 15. } |
ИМХО, программист должен быть достаточно ленивым, чтобы не повторять однообразную рутинную работу. И еще он должен видеть повторяющиеся паттерны, которые можно преобразовать в повторно используемый код.
Ну и да, исходный пример заставляет вспомнить народную мудрость "простота хуже воровства".
Комментариев нет:
Отправить комментарий