Daría un paso atrás aquí. Te estás concentrando en los detalles delicados del código, pero te estás perdiendo 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++;
}
¿Qué significa significado de este código? El significado es "hacer algo de trabajo para cada registro en un archivo". Pero no es así como se ve el código . El código parece "mantener un desplazamiento. Abrir un archivo. Ingresar un bucle sin condición de finalización. Leer un registro. Comprobar la nulidad". ¡Todo eso antes de que lleguemos 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. Separa tus mecanismos de tu semántica . En su código original, usted mezcla el mecanismo (los detalles del bucle) con la semántica, el trabajo realizado en cada registro.
Ahora tenemos que implementar RecordsFromFile()
. ¿Cuál es la mejor manera de implementar eso? ¿A quién le importa? Ese no es el código que alguien verá. Es un código de mecanismo básico y sus diez líneas de largo. Escríbelo 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 perezosamente , todo tipo de escenarios son posibles:
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í sucesivamente.
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.