Vorrei fare un passo indietro qui. Ti stai concentrando sui dettagli esigenti del codice ma ti manca l'immagine più grande. Diamo un'occhiata a uno dei tuoi loop di esempio:
int offset = 0;
while(true)
{
Record r = Read(offset);
if(r == null)
{
break;
}
// do work
offset++;
}
Qual è il significato di questo codice? Il significato è "fai un po 'di lavoro per ogni record in un file". Ma non è così che appare il codice . Il codice appare come "mantieni un offset. Apri un file. Inserisci un ciclo senza condizioni finali. Leggi un record. Verifica la nullità". Tutto ciò prima di arrivare al lavoro! La domanda che dovresti porre è " come posso fare in modo che l'aspetto di questo codice corrisponda alla sua semantica? " Questo codice dovrebbe essere:
foreach(Record record in RecordsFromFile())
DoWork(record);
Ora il codice si legge come la sua intenzione. Separare i meccanismi dalla semantica . Nel codice originale si confonde il meccanismo - i dettagli del ciclo - con la semantica - il lavoro svolto per ciascun record.
Ora dobbiamo implementare RecordsFromFile()
. Qual è il modo migliore per implementarlo? Che importa? Questo non è il codice che qualcuno guarderà. È un codice meccanismo di base e le sue dieci righe. Scrivilo come vuoi. Cosa ne pensi di questo?
public IEnumerable<Record> RecordsFromFile()
{
int offset = 0;
while(true)
{
Record record = Read(offset);
if (record == null) yield break;
yield return record;
offset += 1;
}
}
Ora che stiamo manipolando una sequenza di record calcolati pigramente diventano possibili tutti i tipi di scenari:
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 così via.
Ogni volta che scrivi un ciclo, chiediti "questo ciclo legge come un meccanismo o come il significato del codice?" Se la risposta è "come un meccanismo", prova a spostare quel meccanismo nel suo metodo e scrivi il codice per renderlo più visibile.