Status dan loop yang bisa berubah. Anda hampir tidak pernah membutuhkannya, dan Anda hampir selalu mendapatkan kode yang lebih baik tanpa mereka.
Misalnya, ini diambil langsung dari utas 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
Mereka berdua melakukan hal yang sama. Tetapi saya tidak tahu apa yang mereka lakukan. Untungnya, pertanyaannya benar-benar menjelaskan apa yang mereka lakukan, jadi saya dapat menulis ulang mereka sebagai berikut:
// 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);
Tidak ada loop, dan tidak ada keadaan bisa berubah. Baiklah, oke, tidak ada loop eksplisit dan tidak ada loop counter.
Kode telah menjadi jauh lebih pendek, lebih sederhana, lebih seperti deskripsi tentang apa yang seharusnya dilakukan kode (terutama dalam kasus Ruby itu secara langsung mengatakan "kelompok hal-hal berdasarkan jenis"), dan jauh lebih rentan kesalahan. Tidak ada bahaya menjalankan akhir array, kesalahan fencepost atau kesalahan off-by-one dengan indeks loop dan kondisi terminasi, karena tidak ada indeks loop dan kondisi terminasi.