Saya akan mengambil langkah kembali ke sini. Anda berkonsentrasi pada detail pilih-pilih kode tetapi melewatkan gambar yang lebih besar. Mari kita lihat salah satu contoh loop Anda:
int offset = 0;
while(true)
{
Record r = Read(offset);
if(r == null)
{
break;
}
// do work
offset++;
}
Apa arti dari kode ini? Artinya adalah "lakukan beberapa pekerjaan untuk setiap catatan dalam file". Tapi bukan itu yang terlihat seperti kode . Kode tersebut terlihat seperti "mempertahankan offset. Buka file. Masukkan loop tanpa kondisi akhir. Baca catatan. Uji untuk nullity." Semua itu sebelum kita mulai bekerja! Pertanyaan yang harus Anda tanyakan adalah " bagaimana saya bisa membuat penampilan kode ini cocok dengan semantiknya? " Kode ini harus:
foreach(Record record in RecordsFromFile())
DoWork(record);
Sekarang kode itu dibaca seperti niatnya. Pisahkan mekanisme Anda dari semantik Anda . Dalam kode asli Anda, Anda mencampur mekanisme - rincian loop - dengan semantik - pekerjaan yang dilakukan untuk setiap catatan.
Sekarang kita harus mengimplementasikan RecordsFromFile()
. Apa cara terbaik untuk mengimplementasikannya? Siapa peduli? Itu bukan kode yang akan dilihat siapa pun. Ini kode mekanisme dasar dan panjangnya sepuluh baris. Tulis sesuai keinginan Anda. Bagaimana dengan ini?
public IEnumerable<Record> RecordsFromFile()
{
int offset = 0;
while(true)
{
Record record = Read(offset);
if (record == null) yield break;
yield return record;
offset += 1;
}
}
Sekarang kita sedang memanipulasi urutan catatan dengan malas yang dihitung, segala macam skenario menjadi mungkin:
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);
Dan seterusnya.
Setiap kali Anda menulis sebuah loop, tanyakan pada diri Anda "apakah loop ini membaca seperti mekanisme atau seperti arti dari kode?" Jika jawabannya "seperti mekanisme", maka cobalah untuk memindahkan mekanisme itu ke metode sendiri, dan tulis kode untuk membuat maknanya lebih terlihat.