Tôi sẽ lùi một bước ở đây. Bạn đang tập trung vào các chi tiết cầu kỳ của mã nhưng thiếu hình ảnh lớn hơn. Chúng ta hãy xem một trong các vòng lặp ví dụ của bạn:
int offset = 0;
while(true)
{
Record r = Read(offset);
if(r == null)
{
break;
}
// do work
offset++;
}
Ý nghĩa của mã này là gì? Ý nghĩa là "thực hiện một số công việc cho mỗi bản ghi trong một tệp". Nhưng đó không phải là những gì mã vẻ thích . Mã này trông giống như "duy trì bù. Mở tệp. Nhập vòng lặp không có điều kiện kết thúc. Đọc bản ghi. Kiểm tra tính vô hiệu." Tất cả điều đó trước khi chúng tôi có được công việc! Câu hỏi bạn nên đặt ra là " làm thế nào tôi có thể làm cho diện mạo của mã này khớp với ngữ nghĩa của nó? " Mã này phải là:
foreach(Record record in RecordsFromFile())
DoWork(record);
Bây giờ mã đọc như ý định của nó. Tách các cơ chế của bạn khỏi ngữ nghĩa của bạn . Trong mã gốc của bạn, bạn trộn lẫn cơ chế - các chi tiết của vòng lặp - với ngữ nghĩa - công việc được thực hiện cho mỗi bản ghi.
Bây giờ chúng ta phải thực hiện RecordsFromFile()
. Cách tốt nhất để thực hiện điều đó là gì? Ai quan tâm? Đó không phải là mã mà bất cứ ai sẽ nhìn vào. Đó là mã cơ chế cơ bản và dài mười dòng. Viết nó theo cách bạn muốn. Còn cái này thì sao?
public IEnumerable<Record> RecordsFromFile()
{
int offset = 0;
while(true)
{
Record record = Read(offset);
if (record == null) yield break;
yield return record;
offset += 1;
}
}
Bây giờ chúng ta đang thao tác một chuỗi các bản ghi được tính toán một cách lười biếng, tất cả các loại kịch bản đều có thể xảy ra:
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);
Và như thế.
Bất cứ khi nào bạn viết một vòng lặp, hãy tự hỏi mình "vòng lặp này có đọc giống như một cơ chế hay giống như ý nghĩa của mã không?" Nếu câu trả lời là "giống như một cơ chế", thì hãy thử chuyển cơ chế đó sang phương thức riêng của nó và viết mã để làm cho ý nghĩa rõ ràng hơn.