Trạng thái đột biến và vòng lặp. Bạn gần như không bao giờ cần chúng, và bạn hầu như luôn nhận được mã tốt hơn mà không có chúng.
Ví dụ: cái này được lấy trực tiếp từ luồng StackOverflow:
// ECMAScript
var thing, things_by_type = {};
for (var i = 0; i < things.length; i++) {
thing = things[i];
if(things_by_type[thing.type]) {
things_by_type[thing.type].push(thing);
} else {
things_by_type[thing.type] = [thing];
}
}
# Ruby
things_by_type = {}
things.each do |thing|
(things_by_type[thing.type] ||= []) << thing
end
Cả hai đều làm điều tương tự. Nhưng tôi không có ý tưởng những gì họ đang làm. May mắn thay, câu hỏi thực sự giải thích những gì họ đang làm, vì vậy tôi đã có thể viết lại chúng như sau:
// ECMAScript
things.reduce(function (acc, thing) {
(acc[thing.type] || (acc[thing.type] = [])).push(thing);
return acc;
}, {});
# Ruby
things.group_by(&:type)
// Scala
things groupBy(_.type)
// C#
from thing in things group thing by thing.Type // or
things.GroupBy(thing => thing.Type);
Không có vòng lặp, và không có trạng thái đột biến. Vâng, không có, không có vòng lặp rõ ràng và không có bộ đếm vòng lặp.
Mã đã trở nên ngắn hơn nhiều, đơn giản hơn nhiều, giống như mô tả về những gì mã phải làm (đặc biệt là trong trường hợp Ruby, nó nói trực tiếp "nhóm các thứ theo loại") và ít bị lỗi hơn. Không có nguy cơ chạy hết mảng, lỗi hàng rào hoặc lỗi do lỗi với các chỉ số vòng lặp và điều kiện kết thúc, bởi vì không có chỉ số vòng lặp và điều kiện kết thúc.