Ich würde hier einen Schritt zurück machen. Sie konzentrieren sich auf die wählerischen Details des Codes, übersehen aber das größere Bild. Werfen wir einen Blick auf eine Ihrer Beispielschleifen:
int offset = 0;
while(true)
{
Record r = Read(offset);
if(r == null)
{
break;
}
// do work
offset++;
}
Was bedeutet dieser Code? Die Bedeutung ist "Arbeiten Sie an jedem Datensatz in einer Datei". Aber so sieht der Code nicht aus . Der Code sieht wie folgt aus: "Versatz beibehalten. Datei öffnen. Schleife ohne Endebedingung eingeben. Datensatz lesen. Auf Nullheit prüfen." Das alles, bevor wir zur Arbeit kommen! Die Frage, die Sie stellen sollten, lautet: " Wie kann ich sicherstellen, dass das Erscheinungsbild dieses Codes mit der Semantik übereinstimmt? "
foreach(Record record in RecordsFromFile())
DoWork(record);
Jetzt liest sich der Code wie beabsichtigt. Trennen Sie Ihre Mechanismen von Ihrer Semantik . In Ihrem ursprünglichen Code mischen Sie den Mechanismus - die Details der Schleife - mit der Semantik - der Arbeit, die für jeden Datensatz geleistet wurde.
Jetzt müssen wir umsetzen RecordsFromFile()
. Wie lässt sich das am besten umsetzen? Wen interessiert das? Das ist nicht der Code, den sich irgendjemand ansehen wird. Es ist ein grundlegender Mechanismuscode und seine zehn Zeilen lang. Schreibe es wie du willst. Wie wäre es damit?
public IEnumerable<Record> RecordsFromFile()
{
int offset = 0;
while(true)
{
Record record = Read(offset);
if (record == null) yield break;
yield return record;
offset += 1;
}
}
Jetzt, da wir eine träge berechnete Folge von Datensätzen manipulieren, werden alle möglichen Szenarien möglich:
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);
Und so weiter.
Fragen Sie sich, wann immer Sie eine Schleife schreiben: "Liest diese Schleife wie ein Mechanismus oder wie die Bedeutung des Codes?" Wenn die Antwort "wie ein Mechanismus" ist, versuchen Sie, diesen Mechanismus auf seine eigene Methode zu verschieben, und schreiben Sie den Code, um die Bedeutung sichtbarer zu machen.