Eu daria um passo para trás aqui. Você está se concentrando nos detalhes exigentes do código, mas está perdendo a imagem maior. Vamos dar uma olhada em um dos seus exemplos de loops:
int offset = 0;
while(true)
{
Record r = Read(offset);
if(r == null)
{
break;
}
// do work
offset++;
}
Qual é o significado desse código? O significado é "faça algum trabalho para cada registro em um arquivo". Mas não é assim que o código se parece . O código parece "manter um deslocamento. Abra um arquivo. Insira um loop sem condição final. Leia um registro. Teste a nulidade". Tudo isso antes de começarmos o trabalho! A pergunta que você deve fazer é " como posso fazer a aparência desse código corresponder à sua semântica? " Esse código deve ser:
foreach(Record record in RecordsFromFile())
DoWork(record);
Agora o código parece com a sua intenção. Separe seus mecanismos da sua semântica . No seu código original, você mistura o mecanismo - os detalhes do loop - com a semântica - o trabalho realizado em cada registro.
Agora temos que implementar RecordsFromFile()
. Qual é a melhor maneira de implementar isso? Quem se importa? Esse não é o código que alguém vai ver. É o código básico do mecanismo e suas dez linhas. Escreva como quiser. Que tal agora?
public IEnumerable<Record> RecordsFromFile()
{
int offset = 0;
while(true)
{
Record record = Read(offset);
if (record == null) yield break;
yield return record;
offset += 1;
}
}
Agora que estamos manipulando uma sequência de registros lenta e computada, todos os tipos de cenários se tornam possíveis:
foreach(Record record in RecordsFromFile().Take(10))
DoWork(record);
foreach(Record record in RecordsFromFile().OrderBy(r=>r.LastName))
DoWork(record);
foreach(Record record in RecordsFromFile().Where(r=>r.City == "London")
DoWork(record);
E assim por diante.
Sempre que você escreve um loop, pergunte a si mesmo "esse loop é como um mecanismo ou como o significado do código?" Se a resposta for "como um mecanismo", tente mover esse mecanismo para seu próprio método e escreva o código para tornar o significado mais visível.