Co zasysa pompę? Czasami nazywany czytaniem gruntowania

17

Nauczono mnie tego wyrażania i wzorców już dawno temu. Jasne, nazwa pochodzi od starych pomp, które musiały zostać napełnione wodą, zanim będą mogły pompować wodę, ale kogo to obchodzi? Mówimy tutaj o kodzie.

Mile widziane są niektóre naprawdę dobre przykłady i wyjaśnienie tego, co osiąga wzór. Jak dziś postrzegany jest ten wzorzec?

Zalewanie może czasami spowodować wadliwą pętlę, ale kosztem OSUSZANIA . Może to być krótki przystanek na drodze do lepszego projektu. Czy jest to uważane za anty-wzór? Czy są alternatywy?

candied_orange
źródło
1
Termin „zalewanie pompy” znajduje się w odpowiedzi na przepełnienie stosu i książce . Określenie „gruntowania czytać”, znalazł tutaj , wydaje się tak samo.
candied_orange 19.04.16

Odpowiedzi:

23

Ta metafora prawie na pewno odnosi się do praktyki ustanawiania pierwszej kontroli warunkowej w whilepętli. Jeśli tego nie zrobisz, pętla nie będzie działać. Jest to dobrze ugruntowany wzór i nie zmienił się od czasu whilewynalezienia pętli. Wymóg ustawienia warunku początkowego w whilepętli nie jest wadą.

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

Elementem startowym może być instrukcja odczytu lub cokolwiek, co poprawnie ustawia warunek początkowy. Ustawienie warunku początkowego za pomocą instrukcji read nazywa się „Priming Read”.

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.   
    }
}

W języku C # dwa Readline()połączenia można połączyć w jedną instrukcję w ramach warunku:

while ((line = r.ReadLine()) != null)
{
    Console.WriteLine (line);
}
Robert Harvey
źródło
1
Ładny. Są chwile, kiedy trzeba wykonać A i B, aby test T dokładnie między nimi. Zwykły A T(B A)wzorzec zalewania robi to, ale powiela się A. Jakieś ogólne alternatywy dla tego ogólnego wzorca?
candied_orange 19.04.16
2
Zobacz ostatni fragment kodu w mojej odpowiedzi.
Robert Harvey,
Ten jest klasykiem. Czy zaproponowałbyś kiedyś przerwę?
candied_orange 19.04.16
Nie jestem przeciwny wczesnemu wyjściu z pętli, jeśli upraszcza to kod. Czasami możesz po prostu return.
Robert Harvey
1
Przykładem może być szukanie pierwszego wystąpienia ciągu w każdej linii pliku tekstowego. Nadal musiałby się whilepętlę, ale kiedy okazało się, że ciąg w wierszu po prostu czytać, można albo breakalbo return.
Robert Harvey