Pompanın doldurulması nedir? Bazen başlangıç ​​okuma olarak adlandırılır


17

Bana bu ifadeyi ve deseni gün içinde öğretti. Tabii, adı su pompalayabilmeden önce suyla doldurulması gereken eski pompalardan geliyor, ama kimin umurunda? Burada koddan bahsediyoruz.

Bazı gerçekten iyi örnekler ve modelin neyi başardığına dair bir açıklama memnuniyetle karşılanacaktır. Bu kalıp bugün nasıl değerlendiriliyor?

Hazırlama işlemi bazen arızalı bir döngüyü çalıştırabilir, ancak DRY pahasına olabilir . Bu nedenle, daha iyi bir tasarıma giden yolda kısa bir durak olabilir. Bu bir anti-desen olarak kabul edilir mi? Alternatif var mı?


1
Bir yığın akışı yanıtında ve bir kitapta "pompanın doldurulması" terimini bulacaksınız . Burada bulunan "okuma okuma" terimi hemen hemen aynı görünüyor.
candied_orange

Yanıtlar:


23

Bu metafor neredeyse kesinlikle bir whiledöngüde ilk koşullu denetimin oluşturulması pratiğini ifade eder . Bunu yapmazsanız , döngü çalışmaz. Bu köklü bir modeldir ve whiledöngü icat edildiğinden beri değişmemiştir . Bir whiledöngüde başlangıç ​​koşulunu ayarlama gereksinimi bir kusur değildir.

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

Primer bir okuma ifadesi veya başlangıç ​​koşulunu düzgün bir şekilde ayarlayan şey olabilir. Bir okuma ifadesi kullanarak başlangıç ​​koşulunu ayarlamaya "Hazırlama Okuma" denir.

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 # 'da, iki Readline()çağrı, koşul içinde tek bir ifadede birleştirilebilir:

while ((line = r.ReadLine()) != null)
{
    Console.WriteLine (line);
}

1
Güzel. Tam olarak aralarında bir T testi yapmak için A ve B yapmanız gereken zamanlar vardır. Alışılmış A T(B A)hazırlama düzeni bunu yapar ancak kopyalarını A yapar. Bu genel kalıba herhangi bir genel alternatif var mı?
candied_orange

2
Cevabımdaki son kod parçasına bakın.
Robert Harvey

Bu bir klasik. Hiç mola vermenizi tavsiye eder misiniz?
candied_orange

Eğer kod basitleştirir eğer bir döngü erken çıkışlarına karşı değilim. Bazen sadece yapabilirsiniz return.
Robert Harvey

1
Bir örnek, bir metin dosyasının her satırında bir dizenin ilk oluşumunu aramak olabilir. Döngüye hala ihtiyacınız olacak while, ancak dizeyi okuduğunuz satırda bulduğunuzda, ya breakda return.
Robert Harvey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.