¿Qué es cebar la bomba? A veces se llama lectura de preparación

17

Me enseñaron esta expresión y patrón en el pasado. Claro, el nombre proviene de viejas bombas que debían llenarse con agua antes de poder bombear agua, pero ¿a quién le importa? Estamos hablando de código aquí.

Algunos ejemplos realmente buenos y una explicación de lo que logra el patrón serían bienvenidos. ¿Cómo se considera este patrón hoy?

El cebado a veces puede hacer que funcione un bucle defectuoso, pero a costa de DRY . Por lo tanto, puede ser una breve parada en el camino hacia un mejor diseño. ¿Se considera esto un antipatrón? ¿Hay alternativas?

naranja confitada
fuente
1
Encontrará el término "cebar la bomba" en una respuesta de stackoverflow y un libro . El término "lectura de preparación", que se encuentra aquí , parece muy similar.
candied_orange

Respuestas:

23

Esta metáfora casi seguramente se refiere a la práctica de establecer la primera verificación condicional en un whilebucle. Si no haces esto, el bucle no funcionará. Es un patrón bien establecido, y no ha cambiado desde que whilese inventó el ciclo. El requisito para establecer la condición inicial en un whilebucle no es un defecto.

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

La cartilla puede ser una declaración de lectura o lo que establezca correctamente la condición inicial. El establecimiento de la condición inicial mediante una instrucción de lectura se denomina "Lectura de cebado".

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 #, las dos Readline()llamadas se pueden combinar en una sola declaración dentro del condicional:

while ((line = r.ReadLine()) != null)
{
    Console.WriteLine (line);
}
Robert Harvey
fuente
1
Agradable. Hay momentos en los que necesita hacer A y B en orden con una prueba T exactamente entre ellos. El A T(B A)patrón de cebado habitual hace esto pero duplica A. ¿Alguna alternativa general a este patrón general?
candied_orange
2
Vea el último fragmento de código en mi respuesta.
Robert Harvey
Ese es un clásico. ¿Alguna vez sugeriría usar un descanso?
candied_orange
No me opongo a las salidas tempranas de un bucle si hacerlo simplifica el código. A veces puedes simplemente return.
Robert Harvey
1
Un ejemplo sería buscar la primera aparición de una cadena en cada línea de un archivo de texto. Aún necesitaría el whilebucle, pero una vez que encuentre la cadena en la línea que acaba de leer, podría breako bien return.
Robert Harvey