Ради аргумента вот пример функции, которая печатает содержимое данного файла построчно.
Версия 1:
void printFile(const string & filePath) {
fstream file(filePath, ios::in);
string line;
while (std::getline(file, line)) {
cout << line << endl;
}
}
Я знаю, что рекомендуется, чтобы функции делали одну вещь на одном уровне абстракции. Для меня, хотя приведенный выше код делает в значительной степени одну вещь и является довольно атомным.
Некоторые книги (например, «Чистый код» Роберта Мартина), похоже, предлагают разбить приведенный выше код на отдельные функции.
Версия 2:
void printFile(const string & filePath) {
fstream file(filePath, ios::in);
printLines(file);
}
void printLines(fstream & file) {
string line;
while (std::getline(file, line)) {
printLine(line);
}
}
void printLine(const string & line) {
cout << line << endl;
}
Я понимаю, чего они хотят достичь (открыть файл / прочитать строки / напечатать строку), но не слишком ли это излишне?
Оригинальная версия проста и в некотором смысле уже делает одну вещь - печатает файл.
Вторая версия приведет к большому количеству действительно небольших функций, которые могут быть гораздо менее разборчивыми, чем первая версия.
Не лучше ли в этом случае иметь код в одном месте?
В какой момент парадигма «Делай одно» становится вредной?
printFile
, printLines
и , наконец printLine
.