যখন আমি একটি নির্দিষ্ট প্রোগ্রামের জন্য একটি ইন্টারফেস তৈরি করার চেষ্টা করি তখন আমি সাধারণত অ-বৈধতাযুক্ত ইনপুটের উপর নির্ভরশীল ব্যতিক্রম ছোঁড়া এড়াতে চেষ্টা করি।
সুতরাং প্রায়শই যা ঘটে তা হ'ল আমি এই জাতীয় কোডের একটি টুকরো সম্পর্কে চিন্তা করেছি (এটি উদাহরণস্বরূপ কেবল উদাহরণ, জাভাতে এটি করা ফাংশনটি মনে করবেন না):
public static String padToEvenOriginal(int evenSize, String string) {
if (evenSize % 2 == 1) {
throw new IllegalArgumentException("evenSize argument is not even");
}
if (string.length() >= evenSize) {
return string;
}
StringBuilder sb = new StringBuilder(evenSize);
sb.append(string);
for (int i = string.length(); i < evenSize; i++) {
sb.append(' ');
}
return sb.toString();
}
ঠিক আছে, তাই বলুন যে evenSize
প্রকৃতপক্ষে ব্যবহারকারীর ইনপুট থেকে প্রাপ্ত। সুতরাং আমি নিশ্চিত যে এটি এমনকি সমান। তবে আমি এই পদ্ধতিটি কল করতে চাই না এই সম্ভাবনাটি দিয়ে যে কোনও ব্যতিক্রম ছুঁড়েছে। সুতরাং আমি নিম্নলিখিত ফাংশন করা:
public static boolean isEven(int evenSize) {
return evenSize % 2 == 0;
}
তবে এখন আমি দুটি চেক পেয়েছি যা একই ইনপুট বৈধতা সম্পাদন করে: if
বিবৃতিতে প্রকাশ এবং স্পষ্টত চেক ইন isEven
। সদৃশ কোড, দুর্দান্ত নয়, তাই আসুন রিফ্যাক্টর:
public static String padToEvenWithIsEven(int evenSize, String string) {
if (!isEven(evenSize)) { // to avoid duplicate code
throw new IllegalArgumentException("evenSize argument is not even");
}
if (string.length() >= evenSize) {
return string;
}
StringBuilder sb = new StringBuilder(evenSize);
sb.append(string);
for (int i = string.length(); i < evenSize; i++) {
sb.append(' ');
}
return sb.toString();
}
ঠিক আছে, এটি সমাধান করেছে তবে এখন আমরা নিম্নলিখিত পরিস্থিতিতে into
String test = "123";
int size;
do {
size = getSizeFromInput();
} while (!isEven(size)); // checks if it is even
String evenTest = padToEvenWithIsEven(size, test);
System.out.println(evenTest); // checks if it is even (redundant)
এখন আমরা একটি অপ্রয়োজনীয় চেক পেয়েছি: আমরা ইতিমধ্যে জানি যে মানটি padToEvenWithIsEven
সমান , তবে তবুও প্যারামিটার চেকটি সম্পাদন করে, যা আমরা ইতিমধ্যে এই ফাংশনটিকে ডেকেছি বলে সর্বদা সত্য হবে।
এখন isEven
অবশ্যই সমস্যা তৈরি করে না, তবে প্যারামিটার চেকটি যদি আরও জটিল হয় তবে এটিতে খুব বেশি খরচ হতে পারে। এ ছাড়া, রিডান্ট্যান্ট কল করা ঠিক মনে হয় না simply
কখনও কখনও আমরা একটি "বৈধতাযুক্ত প্রকার" প্রবর্তন করে বা কোনও সমস্যা তৈরি করতে পারি যেখানে এই সমস্যাটি ঘটতে পারে না:
public static String padToEvenSmarter(int numberOfBigrams, String string) {
int size = numberOfBigrams * 2;
if (string.length() >= size) {
return string;
}
StringBuilder sb = new StringBuilder(size);
sb.append(string);
for (int i = string.length(); i < size; i++) {
sb.append('x');
}
return sb.toString();
}
তবে এর জন্য কিছু স্মার্ট চিন্তাভাবনা এবং বেশ বড় একটি চুল্লী প্রয়োজন।
এমন কোনও (আরও) জেনেরিক উপায় রয়েছে যার মাধ্যমে আমরা isEven
ডাবল প্যারামিটার চেকিং করা বা নিরর্থক কলগুলি এড়াতে পারি ? আমি padToEven
ব্যতিক্রমটি ট্রিগার করে সমাধানটিকে একটি অবৈধ প্যারামিটার দিয়ে কল না করতে চাই ।
ব্যতিক্রম ব্যতীত আমি ব্যতিক্রম-মুক্ত প্রোগ্রামিং বলতে চাই না, এর অর্থ হ'ল জেনারিক ইনপুটটি ডিজাইন করে কোনও ব্যতিক্রম ঘটায় না, অন্যদিকে জেনেরিক ফাংশনটিতে এখনও প্যারামিটার চেক থাকে (যদি প্রোগ্রামিং ত্রুটিগুলি থেকে রক্ষা করতে হয় তবে)।
padToEvenWithIsEven
করে না । কলিং কোডে প্রোগ্রামিং ত্রুটি থেকে নিজেকে রক্ষা করতে এটি এর ইনপুটটিতে একটি বৈধতা যাচাই করে । এই বৈধতা কতটা প্রসারিত হওয়া দরকার তার উপর নির্ভর করে আপনি একটি খরচ / ঝুঁকি বিশ্লেষণের উপর নির্ভর করে যেখানে আপনি কলিং কোডটি লেখেন এমন ব্যক্তি ভুল পরামিতিতে পাস করার ঝুঁকির বিরুদ্ধে চেকের মূল্য রাখেন put