আমার কাছে এটি একটি সাধারণ সমস্যা বলে মনে হচ্ছে যা মধ্যবর্তী বিকাশকারীদের মধ্য থেকে জুনিয়র কোনও সময় মুখোমুখি হন: তারা জানেন না বা তারা বিশ্বাস রাখে না যে চুক্তিতে তারা অংশ নিচ্ছে এবং প্রতিরক্ষামূলকভাবে নালদের জন্য অতিরিক্ত পরীক্ষা করে। তদ্ব্যতীত, তাদের নিজস্ব কোড লেখার সময়, তারা কলটি এমনভাবে নালগুলির জন্য চেক করার জন্য প্রয়োজনীয় এমন কিছু নির্দেশ করার জন্য নাল ফেরানোর উপর নির্ভর করে।
এটি অন্য উপায়ে বলতে গেলে দুটি উদাহরণ রয়েছে যেখানে নাল চেকিং আসে:
চুক্তির শর্তাবলী যেখানে নাল একটি বৈধ প্রতিক্রিয়া; এবং
যেখানে এটি কোনও বৈধ প্রতিক্রিয়া নয়।
(2) সহজ। হয় assert
বিবৃতি ব্যবহার ( দৃ as়তা ) বা ব্যর্থতা অনুমতি (উদাহরণস্বরূপ, NullPointerException )। জোর দেওয়াগুলি একটি উচ্চ-নিরুত্বল জাভা বৈশিষ্ট্য যা 1.4 এ যুক্ত হয়েছিল। বাক্য গঠনটি হ'ল:
assert <condition>
অথবা
assert <condition> : <object>
যেখানে <condition>
বুলিয়ান এক্সপ্রেশন এবং <object>
এমন একটি বস্তু যা এর toString()
পদ্ধতির আউটপুট ত্রুটির সাথে যুক্ত হবে।
শর্তটি সত্য না হলে একটি assert
বিবৃতি একটি Error
( AssertionError
) ছুঁড়ে দেয় । ডিফল্টরূপে, জাভা দৃ ign়তা উপেক্ষা করে। আপনি -ea
JVM এ বিকল্পটি পাস করে দৃ as়তা সক্ষম করতে পারেন । আপনি পৃথক ক্লাস এবং প্যাকেজগুলির জন্য দৃ as়তা সক্ষম এবং অক্ষম করতে পারেন। এর অর্থ হ'ল আপনি বিকাশ ও পরীক্ষার সময় সংস্থাগুলির সাথে কোডটি যাচাই করতে পারেন এবং উত্পাদন পরিবেশে এগুলিকে অক্ষম করতে পারেন, যদিও আমার পরীক্ষায় দাবিগুলি থেকে কোনও কার্যকারিতা প্রভাবিত হওয়ার পরে দেখানো হয়নি।
এই ক্ষেত্রে দৃser়তা ব্যবহার না করা ঠিক আছে কারণ কোডটি কেবলমাত্র ব্যর্থ হবে, যা যদি আপনি দৃ use়তা ব্যবহার করেন তবে কি হবে। পার্থক্যটি হ'ল দৃ as়তার সাথে এটি খুব তাড়াতাড়ি ঘটতে পারে, আরও অর্থবহ উপায়ে এবং সম্ভবত অতিরিক্ত তথ্যের সাথে, যা আপনি যদি প্রত্যাশা না করেন তবে কেন এটি ঘটেছে তা নির্ধারণ করতে আপনাকে সহায়তা করতে পারে।
(1) একটু কঠিন। আপনি যে কোডটি কল করছেন তার যদি আপনার কোনও নিয়ন্ত্রণ না থাকে তবে আপনি আটকে রয়েছেন। যদি নাল একটি বৈধ প্রতিক্রিয়া হয় তবে আপনাকে এটি পরীক্ষা করতে হবে।
যদি এটি নিয়ন্ত্রণ করা হয় যা আপনি নিয়ন্ত্রণ করেন তবে (এবং এটি প্রায়শই ঘটে থাকে) তবে এটি আলাদা গল্প। প্রতিক্রিয়া হিসাবে নাল ব্যবহার করা এড়িয়ে চলুন। সংগ্রহগুলি ফেরত দেওয়ার পদ্ধতিগুলির সাথে, এটি সহজ: সর্বদা নালাগুলির পরিবর্তে খালি সংগ্রহ (বা অ্যারে) ফেরত দিন।
অ-সংগ্রহের সাথে এটি আরও শক্ত হতে পারে। এটি উদাহরণ হিসাবে বিবেচনা করুন: আপনার যদি এই ইন্টারফেসগুলি থাকে:
public interface Action {
void doSomething();
}
public interface Parser {
Action findAction(String userInput);
}
যেখানে পার্সার কাঁচা ব্যবহারকারীর ইনপুট নেয় এবং কিছু করার জন্য খুঁজে পায়, সম্ভবত যদি আপনি কোনও কিছুর জন্য একটি কমান্ড লাইন ইন্টারফেস প্রয়োগ করেন। এখন আপনি চুক্তিটি করতে পারেন যে কোনও উপযুক্ত ব্যবস্থা না থাকলে এটি বাতিল হয়ে যায়। এটি আপনি যে নালীর বিষয়ে কথা বলছেন তা পরীক্ষা করে নেবে।
একটি বিকল্প সমাধান হ'ল কখনই নাল ফিরে না আসা এবং পরিবর্তে নাল অবজেক্ট প্যাটার্নটি ব্যবহার করুন :
public class MyParser implements Parser {
private static Action DO_NOTHING = new Action() {
public void doSomething() { /* do nothing */ }
};
public Action findAction(String userInput) {
// ...
if ( /* we can't find any actions */ ) {
return DO_NOTHING;
}
}
}
তুলনা করা:
Parser parser = ParserFactory.getParser();
if (parser == null) {
// now what?
// this would be an example of where null isn't (or shouldn't be) a valid response
}
Action action = parser.findAction(someInput);
if (action == null) {
// do nothing
} else {
action.doSomething();
}
প্রতি
ParserFactory.getParser().findAction(someInput).doSomething();
এটি একটি আরও ভাল নকশা কারণ এটি আরও সংক্ষিপ্ত কোডের দিকে নিয়ে যায়।
এটি বলেছিল, সম্ভবত সন্ধানকারী () পদ্ধতির পক্ষে অর্থবহ ত্রুটির বার্তা সহ একটি ব্যতিক্রম ছোঁড়া পুরোপুরি উপযুক্ত - বিশেষত যেখানে আপনি ব্যবহারকারীর ইনপুটটির উপর নির্ভর করছেন এই ক্ষেত্রে। কোনও ব্যাখ্যা ছাড়াই একটি সাধারণ নালপয়েন্টার এক্সসেপশন দিয়ে কলিং পদ্ধতিটি ফুটিয়ে তুলার চেয়ে ফাইন্ডএ্যাকশন পদ্ধতির জন্য একটি ব্যাতিক্রম ছুঁড়ে দেওয়া আরও ভাল।
try {
ParserFactory.getParser().findAction(someInput).doSomething();
} catch(ActionNotFoundException anfe) {
userConsole.err(anfe.getMessage());
}
অথবা আপনি যদি মনে করেন যে চেষ্টা / ধরার ব্যবস্থাটি খুব কুৎসিত হয় তার চেয়ে আপনার কিছুই না করে আপনার ডিফল্ট ক্রিয়াটি ব্যবহারকারীর প্রতিক্রিয়া সরবরাহ করে provide
public Action findAction(final String userInput) {
/* Code to return requested Action if found */
return new Action() {
public void doSomething() {
userConsole.err("Action not found: " + userInput);
}
}
}