আমার একটা বদঅভ্যাস আছে। যখন কোন কন্ডিশনাল ব্রাঞ্চিং এর মাধ্যমে কোন বুলিয়ান প্রোপার্টির ভ্যালু আপডেট করার কোড লিখি তখন শুরুতেই ওই প্রোপার্টির ভ্যালু ০ করে নেই। তারপর 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 ব্রাঞ্চ থাকা উচিত।
দুটা উদাহরণই মজার। বিশেষ করে ২য়টা। তবে অনেক ক্ষেত্রে আমি এইরকম কাজ করি।
branch = “master”
if not isempty(argv[1])
branch = argv[1]
অর্থাৎ কাস্টম প্যারামিটার দিলে branch এর ভ্যালু বদলাবে, নাতো master ই থাকবে। এটা মানছি যে else ব্লক দিলে রিডেবল বেশী হবে এবং এরর হবার চান্স কম। কিন্তু সেক্ষেত্রে branch এর ভ্যালু অযথা ২য়বার সেট হচ্ছেনা? অথবা এরকম করা যেতে পারে।
branch =
if not isempty(argv[1])
branch = argv[1]
else
branch = “master”
এখানে শুরুতে ভেরিয়েবল জাস্ট ডিক্লেয়ার হবে, পরে ভ্যালু সেট করলাম। আপনারা বাস্তবে প্রজেক্টের ক্ষেত্রে এইরকম সিচুয়েশনে কি স্টেপ ফলো করেন জানালে উপকৃত হব।
I just found that I was not clear enough to describe the situation here. Let me explain again. I am going to take your code snippet as an example here:
[code=”pseoducode”]
function init(){
branch = “master”
}
function updateBranchName(string newName)
{
if not isempty(newName)
branch = newName
}
int main() {
init();
updateBranchName(“master/add-option-for-select-icons-in-pref”);
updateBranchName(“”); // updateBranchName will be called from different seprate thread.
return 0;
}
[/code]
As you have written, the initialization was in the same method. That is a good approach obviously. But my situation arrived when initialization was in separate method. Yes, what you have suggested is the best approach and we should always follow that one. So, both of following two approach are ok.
[code = “approach1”]
function updateBranchName(string newName)
{
branch = master
if not isempty(newName)
branch = newName
}
[code]
[code = “approach2”]
function updateBranchName(string newName)
{
branch = string.empty;
if not isempty(newName)
branch = newName
else
branch = master
}
[code]