Pour des raisons d'argument, voici un exemple de fonction qui imprime le contenu d'un fichier donné ligne par ligne.
Version 1:
void printFile(const string & filePath) {
fstream file(filePath, ios::in);
string line;
while (std::getline(file, line)) {
cout << line << endl;
}
}
Je sais qu'il est recommandé que les fonctions fassent une chose à un niveau d'abstraction. Pour moi, bien que le code ci-dessus fasse à peu près une chose et soit assez atomique.
Certains livres (comme le Clean Code de Robert C. Martin) semblent suggérer de diviser le code ci-dessus en fonctions distinctes.
Version 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;
}
Je comprends ce qu'ils veulent réaliser (ouvrir un fichier / lire des lignes / imprimer une ligne), mais n'est-ce pas un peu exagéré?
La version originale est simple et dans un certain sens fait déjà une chose - imprime un fichier.
La deuxième version entraînera un grand nombre de fonctions très petites qui peuvent être beaucoup moins lisibles que la première version.
Ne serait-il pas préférable, dans ce cas, d'avoir le code en un seul endroit?
À quel moment le paradigme "Do One Thing" devient-il nuisible?
printFile
, printLines
et enfin printLine
.