Держите функции короткими и простыми
Причина
Большие функции трудно читать, с большей вероятностью содержат сложный код и с большей вероятностью имеют переменные в более широких, чем минимально необходимые, областях видимости. Функции со сложными управляющими структурами с большей вероятностью длинные и с большей вероятностью скрывают логические ошибки.
Пример
Рассмотрим:
double simple_func(double val, int flag1, int flag2)
// simple_func: принимает значение и вычисляет ожидаемый выход ASIC,
// с учётом двух флагов режима.
{
double intermediate;
if (flag1 > 0) {
intermediate = func1(val);
if (flag2 % 2)
intermediate = sqrt(intermediate);
}
else if (flag1 == -1) {
intermediate = func1(-val);
if (flag2 % 2)
intermediate = sqrt(-intermediate);
flag1 = -flag1;
}
if (abs(flag2) > 10) {
intermediate = func2(intermediate);
}
switch (flag2 / 10) {
case 1: if (flag1 == -1) return finalize(intermediate, 1.171);
break;
case 2: return finalize(intermediate, 13.1);
default: break;
}
return finalize(intermediate, 0.);
}
Это слишком сложно. Как вы узнаете, все ли возможные альтернативы обработаны корректно? Да, эта функция нарушает и другие правила.
Мы можем реструктурировать:
double func1_muon(double val, int flag)
{
// ???
}
double func1_tau(double val, int flag1, int flag2)
{
// ???
}
double simple_func(double val, int flag1, int flag2)
// simple_func: принимает значение и вычисляет ожидаемый выход ASIC,
// с учётом двух флагов режима.
{
if (flag1 > 0)
return func1_muon(val, flag2);
if (flag1 == -1)
// обрабатывается в func1_tau: flag1 = -flag1;
return func1_tau(-val, flag1, flag2);
return 0.;
}
Примечание
«Не помещается на экране» часто является хорошим практическим определением «слишком большой». Функции от одной до пяти строк следует считать нормальными.
Примечание
Разбивайте большие функции на меньшие связные именованные функции. Маленькие простые функции легко встраиваются там, где стоимость вызова функции значительна.
Контроль
Насколько большой экран? Попробуйте 60 строк по 140 символов; это примерно максимум, удобный для страницы книги.
- Помечать функции, которые «не помещаются на экране».
- Помечать слишком сложные функции. Насколько сложно — это слишком? Можно использовать цикломатическую сложность. Попробуйте «более 10 логических путей через функцию». Считайте простой switch одним путём.