O que está preparando a bomba? Às vezes chamado de leitura primária

17

Foi-me ensinado essa expressão e padrão na época. Claro, o nome vem de bombas antigas que precisavam ser enchidas com água antes que pudessem bombear água, mas quem se importa? Estamos falando de código aqui.

Alguns bons exemplos e uma explicação do que o padrão realiza são bem-vindos. Como esse padrão é considerado hoje?

Às vezes, a preparação pode obter um loop defeituoso funcionando, mas ao custo de DRY . Portanto, pode ser uma breve parada no caminho para um design melhor. Isso é considerado um anti-padrão? Existem alternativas?

candied_orange
fonte
1
Você encontrará o termo "condicionar a bomba" em uma resposta do stackoverflow e em um livro . O termo "leitura primária", encontrado aqui , parece muito o mesmo.
candied_orange

Respostas:

23

Essa metáfora quase certamente se refere à prática de estabelecer a primeira verificação condicional em um whileloop. Se você não fizer isso, o loop não funcionará. É um padrão bem estabelecido e não mudou desde que o whileloop foi inventado. O requisito para definir a condição inicial em um whileloop não é um defeito.

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

O iniciador pode ser uma instrução de leitura ou o que definir adequadamente a condição inicial. Definir a condição inicial usando uma instrução de leitura é chamado de "Leitura de preparação".

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

Em C #, as duas Readline()chamadas podem ser combinadas em uma única instrução dentro do condicional:

while ((line = r.ReadLine()) != null)
{
    Console.WriteLine (line);
}
Robert Harvey
fonte
1
Agradável. Há momentos em que você precisa fazer A e B em ordem com um teste T exatamente entre eles. O A T(B A)padrão de priming usual faz isso, mas duplica A. Alguma alternativa geral a esse padrão geral?
Candied_orange
2
Veja o último pedaço de código na minha resposta.
19416 Robert Harvey
Esse é um clássico. Você sugeriria uma pausa?
Candied_orange
Não sou contra as saídas antecipadas de um loop, se isso simplificar o código. Às vezes você pode apenas return.
21716 Robert Harvey
1
Um exemplo seria procurar a primeira ocorrência de uma string em cada linha de um arquivo de texto. Você ainda precisaria do whileloop, mas uma vez que você encontrou a string na linha que acabou de ler, pode usar um breakou outro return.
21716 Robert Harvey