Functions
F.2
Функция должна выполнять единственную логическую операцию
Причина
Функция, выполняющая единственную операцию, проще для понимания, тестирования и повторного использования.
Пример
Рассмотрим:
void read_and_print() // плохо
{
int x;
cin >> x;
// проверка ошибок
cout << x << "\n";
}
Это монолит, привязанный к конкретному вводу, который никогда не найдёт другого (иного) применения. Вместо этого разбейте функции на подходящие логические части и параметризуйте:
int read(istream& is) // лучше
{
int x;
is >> x;
// проверка ошибок
return x;
}
void print(ostream& os, int x)
{
os << x << "\n";
}
Теперь их можно комбинировать по мере необходимости:
void read_and_print()
{
auto x = read(cin);
print(cout, x);
}
При необходимости мы могли бы дополнительно шаблонизировать read() и print() по типу данных, механизму ввода/вывода, реакции на ошибки и т.д. Например:
auto read = [](auto& input, auto& value) // лучше
{
input >> value;
// проверка ошибок
};
void print(auto& output, const auto& value)
{
output << value << "\n";
}
Контроль
- Считать подозрительными функции с более чем одним «выходным» параметром. Используйте возвращаемые значения, включая
tupleдля нескольких возвращаемых значений. - Считать подозрительными «крупные» функции, которые не помещаются на один экран редактора. Рассмотрите возможность разбиения такой функции на меньшие, хорошо именованные подоперации.
- Считать подозрительными функции с 7 или более параметрами.