Je ferais un pas en arrière ici. Vous vous concentrez sur les détails pointilleux du code mais manquez l'image plus grande. Jetons un coup d'œil à l'une de vos boucles d'exemple:
int offset = 0;
while(true)
{
Record r = Read(offset);
if(r == null)
{
break;
}
// do work
offset++;
}
Quelle est la signification de ce code? La signification est "faire un travail sur chaque enregistrement d'un fichier". Mais ce n'est pas à cela que ressemble le code . Le code ressemble à "maintenir un décalage. Ouvrez un fichier. Entrez une boucle sans condition de fin. Lisez un enregistrement. Testez la nullité." Tout ça avant d'arriver au travail! La question que vous devriez poser est " comment puis-je faire en sorte que l'apparence de ce code corresponde à sa sémantique? " Ce code devrait être:
foreach(Record record in RecordsFromFile())
DoWork(record);
Maintenant, le code se lit comme son intention. Séparez vos mécanismes de votre sémantique . Dans votre code d'origine, vous mélangez le mécanisme - les détails de la boucle - avec la sémantique - le travail effectué pour chaque enregistrement.
Maintenant, nous devons mettre en œuvre RecordsFromFile()
. Quelle est la meilleure façon de mettre cela en œuvre? On s'en fout? Ce n'est pas le code que quiconque va consulter. C'est le code du mécanisme de base et ses dix lignes. Écrivez-le comme vous le souhaitez. Que dis-tu de ça?
public IEnumerable<Record> RecordsFromFile()
{
int offset = 0;
while(true)
{
Record record = Read(offset);
if (record == null) yield break;
yield return record;
offset += 1;
}
}
Maintenant que nous manipulons une séquence d'enregistrements calculée paresseusement, toutes sortes de scénarios deviennent possibles:
foreach(Record record in RecordsFromFile().Take(10))
DoWork(record);
foreach(Record record in RecordsFromFile().OrderBy(r=>r.LastName))
DoWork(record);
foreach(Record record in RecordsFromFile().Where(r=>r.City == "London")
DoWork(record);
Etc.
Chaque fois que vous écrivez une boucle, demandez-vous "cette boucle se lit-elle comme un mécanisme ou comme le sens du code?" Si la réponse est "comme un mécanisme", essayez de déplacer ce mécanisme dans sa propre méthode et écrivez le code pour rendre la signification plus visible.