«Упаковывайте» значимые операции в тщательно именованные функции
Причина
Вынесение общего кода делает код более читаемым, повышает вероятность его повторного использования и ограничивает ошибки в сложном коде. Если что-то является чётко определённым действием, выделите его из окружающего кода и дайте ему имя.
Пример (не делайте так)
void read_and_print(istream& is) // читает и выводит int
{
int x;
if (is >> x)
cout << "the int is " << x << '\n';
else
cerr << "no int on input\n";
}
С read_and_print почти всё неправильно. Она читает, пишет (в фиксированный ostream), выводит сообщения об ошибках (в фиксированный ostream), обрабатывает только int. Нет ничего для повторного использования, логически отдельные операции перемешаны, а локальные переменные находятся в области видимости после окончания их логического использования. Для маленького примера это выглядит нормально, но если бы операции ввода, вывода и обработки ошибок были более сложными, запутанный код стал бы трудно понять.
Примечание
Если вы пишете нетривиальную лямбду, которая потенциально может быть использована в нескольких местах, дайте ей имя, присвоив её (обычно нелокальной) переменной.
Пример
sort(a, b, [](T x, T y) { return x.rank() < y.rank() && x.value() < y.value(); });
Именование этой лямбды разделяет выражение на его логические части и даёт сильный намёк на смысл лямбды.
auto lessT = [](T x, T y) { return x.rank() < y.rank() && x.value() < y.value(); };
sort(a, b, lessT);
Кратчайший код не всегда является наилучшим с точки зрения производительности или сопровождаемости.
Исключение
Тела циклов, включая лямбды, используемые в качестве тел циклов, редко нуждаются в именовании. Однако большие тела циклов (например, десятки строк или десятки страниц) могут быть проблемой. Правило «держите функции короткими и простыми» подразумевает «держите тела циклов короткими». Аналогично, лямбды, используемые в качестве аргументов обратного вызова, иногда нетривиальны, но вряд ли будут повторно использованы.
Контроль
- Смотрите «держите функции короткими и простыми»
- Помечать идентичные и очень похожие лямбды, используемые в разных местах.