รัฐและลูปไม่แน่นอน คุณแทบไม่ต้องการพวกเขาเลยและคุณก็จะได้รหัสที่ดีกว่าถ้าไม่มีพวกมัน
ตัวอย่างเช่นสิ่งนี้นำมาโดยตรงจากเธรด 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
พวกเขาทั้งคู่กำลังทำสิ่งเดียวกัน แต่ฉันไม่รู้ว่าพวกเขากำลังทำอะไร โชคดีที่คำถามนี้อธิบายสิ่งที่พวกเขากำลังทำอยู่ดังนั้นฉันจึงสามารถเขียนได้ดังนี้:
// 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);
ไม่มีลูปและไม่มีสถานะที่ไม่แน่นอน ก็โอเคไม่มีลูปอย่างชัดเจนและไม่มีตัวนับลูป
รหัสสั้นลงง่ายกว่ามากเหมือนคำอธิบายของรหัสที่ควรทำ (โดยเฉพาะอย่างยิ่งในกรณีทับทิมมันบอกว่า "จัดกลุ่มตามประเภท") โดยตรงและมีข้อผิดพลาดน้อยกว่ามาก ไม่มีอันตรายจากการวิ่งออกจากจุดสิ้นสุดของอาเรย์, ข้อผิดพลาดของโพสต์รั้วหรือข้อผิดพลาดแบบ off-one กับดัชนีลูปและเงื่อนไขการยกเลิกเนื่องจากไม่มีดัชนีลูปและเงื่อนไขการเลิกจ้าง