Qu'est-ce que l'amorçage de la pompe? Parfois appelée lecture d'amorçage

17

On m'a appris cette expression et ce modèle à l'époque. Bien sûr, le nom vient de vieilles pompes qui devaient être remplies d'eau avant de pouvoir pomper de l'eau, mais qui s'en soucie? Nous parlons de code ici.

De très bons exemples et une explication de ce que le modèle accomplit seraient les bienvenus. Comment ce modèle est-il considéré aujourd'hui?

L'amorçage peut parfois faire fonctionner une boucle défectueuse, mais au prix de SEC . Il peut donc s'agir d'un bref arrêt sur la voie d'un meilleur design. Est-ce considéré comme un motif anti? Existe-t-il des alternatives?

candied_orange
la source
1
Vous trouverez le terme "amorçage de la pompe" dans une réponse stackoverflow et un livre . Le terme "amorçage lu", trouvé ici , semble à peu près le même.
candied_orange

Réponses:

23

Cette métaphore se réfère presque certainement à la pratique consistant à établir la première vérification conditionnelle dans une whileboucle. Si vous ne le faites pas, la boucle ne fonctionnera pas. C'est un modèle bien établi et il n'a pas changé depuis que la whileboucle a été inventée. L'obligation de définir la condition initiale dans une whileboucle n'est pas un défaut.

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

L'amorce peut être une instruction de lecture, ou tout ce qui définit correctement la condition initiale. La définition de la condition initiale à l'aide d'une instruction de lecture est appelée "lecture d'amorçage".

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.   
    }
}

En C #, les deux Readline()appels peuvent être combinés en une seule instruction dans le conditionnel:

while ((line = r.ReadLine()) != null)
{
    Console.WriteLine (line);
}
Robert Harvey
la source
1
Agréable. Il y a des moments où vous devez faire A et B dans l'ordre avec un test T exactement entre eux. Le A T(B A)modèle d'amorçage habituel fait cela mais reproduit A. Des alternatives générales à ce modèle général?
candied_orange
2
Voir le dernier morceau de code dans ma réponse.
Robert Harvey
Celui-là est un classique. Souhaitez-vous jamais suggérer d'utiliser une pause?
candied_orange
Je ne suis pas opposé aux sorties précoces d'une boucle si cela simplifie le code. Parfois, vous pouvez simplement return.
Robert Harvey
1
Un exemple serait de rechercher la première occurrence d'une chaîne dans chaque ligne d'un fichier texte. Vous auriez toujours besoin de la whileboucle, mais une fois que vous avez trouvé la chaîne dans la ligne que vous venez de lire, vous pouvez soit breakou return.
Robert Harvey