Daría un paso atrás aquí. Te estás concentrando en los detalles exigentes del código pero te falta la imagen más grande. Echemos un vistazo a uno de sus bucles de ejemplo:
int offset = 0;
while(true)
{
Record r = Read(offset);
if(r == null)
{
break;
}
// do work
offset++;
}
¿Cuál es el significado de este código? El significado es "hacer un trabajo para cada registro en un archivo". Pero ese no es el aspecto del código . El código se ve como "mantener un desplazamiento. Abra un archivo. Ingrese un bucle sin condición final. Lea un registro. Pruebe la nulidad". ¡Todo eso antes de llegar al trabajo! La pregunta que debe hacerse es " ¿cómo puedo hacer que la apariencia de este código coincida con su semántica? " Este código debería ser:
foreach(Record record in RecordsFromFile())
DoWork(record);
Ahora el código se lee como su intención. Separe sus mecanismos de su semántica . En su código original, mezcla el mecanismo, los detalles del bucle, con la semántica, el trabajo realizado para cada registro.
Ahora tenemos que implementar RecordsFromFile()
. ¿Cuál es la mejor manera de implementar eso? ¿A quien le importa? Ese no es el código que cualquiera va a mirar. Es un código de mecanismo básico y sus diez líneas de largo. Escríbela como quieras. ¿Qué tal esto?
public IEnumerable<Record> RecordsFromFile()
{
int offset = 0;
while(true)
{
Record record = Read(offset);
if (record == null) yield break;
yield return record;
offset += 1;
}
}
Ahora que estamos manipulando una secuencia de registros calculada de manera perezosa, es posible todo tipo de escenarios:
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);
Y así.
Cada vez que escriba un bucle, pregúntese "¿este bucle se lee como un mecanismo o como el significado del código?" Si la respuesta es "como un mecanismo", intente mover ese mecanismo a su propio método y escriba el código para que el significado sea más visible.