Dla celów argumentu oto przykładowa funkcja, która drukuje zawartość danego pliku linia po linii.
Wersja 1:
void printFile(const string & filePath) {
fstream file(filePath, ios::in);
string line;
while (std::getline(file, line)) {
cout << line << endl;
}
}
Wiem, że zalecane jest, aby funkcje wykonywały jedną rzecz na jednym poziomie abstrakcji. Dla mnie powyższy kod robi prawie jedną rzecz i jest dość atomowy.
Niektóre książki (takie jak Czysty kod Roberta C. Martina) wydają się sugerować podzielenie powyższego kodu na osobne funkcje.
Wersja 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;
}
Rozumiem, co chcą osiągnąć (otwórz plik / przeczytaj linie / wydrukuj linię), ale czy nie jest to trochę przesada?
Oryginalna wersja jest prosta i w pewnym sensie już robi jedną rzecz - drukuje plik.
Druga wersja doprowadzi do dużej liczby naprawdę małych funkcji, które mogą być znacznie mniej czytelne niż pierwsza wersja.
Czy nie byłoby w tym przypadku lepiej mieć kod w jednym miejscu?
W którym momencie paradygmat „Do One Thing” staje się szkodliwy?
printFile
, printLines
i wreszcie printLine
.