ポンプのプライミングとは何ですか?プライミング読み取りとも呼ばれます


17

私はこの表現とパターンを昔に教えられました。確かに、その名前は、水を汲み出す前に水で満たす必要があった古いポンプに由来しますが、誰が気にしますか?ここでコードについて話しています。

いくつかの本当に良い例と、パターンが達成することの説明は歓迎されます。このパターンは今日どのように考えられていますか?

プライミングは時々、欠陥のあるループを動作させることができますが、DRYを犠牲にします。したがって、より良い設計への道の途中で一時停止することがあります。これはアンチパターンと見なされますか?代替手段はありますか?


1
stackoverflowの回答本に「ポンプの呼び水」という用語があります。見つかった用語「読み取りをプライミング」、 ここでは、ほぼ同じようです。
candied_orange

回答:


23

この比phorは、ほぼ確実に、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()、条件内で2つの呼び出しを1つのステートメントに結合できます。

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
ロバートハーヴェイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.