Was macht die Pumpe an? Wird manchmal als Priming Read bezeichnet

17

Mir wurde dieser Ausdruck und dieses Muster vor langer Zeit beigebracht. Sicher, der Name kommt von alten Pumpen, die mit Wasser gefüllt werden mussten, bevor sie Wasser pumpen konnten, aber wen interessiert das? Wir sprechen hier über Code.

Einige wirklich gute Beispiele und eine Erklärung dessen, was das Muster leistet, wären willkommen. Wie wird dieses Muster heute gesehen?

Beim Grundieren funktioniert manchmal eine defekte Schleife, jedoch auf Kosten von DRY . So kann es ein kurzer Halt auf dem Weg zu einem besseren Design sein. Wird dies als Anti-Muster angesehen? Gibt es Alternativen?

kandierte_orange
quelle
1
Sie finden den Begriff "Ansaugen der Pumpe" in einer Stapelüberlaufantwort und einem Buch . Der Begriff "Grundierung lesen", der hier vorkommt , scheint ähnlich zu sein.
candied_orange

Antworten:

23

Diese Metapher bezieht sich mit ziemlicher Sicherheit auf die Praxis, die erste bedingte Prüfung in einer whileSchleife einzurichten. Wenn Sie dies nicht tun, funktioniert die Schleife nicht. Es ist ein etabliertes Muster, und es hat sich seit der whileErfindung der Schleife nicht geändert . Die Voraussetzung für die Einstellung der Ausgangsbedingung in einer whileSchleife ist kein Defekt.

int i = 0; // prime the pump
while (i < 10)
{
    Console.Write("While statement ");
    Console.WriteLine(i);
    i++; // set condition again
}

Der Primer kann eine gelesene Anweisung sein oder was auch immer die Ausgangsbedingung richtig einstellt. Das Festlegen der Anfangsbedingung mithilfe einer Leseanweisung wird als "Priming Read" bezeichnet.

string line;

using (StreamReader file = new StreamReader("c:\\test.txt"))
{
    line = file.ReadLine(); // Priming read.
    while(line != null)
    {
        Console.WriteLine (line);
        line = file.ReadLine(); // Subsequent reads.   
    }
}

In C # können die beiden Readline()Aufrufe innerhalb der Bedingung zu einer einzigen Anweisung zusammengefasst werden:

while ((line = r.ReadLine()) != null)
{
    Console.WriteLine (line);
}
Robert Harvey
quelle
1
Nett. Es gibt Zeiten, in denen Sie A und B ausführen müssen, damit ein Test T genau zwischen ihnen liegt. Das übliche A T(B A)Grundierungsmuster dupliziert dies aber A. Gibt es allgemeine Alternativen zu diesem allgemeinen Muster?
candied_orange
2
Siehe den letzten Code in meiner Antwort.
Robert Harvey
Das ist ein Klassiker. Würden Sie jemals vorschlagen, eine Pause einzulegen?
candied_orange
Ich bin nicht dagegen, eine Schleife vorzeitig zu beenden, wenn dies den Code vereinfacht. Manchmal kann man einfach return.
Robert Harvey
1
Ein Beispiel wäre die Suche nach dem ersten Vorkommen einer Zeichenfolge in jeder Zeile einer Textdatei. Sie würden die whileSchleife weiterhin benötigen , aber wenn Sie die Zeichenfolge in der gerade gelesenen Zeile gefunden haben, können Sie entweder breakoder return.
Robert Harvey