Что заправляет насос? Иногда называется начальным чтением

17

Меня учили этому выражению и образцу еще в тот день. Конечно, название происходит от старых насосов, которые нужно было заполнить водой, прежде чем они могли качать воду, но кого это волнует? Мы говорим о коде здесь.

Хотелось бы получить несколько действительно хороших примеров и объяснение того, что делает шаблон. Как эта модель рассматривается сегодня?

Заправка может иногда привести к повреждению петли, но за счет СУХОГО . Так что это может быть краткая остановка на пути к лучшему дизайну. Это считается анти паттерном? Есть ли альтернативы?

candied_orange
источник
1
Вы найдете термин "прокачка насоса" в ответе на переполнение стека и в книге . Термин «чтение заправки», найденный здесь , кажется почти таким же.
candied_orange

Ответы:

23

Эта метафора почти наверняка относится к практике установления первой условной проверки в whileцикле. Если вы этого не сделаете, цикл не будет работать. Это устоявшийся шаблон, и он не изменился с тех пор, как whileбыл изобретен цикл. Требование для установки начального условия в whileцикле не является дефектом.

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

Праймер может быть оператором чтения или любым другим, правильно устанавливающим начальное условие. Установка начального условия с помощью оператора чтения называется «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.   
    }
}

В C # два Readline()вызова могут быть объединены в один оператор в условном выражении:

while ((line = r.ReadLine()) != null)
{
    Console.WriteLine (line);
}
Роберт Харви
источник
1
Ницца. Есть моменты, когда вам нужно выполнить A и B по порядку с тестом T точно между ними. Обычная A T(B A)схема заливки делает это, но дублирует A. Какие-нибудь общие альтернативы этой общей схеме?
candied_orange
2
Смотрите последний бит кода в моем ответе.
Роберт Харви
Это классика. Вы когда-нибудь предлагали бы использовать перерыв?
candied_orange
Я не против ранних выходов из цикла, если это упрощает код. Иногда ты можешь просто return.
Роберт Харви
1
Примером будет поиск первого вхождения строки в каждой строке текстового файла. Вам все равно понадобится whileцикл, но как только вы найдете строку в только что прочитанной строке, вы можете либо либо, breakлибо return.
Роберт Харви