Che cos'è l'adescamento della pompa? A volte chiamato lettura di priming


17

Mi è stato insegnato questa espressione e questo modello molto tempo fa. Certo, il nome deriva da vecchie pompe che dovevano essere riempite d'acqua prima che potessero pompare acqua, ma a chi importa? Stiamo parlando di codice qui.

Sarebbero benvenuti alcuni esempi davvero validi e una spiegazione di ciò che il modello realizza. Come viene considerato questo modello oggi?

L'adescamento a volte può far funzionare un loop difettoso ma a costo di DRY . Quindi potrebbe essere una breve sosta sulla strada per un design migliore. Questo è considerato un anti pattern? Ci sono alternative?


1
Troverai il termine "innesco della pompa" in una risposta stackoverflow e in un libro . Il termine "priming read", trovato qui , sembra più o meno lo stesso.
candied_orange,

Risposte:


23

Questa metafora si riferisce quasi certamente alla pratica di stabilire il primo controllo condizionale in un whileciclo. Se non lo fai, il ciclo non funzionerà. È un modello ben consolidato e non è cambiato da quando è whilestato inventato il loop. Il requisito per impostare la condizione iniziale in un whileloop non è un difetto.

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

Il primer può essere un'istruzione read o qualunque cosa imposta correttamente la condizione iniziale. L'impostazione della condizione iniziale mediante un'istruzione read viene chiamata "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.   
    }
}

In C #, le due Readline()chiamate possono essere combinate in una singola istruzione all'interno del condizionale:

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

1
Bello. Ci sono momenti in cui devi fare A e B in ordine con un test T esattamente tra di loro. Il solito A T(B A)schema di priming fa questo ma duplica A. Qualche alternativa generale a questo schema generale?
candied_orange

2
Vedi l'ultimo bit di codice nella mia risposta.
Robert Harvey,

Questo è un classico. Consiglieresti mai di usare una pausa?
candied_orange,

Non sono contrario alle prime uscite da un ciclo se ciò semplifica il codice. A volte puoi solo return.
Robert Harvey,

1
Un esempio potrebbe essere la prima occorrenza di una stringa in ciascuna riga di un file di testo. Avresti ancora bisogno del whileciclo, ma una volta trovata la stringa nella riga che hai appena letto, potresti o breako return.
Robert Harvey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.