আমার একটা বদঅভ্যাস আছে। যখন কোন কন্ডিশনাল ব্রাঞ্চিং এর মাধ্যমে কোন বুলিয়ান প্রোপার্টির ভ্যালু আপডেট করার কোড লিখি তখন শুরুতেই ওই প্রোপার্টির ভ্যালু ০ করে নেই। তারপর If() স্টেটমেন্টের মাধ্যমে প্রয়োজনীয় কন্ডিশনের উপর ভিত্তি করে প্রোপার্টির ভ্যালু আপডেট করি।
উদাহরনঃ
hasPlanToBeOut = false; if(checkIfYouHavePlanToGoOut) { hasPlanToBeOut = true; }
এই অভ্যাসের বিড়ম্বনাঃ
আজকে বাসায় বসে বসে বিরক্ত হয়ে সন্ধ্যায় পর পর তিনজন কে মেসেজ দিলাম নিচের মত করেঃ
“বের হলে জানাইস”
উপরের কোডের মত যদি লেখি তাহলে দাড়ায়
if(jodiBerHos()) callMe();
সবই ঠিক আছে। যখন বাইরে বের হবে তখন তারা কল দিয়ে জানাবে যে বাহির হচ্ছে। সমস্যা হয় যদি তাদের আজকে বের হওয়ার কোন প্লান না থাকে। সেক্ষেত্রে আমাকে অনন্ত কালের একটা ওয়েটিং লুপে পরে যেতে হয়। এখানেই বিড়ম্বনা। আমার ওই মেসেজ টা যদি একটু পরিবর্তন করি তাহলেই আমাকে আর এই ওয়েটিং এ পড়তে হয় না।
প্রশ্নঃ “আজকে বের হবি?”
if(jodiBerHos) callMe(YES); else callMe(NO);
কয়েকদিন আগেই একটা প্রজেক্টে বাগ পোস্ট হয়েছিল। বাগটা ছিল এরকম, শুরুতে ২ টা এরিয়ার কালার হলুদ থাকে। সময়ের সাথে সাথে ডাটার উপর নির্ভর করে একটার রঙ পরিবর্তন হয়ে লাল হয়ে যায়। এরপর আবার কিছু সময় পর যখন ডাটা পরিবর্তন হয়ে লাল এরিয়া টা পুনরায় হলুদ হওয়ার কথা সেটা আর হয় না। মানে একবার লাল হয়ে যাওয়ার পর ডাটা পরিবর্তন হলেও ওইটা আর কখনোই হলুদ এ ফেরত আসে না।
//init areaA = yellow; areaB = yellow; //get called in a one minute interval if(someCondition()) areaB = red;
কোডটিতে দেখা যাচ্ছে শুরুতেই দুইটা প্রোপার্টির ভ্যালু ইয়েলো রেখে তারপর কন্ডিশন চেক করে রেড করা হচ্ছে। অর্থাৎ যদি someCondition() এর ভ্যালু true হয় তাহলে areaB রেড হয়ে যাবে। এই কন্ডিশন চেকের কোডটুকু এক মিনিট ইন্টারভালে বার বার কল হতে থাকবে। একবার রেড হয়ে গেল। এরপর কোন সময় যদি someCondition() এর ভ্যালু true না হয়ে যদি false হয় তখন আর কিন্তু areaB এর ভ্যালু পরিবর্তন হবে না। রেড ই থেকে যাবে। এই জন্য এই কোড স্নিপেট এর সঠিক রুপ এরকম হওয়া উচিত ছিলঃ
//init areaA = yellow; areaB = yellow; //get called in a one minute interval if(someCondition()) areaB = red; else areaB = yellow;
সারমর্মঃ যেকোন if() স্ট্যাটমেন্টে কমপক্ষে একটি else ব্রাঞ্চ থাকা উচিত।