Що грунтує насос? Іноді називають прочитаним праймером


17

Мене вчили цього висловлювання та зразка ще в той час. Звичайно, назва походить від старих насосів, які потрібно було наповнити водою, перш ніж вони могли перекачувати воду, але кого це хвилює? Тут ми говоримо про код.

Кілька справді хороших прикладів та пояснення того, що досягається закономірністю, було б бажано. Як ця закономірність розглядається сьогодні?

Іноді грунтовка може отримати несправний цикл, що працює, але ціною DRY . Тож це може бути коротка зупинка на шляху до кращого дизайну. Чи вважається це анти-схемою? Чи є альтернативи?


1
Ви знайдете термін "заправка насоса" у відповіді stackoverflow та книзі . Знайдений тут термін "ґрунтовка читання" здається майже однаковим.
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
}

Буквар може бути прочитаним твердженням або будь-яким правильним чином встановити початкову умову. Встановлення початкової умови за допомогою оператора читання називається "Зачитування читання".

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)шаблон грунтовки робить це, але дублює А. Будь-які загальні альтернативи цьому загальному шаблону?
candied_orange

2
Дивіться останній біт коду у моїй відповіді.
Роберт Харві

Це класика. Ви б коли-небудь запропонували скористатися перервою?
candied_orange

Я не проти раннього виходу з циклу, якщо це спрощує код. Іноді можна просто return.
Роберт Харві

1
Прикладом може бути пошук першого рядка в кожному рядку текстового файлу. Вам все одно знадобиться whileцикл, але як тільки ви знайшли рядок у рядку, який ви щойно прочитали, ви могли breakабо return.
Роберт Харві
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.