Для аргументу ось зразок функції, яка друкує вміст даного файлу по черзі.
Версія 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
.