Değişken hal ve döngüler. Neredeyse hiçbir zaman onlara ihtiyacınız olmaz ve neredeyse her zaman onlarsız daha iyi bir kod elde edersiniz.
Örneğin, bu doğrudan bir StackOverflow dizisinden alınır:
// 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
İkisi de aynı şeyi yapıyor. Ama ne yaptıkları hakkında hiçbir fikrim yok . Neyse ki, soru aslında ne yaptıklarını açıklıyor, dolayısıyla onları şu şekilde yeniden yazabildim:
// 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);
Döngü yok, değişken durum yok. Tamam, kesin değil döngüler yok ve döngü sayıcılar yok.
Kod çok daha kısaydı, çok daha basit hale geldi, kodun ne yapması gerektiğinin bir açıklaması gibi (özellikle Ruby'de hemen hemen "yazılan şeyleri türüne göre sırala" diyor) ve çok daha az hata eğilimli hale geldi. Dizinin sonuna kaçma tehlike yok, orada çünkü fencepost hata veya off-by-tek döngü endeksleri ve sonlandırma koşulları hatalardan, hiçbir vardır döngü endeksleri ve sonlandırma koşulları.