পরিবর্তনীয় স্থিতি এবং লুপগুলি। আপনার প্রায়শই তাদের প্রয়োজন হয় না এবং আপনি প্রায় সর্বদা এগুলি ছাড়া আরও ভাল কোড পান।
উদাহরণস্বরূপ, এটি সরাসরি স্ট্যাকওভারফ্লো থ্রেড থেকে নেওয়া হয়েছে:
// 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);
এখানে কোনও লুপ নেই, এবং কোনও পরিবর্তনযোগ্য অবস্থা নেই। ঠিক আছে, ঠিক আছে, কোনও স্পষ্ট লুপ নেই এবং কোনও লুপ কাউন্টার নেই।
কোডটি আরও সংক্ষিপ্ত, অনেক সরল হয়ে উঠেছে, কোডটি কী করণীয় তা বর্ণনার মতো (বিশেষত রুবির ক্ষেত্রে এটি বেশ কিছুটা সরাসরি "টাইপ করে জিনিসগুলিকে গ্রুপ" বলে) এবং ত্রুটি-প্রবণতা অনেক কম। লুপ সূচক এবং সমাপ্তির অবস্থার সাথে অ্যারে, ফেন্সপোস্ট ত্রুটি বা একের পর এক ত্রুটিগুলি বন্ধ হওয়ার কোনও ঝুঁকি নেই, কারণ কোনও লুপ সূচক এবং সমাপ্তির শর্ত নেই।