এ থেকে অবতরণ দ্রুত ব্যর্থ হয় ।
আমাদের কোড নেই, না আমাদের কাছে উপসর্গের অনেকগুলি উদাহরণ রয়েছে যা কোড অনুসারে শাখার উপসর্গগুলি হয় বা হয় না। আমাদের যা কিছু আছে তা হ'ল:
- 089 - 100 => পরীক্ষা শাখা
- 10 বি, 10 সি => পরীক্ষা শাখা
- <088 => সম্ভবত আসল শাখা
- > 100 => সম্ভবত আসল শাখা
কোডটি সংখ্যা এবং স্ট্রিংকে মঞ্জুরি দেয় এমনটি কিছুটা অদ্ভুত। অবশ্যই, 10 বি এবং 10 সি হেক্স সংখ্যা হিসাবে বিবেচিত হতে পারে, তবে উপসর্গগুলি যদি হেক্স নম্বর হিসাবে গণ্য করা হয়, 10 বি এবং 10 সি পরীক্ষার পরিসরের বাইরে পড়ে এবং সত্যিকারের শাখা হিসাবে বিবেচিত হবে।
সম্ভবত এটির অর্থ হ'ল উপসর্গটি স্ট্রিং হিসাবে সঞ্চিত তবে কিছু ক্ষেত্রে একটি সংখ্যা হিসাবে বিবেচিত। আমি এই ভাবতে পারি এমন সহজ কোডটি এই আচরণটির প্রতিলিপি দেয় (চিত্রণমূলক উদ্দেশ্যে সি # ব্যবহার করে):
bool IsTest(string strPrefix) {
int iPrefix;
if(int.TryParse(strPrefix, out iPrefix))
return iPrefix >= 89 && iPrefix <= 100;
return true; //here is the problem
}
ইংরাজীতে, যদি স্ট্রিংটি একটি সংখ্যা হয় এবং 89 এবং 100 এর মধ্যে হয় তবে এটি একটি পরীক্ষা। এটি যদি নম্বর না হয় তবে এটি একটি পরীক্ষা। অন্যথায় এটি পরীক্ষা নয়।
কোডটি যদি এই প্যাটার্নটি অনুসরণ করে, কোড স্থাপনের সময় কোনও ইউনিট পরীক্ষা এটি ধরতে পারত না। এখানে ইউনিট পরীক্ষার কয়েকটি উদাহরণ রয়েছে:
assert.isFalse(IsTest("088"))
assert.isTrue(IsTest("089"))
assert.isTrue(IsTest("095"))
assert.isTrue(IsTest("100"))
assert.isFalse(IsTest("101"))
assert.isTrue(IsTest("10B")) // <--- business rule change
ইউনিট পরীক্ষা দেখায় যে "10 বি" একটি পরীক্ষা শাখা হিসাবে বিবেচনা করা উচিত। উপরের ব্যবহারকারী @ gnasher729 বলেছেন যে ব্যবসায়ের নিয়মগুলি পরিবর্তিত হয়েছে এবং এটি শেষের উপরের দৃser় প্রতিবেদনটি দেখায়। এমন এক পর্যায়ে যে দৃsert়তাটি একটিতে পরিবর্তন হওয়া উচিত ছিল isFalse
, তবে তা ঘটেনি। ইউনিট পরীক্ষাগুলি বিকাশ- এবং বিল্ড-টাইমে চালিত হয় তবে তার পরে আর কোনও পর্যায়ে আসে না।
এখানে পাঠ কি? কোডটি সিগন্যাল করার কিছু উপায় দরকার যা এটি অপ্রত্যাশিত ইনপুট পেয়েছে। এই কোডটি লেখার একটি বিকল্প উপায় এখানে এটি জোর দেয় যে এটি উপসর্গটি একটি সংখ্যার প্রত্যাশা করে:
// Alternative A
bool TryGetIsTest(string strPrefix, out bool isTest) {
int iPrefix;
if(int.TryParse(strPrefix, out iPrefix)) {
isTest = iPrefix >= 89 && iPrefix <= 100;
return true;
}
isTest = true; //this is just some value that won't be read
return false;
}
যারা সি # জানেন না তাদের ক্ষেত্রে, রিটার্ন মানটি নির্দেশিত স্ট্রিং থেকে কোডটি একটি উপসর্গ পার্স করতে সক্ষম হয়েছিল কিনা তা নির্দেশ করে। যদি ফেরতের মানটি সত্য হয়, কলিং কোডটি শাখা উপসর্গটি একটি পরীক্ষা উপসর্গ কিনা তা পরীক্ষা করতে isTest আউট ভেরিয়েবল ব্যবহার করতে পারে। যদি ফেরতের মানটি মিথ্যা হয়, কলিং কোডটি জানানো উচিত যে প্রদত্ত উপসর্গটি প্রত্যাশিত নয়, এবং আইস্টেস্ট আউট ভেরিয়েবল অর্থহীন এবং এড়ানো উচিত।
আপনি যদি ব্যতিক্রমগুলির সাথে ঠিক থাকেন তবে পরিবর্তে আপনি এটি করতে পারেন:
// Alternative B
bool IsTest(string strPrefix) {
int iPrefix = int.Parse(strPrefix);
return iPrefix >= 89 && iPrefix <= 100;
}
এই বিকল্পটি আরও সহজবোধ্য। এই ক্ষেত্রে, কলিং কোডটির ব্যতিক্রম ধরা দরকার। উভয় ক্ষেত্রেই কোডটির কলারের কাছে এমনভাবে রিপোর্ট করার কিছু উপায় থাকা উচিত যা এটি কোনও স্ট্র্যাপফিক্সের প্রত্যাশা করে না যা পূর্ণসংখ্যায় রূপান্তরিত হতে পারে না। এইভাবে কোডটি দ্রুত ব্যর্থ হয় এবং এসইসি সূক্ষ্ম বিব্রততা ছাড়াই ব্যাংক দ্রুত সমস্যাটি খুঁজে পেতে পারে।