আমার কাছে এমন একটি পদ্ধতি রয়েছে যা যদি কোনও বস্তু খুঁজে পাওয়া যায় তবে তা ফেরত দেওয়ার কথা।
যদি এটি না পাওয়া যায় তবে আমি কি:
- নাল ফিরে
- একটি ব্যতিক্রম নিক্ষেপ
- অন্যান্য
আমার কাছে এমন একটি পদ্ধতি রয়েছে যা যদি কোনও বস্তু খুঁজে পাওয়া যায় তবে তা ফেরত দেওয়ার কথা।
যদি এটি না পাওয়া যায় তবে আমি কি:
উত্তর:
আপনি যদি সর্বদা একটি মান সন্ধানের প্রত্যাশা করে থাকেন তবে যদি এটি অনুপস্থিত থাকে তবে ব্যতিক্রমটি নিক্ষেপ করুন। ব্যতিক্রমটির অর্থ একটি সমস্যা ছিল।
যদি মানটি অনুপস্থিত বা উপস্থিত হতে পারে এবং উভয়ই অ্যাপ্লিকেশন যুক্তির জন্য বৈধ হয় তবে একটি শূন্য ফেরান।
আরও গুরুত্বপূর্ণ: কোডে আপনি অন্য জায়গাগুলি কী করেন? ধারাবাহিকতা গুরুত্বপূর্ণ।
GetPersonById(25)
যদি সেই ব্যক্তিটিকে মুছে ফেলা হয় তবে ফেলে দেওয়া GetPeopleByHairColor("red")
হবে , তবে খালি ফলাফলটি ফিরিয়ে দেবে। সুতরাং, আমি মনে করি প্যারামিটারগুলি প্রত্যাশা সম্পর্কে কিছু বলে।
যদি সত্যই এটি ত্রুটি হয় তবে কেবল একটি ব্যতিক্রম ছুঁড়ে ফেলুন। যদি অবজেক্টটির অস্তিত্ব না থাকায় আচরণের প্রত্যাশা থাকে তবে নালটি ফিরুন।
অন্যথায় এটি পছন্দসই বিষয়।
একটি সাধারণ নিয়ম হিসাবে, পদ্ধতিটি যদি সর্বদা কোনও বস্তুকে ফেরত দেয় তবে ব্যতিক্রমটি নিয়ে যান। আপনি যদি মাঝে মাঝে নালটি অনুমান করেন এবং এটি একটি নির্দিষ্ট উপায়ে পরিচালনা করতে চান তবে নাল দিয়ে যান।
আপনি যাই করুন না কেন, আমি তৃতীয় বিকল্পের বিরুদ্ধে উচ্চ পরামর্শ দিচ্ছি: "ডাব্লুটিএফ" বলার মতো একটি স্ট্রিং ফিরে আসা।
যদি নাল কখনই কোনও ত্রুটি নির্দেশ করে না তবে কেবল নালটি ফিরুন।
যদি নাল সর্বদা ত্রুটি হয় তবে একটি ব্যতিক্রম ছুঁড়ে দিন।
নাল যদি কখনও কখনও ব্যতিক্রম হয় তবে দুটি রুটিন কোড করুন। একটি রুটিন একটি ব্যতিক্রম নিক্ষেপ করে এবং অন্যটি বুলিয়ান পরীক্ষার রুটিন যা আউটপুট প্যারামিটারে বস্তুটি ফেরত দেয় এবং বস্তুটি খুঁজে পাওয়া না গেলে রুটিন একটি মিথ্যা ফিরিয়ে দেয়।
চেষ্টা করার রুটিনটির অপব্যবহার করা শক্ত। নাল পরীক্ষা করা ভুলে যাওয়া আসল সহজ।
সুতরাং নাল একটি ত্রুটি যখন আপনি শুধু লিখুন
object o = FindObject();
নাল কোনও ত্রুটি না হলে আপনি এর মতো কিছু কোড করতে পারেন
if (TryFindObject(out object o)
// Do something with o
else
// o was not found
find
এবং findOrFail
TryFindObject
পদ্ধতি থেকে ফিরিয়ে দেওয়া হবে তা সংজ্ঞায়িত করতে হবে না ? টিপলস এমন প্রোগ্রামারদের কাছে আরও অলস দৃষ্টান্ত বলে মনে হয় যারা একাধিক মানকে আবশ্যক করে এমন কোনও বিষয় নির্ধারণ করতে সময় নিতে চায় না। এটি মূলত সমস্ত টিপলগুলি যাইহোক মূল দিকে রয়েছে।
আমি কেবল আগে উল্লিখিত বিকল্পগুলি পুনরায় কাটাতে চেয়েছিলাম, কিছু নতুন এনে ফেলেছি:
অথবা আপনি এই বিকল্পগুলি একত্রিত করতে পারেন:
আপনার গেটরের বেশ কয়েকটি ওভারলোড হওয়া সংস্করণ সরবরাহ করুন, যাতে কলার সিদ্ধান্ত নিতে পারে যে কোন পথে যাবেন। বেশিরভাগ ক্ষেত্রে, কেবলমাত্র প্রথমটিতে অনুসন্ধান আলগোরিদম প্রয়োগ করা হয় এবং অন্যগুলি কেবল প্রথমটির চারপাশে আবৃত থাকে:
Object findObjectOrNull(String key);
Object findObjectOrThrow(String key) throws SomeException;
Object findObjectOrCreate(String key, SomeClass dataNeededToCreateNewObject);
Object findObjectOrDefault(String key, Object defaultReturnValue);
এমনকি যদি আপনি কেবলমাত্র একটি বাস্তবায়ন সরবরাহ করে থাকেন, আপনি নিজের চুক্তিটি পরিষ্কার করার জন্য নামকরণের কনভেনশনটি ব্যবহার করতে পারেন এবং এটি আপনাকে অন্য বাস্তবায়নও যুক্ত করার সিদ্ধান্ত নিতে সহায়তা করে।
আপনার এটিকে অতিরিক্ত ব্যবহার করা উচিত নয়, তবে কোনও সহায়ক ক্লাস লেখার সময় এটি স্পষ্টতই সহায়ক হতে পারে যা আপনি বিভিন্ন ত্রুটি পরিচালনা করার কনভেনশন সহ শত শত বিভিন্ন অ্যাপ্লিকেশনটিতে ব্যবহার করবেন।
Expected<T> findObject(String)
যেখানে Expected<T>
ফাংশন আছে orNull()
, orThrow()
, orSupplied(Supplier<T> supplier)
, orDefault(T default)
। এটি ত্রুটি পরিচালনা থেকে ডেটা প্রাপ্তিকে
নাল অবজেক্ট প্যাটার্নটি ব্যবহার করুন বা একটি ব্যতিক্রম নিক্ষেপ করুন।
Person somePerson = personRepository.find("does-not-exist");
আসুন এই পদ্ধতি আয় ID- র জন্য একটি নাল বস্তুর অনুমান does-not-exist
। তাহলে কি সঠিক আচরণ হবে somePerson.getAge()
? এই মুহুর্তে, আমি এখনও নিশ্চিত নই যে নাল অবজেক্ট প্যাটার্ন হ'ল সত্তা অনুসন্ধানের জন্য সঠিক সমাধান।
একটি ব্যতিক্রম নিক্ষেপ করার সুবিধা:
উদাহরণ সহ আরও ব্যাখ্যার জন্য, দেখুন: http://metatations.com/2011/11/17/returning-null-vs-throwing-an-exception/
এটি আপনার ভাষা এবং কোড প্রচার করে কিনা তা নির্ভর করে: এলবিওয়াইএল (আপনি লাফানোর আগে দেখুন) বা ইএএফপি (অনুমতি চেয়ে ক্ষমা চাইতে আরও সহজ)
এলবিওয়াইএল বলেছে যে আপনার মানগুলি পরীক্ষা করা উচিত (সুতরাং একটি নাল ফেরান)
ফেরান ইএএফপি কেবল অপারেশন চেষ্টা করে দেখুন এটি ব্যর্থ হয়েছে কিনা তা দেখুন (একটি ব্যতিক্রম ছুঁড়ে দিন)
যদিও আমি উপরের সাথে একমত .. ব্যতিক্রমী / ত্রুটি শর্তের জন্য ব্যতিক্রম ব্যবহার করা উচিত, এবং চেকগুলি ব্যবহার করার সময় শূন্যতা ফেরানো সেরা।
পাইথনে ইএএফপি বনাম এলবিওয়াইএল:
http://mail.python.org/pipermail/python-list/2003- মে/205182.html
( ওয়েব সংরক্ষণাগার )
শুধু নিজেকে জিজ্ঞাসা করুন: "এটি কী ব্যতিক্রমী ঘটনা যা বস্তুটি পাওয়া যায় না"? যদি এটি আপনার প্রোগ্রামের সাধারণ কোর্সে ঘটে থাকে বলে আশা করা হয় তবে আপনার সম্ভবত একটি ব্যতিক্রম বাড়াতে হবে না (যেহেতু এটি ব্যতিক্রমী আচরণ নয়)।
সংক্ষিপ্ত সংস্করণ: ব্যতিক্রমী আচরণ পরিচালনা করতে ব্যতিক্রমগুলি ব্যবহার করুন, আপনার প্রোগ্রামের নিয়ন্ত্রণের স্বাভাবিক প্রবাহকে পরিচালনা করতে নয়।
-Alan।
ব্যতিক্রমগুলি ডিজাইন দ্বারা চুক্তি সম্পর্কিত।
কোনও বস্তুর ইন্টারফেস আসলে দুটি বস্তুর মধ্যে একটি চুক্তি, কলারকে অবশ্যই চুক্তিটি করতে হবে অন্যথায় রিসিভার কেবল ব্যতিক্রম সহ ব্যর্থ হতে পারে। সম্ভাব্য দুটি চুক্তি রয়েছে
1) সমস্ত ইনপুট পদ্ধতিটি বৈধ, কোনও ক্ষেত্রে যখন অবজেক্টটি পাওয়া যায় না তখন আপনাকে অবশ্যই নালায় ফিরে আসতে হবে।
2) কেবলমাত্র কিছু ইনপুট বৈধ, অর্থাত্ এটি একটি প্রাপ্ত বস্তুর ফলাফল। কোন ক্ষেত্রে আপনি অবশ্যই একটি দ্বিতীয় পদ্ধতি অফার করবেন যা কলকারীকে তার ইনপুটটি সঠিক হবে কিনা তা নির্ধারণ করতে দেয়। উদাহরণ স্বরূপ
is_present(key)
find(key) throws Exception
IF এবং কেবলমাত্র আপনি যদি দ্বিতীয় চুক্তির উভয় পদ্ধতি সরবরাহ করেন তবে আপনাকে ব্যতিক্রম ছুঁড়ে দেওয়ার অনুমতি দেওয়া হয় কিছুই পাওয়া যায় না!
এর অর্থ কী তার উপর নির্ভর করে যে বস্তুটি পাওয়া যায় নি।
এটি যদি স্বাভাবিক অবস্থায় থাকে তবে শূন্য হয়ে ফিরে আসুন। এটি কেবল এমন কিছু যা একবারে ঘটতে পারে এবং কলকারীদের এটি পরীক্ষা করা উচিত।
যদি এটি ত্রুটি হয়, তবে একটি ব্যতিক্রম ছুঁড়ে ফেলুন, কলকারীদের সিদ্ধান্ত নেওয়া উচিত যে নিখোঁজ হওয়া অবজেক্টের ত্রুটি শর্তটি নিয়ে কী করবেন।
শেষ পর্যন্ত হয় কাজ করবে, যদিও বেশিরভাগ লোকেরা সাধারণত ব্যতিক্রমগুলি ব্যবহার করা ভাল অভ্যাস হিসাবে বিবেচনা করে যখন কিছু, ভাল, ব্যতিক্রম ঘটেছে happened
এখানে আরও কয়েকটি পরামর্শ দেওয়া হল।
যদি কোনও সংগ্রহ ফিরে আসে, নাল ফিরে না আসা, খালি সংগ্রহটি ফিরিয়ে দিন যা প্রথমে শূন্য চেক ছাড়াই গণনা সহজ করে তোলে।
বেশ কয়েকটি। নেট এপিআই এর একটি নিক্ষিপ্ত অনার প্যারামিটারের প্যাটার্ন ব্যবহার করে যা ফোনকারীকে পছন্দ করে যে এটি আসলেই একটি ব্যতিক্রমী পরিস্থিতি কিনা বা বস্তুটি খুঁজে পাওয়া যায় নি। টাইপ.গেটটাইপ এটির একটি উদাহরণ। বিসিএলের সাথে অন্য একটি সাধারণ প্যাটার্ন হ'ল ট্রাইগেট প্যাটার্ন যেখানে একটি বুলিয়ান ফিরে আসে এবং মান আউটপুট প্যারামিটারের মধ্য দিয়ে যায়।
আপনি কিছু পরিস্থিতিতে নাল অবজেক্ট প্যাটার্নটিও বিবেচনা করতে পারেন যা হয় কোনও ডিফল্ট বা কোনও আচরণ না করে সংস্করণ হতে পারে। কীটি হ'ল কোড বেজ জুড়ে নাল চেক এড়ানো। আরও তথ্যের জন্য এখানে দেখুন http://geekswithblogs.net/dsellers/archive/2006/09/08/90656.aspx
একটি ব্যতিক্রম ছুঁড়ে ফেলার পরিবর্তে একটি নাল ফেরান এবং স্পষ্টভাবে ডকুমেন্ট এ নাল রিটার্ন মান সম্ভাবনা নথি। যদি কলিং কোডটি এপিআইকে সম্মান না করে এবং নাল কেসটি পরীক্ষা করে না, তবে এটি সম্ভবত কোনওভাবেই "নাল পয়েন্টার ব্যতিক্রম" এর ফলে ঘটতে পারে :)
সি ++ তে আমি কোনও পদ্ধতি নির্ধারণের জন্য 3 টি পৃথক স্বাদের কথা ভাবতে পারি যা কোনও বস্তু খুঁজে পায়।
বিকল্প ক
Object *findObject(Key &key);
কোনও বস্তু সন্ধান না করা হলে নাল ফেরান। সুন্দর এবং সহজ। আমি এই এক সাথে যেতে হবে। নীচের বিকল্প পদ্ধতিগুলি এমন লোকদের জন্য যারা আউট-প্যারামকে ঘৃণা করে না।
বিকল্প বি
void findObject(Key &key, Object &found);
পরিবর্তনশীল একটি রেফারেন্সে পাস করুন যা বস্তুটি গ্রহণ করবে receiving কোনও বস্তুর সন্ধান পাওয়া না গেলে পদ্ধতিটি একটি ব্যতিক্রম ছুঁড়ে দেয়। এই কনভেনশন সম্ভবত আরও উপযুক্ত যদি এটি সত্যই প্রত্যাশিত না হয় যে কোনও বস্তুর সন্ধান পাওয়া যায় না - তাই আপনি এটি একটি অপ্রত্যাশিত ঘটনা তা বোঝাতে একটি ব্যতিক্রম ছুঁড়ে মারেন।
বিকল্প সি
bool findObject(Key &key, Object &found);
কোনও বস্তুর সন্ধান পাওয়া না গেলে পদ্ধতিটি মিথ্যা ফিরিয়ে দেয়। এই ওভার বিকল্পটির সুবিধা হ'ল আপনি একটি পরিষ্কার পদক্ষেপে ত্রুটি কেসটি পরীক্ষা করতে পারেন:
if (!findObject(myKey, myObj)) { ...
কেবল সেই ক্ষেত্রে যেখানে নালকে ব্যতিক্রমী আচরণ হিসাবে বিবেচনা করা হয় না আমি চেষ্টা পদ্ধতির জন্য অবশ্যই নিশ্চিত, এটি স্পষ্ট, এখানে "যেমন বলা হয়েছিল" বইটি পড়ার "বা" আপনি লাফানোর আগে "তাকানোর দরকার নেই here
তাই মূলত:
bool TryFindObject(RequestParam request, out ResponseParam response)
এবং এর অর্থ হল যে ব্যবহারকারীর কোডটিও পরিষ্কার হবে
...
if(TryFindObject(request, out response)
{
handleSuccess(response)
}
else
{
handleFailure()
}
...
সাধারণত এটি শূন্য ফিরে আসা উচিত। পদ্ধতিটি কল করার কোডটি সিদ্ধান্ত নিতে হবে যে কোনও ব্যতিক্রম ছোঁড়াবেন বা অন্য কিছু চেষ্টা করবেন।
অথবা একটি বিকল্প ফেরত দিন
একটি বিকল্প মূলত একটি ধারক শ্রেণি যা ক্লায়েন্টকে বুথের মামলাগুলি পরিচালনা করতে বাধ্য করে। স্কালার এই ধারণাটি রয়েছে, এটির এপিআই দেখুন।
তারপরে আপনার এই অবজেক্টে টি getOrElse (টি ভ্যালুআইফনল) এর মতো পদ্ধতি রয়েছে এটি হয় প্রাপ্ত বস্তুটি ফেরত দেয়, বা ক্লায়েন্টের একটি বিকল্প বিকল্প হিসাবে দেয়।
দুর্ভাগ্যক্রমে জেডিকে অসঙ্গত, যদি আপনি রিসোর্স বান্ডলে অ বিদ্যমান কী ব্যবহারের চেষ্টা করে থাকেন তবে আপনাকে ব্যতিক্রম পাওয়া যায় না এবং যখন আপনি মানচিত্র থেকে মানটির অনুরোধ করেন তবে তা উপস্থিত না থাকলে শূন্য হয়ে যায়। সুতরাং আমি নিম্নলিখিতটির জন্য বিজয়ীর উত্তরটি পরিবর্তন করব, যদি পাওয়া যায় মানটি শূন্য হতে পারে, তবে যখন এটি পাওয়া যায় না তখন ব্যতিক্রম বাড়াতে হবে, অন্যথায় নাল ফিরে আসবে। সুতরাং একটি ব্যতিক্রম সহ নিয়ম অনুসরণ করুন, যদি আপনার মূল্য কেন খুঁজে পাওয়া যায় না তা জানতে প্রয়োজন তবে সর্বদা ব্যতিক্রম বাড়াবেন, বা ..
যতক্ষণ না অবজেক্টের কোনও রেফারেন্স ফিরিয়ে দেওয়ার কথা , ততক্ষণ NULL ফেরানো ভাল হওয়া উচিত।
তবে, যদি এটি পুরো রক্তাক্ত জিনিসটি ফিরিয়ে দেয় (যেমনটি আপনি সি ++ তে করেন তবে: 'রিটার্ন & ব্লাহ;' (বা 'ব্লাহ' একটি পয়েন্টার) না হয়ে আপনি ফিরে আসতে পারবেন না, কারণ এটি 'অবজেক্ট' টাইপের নয় that সেক্ষেত্রে একটি ব্যতিক্রম ছুঁড়ে দেওয়া বা কোনও সাফল্যের পতাকা সেট না থাকা একটি ফাঁকা বস্তু ফিরিয়ে দেওয়া আমি কীভাবে সমস্যার সাথে যোগাযোগ করব।
ব্যতিক্রম হ্যান্ডলিংয়ে কেউ ওভারহেডের উল্লেখ করেছেন বলে মনে করবেন না - ব্যতিক্রমটি লোড এবং প্রসেস করার জন্য অতিরিক্ত সংস্থান গ্রহণ করে তাই যদি এটির সত্যিকারের অ্যাপ হত্যার ঘটনা বা প্রক্রিয়া বন্ধ করার প্রক্রিয়া না ঘটে (এগিয়ে যাওয়া ভালোর চেয়ে আরও বেশি ক্ষতির কারণ হয়ে দাঁড়ায়) তবে আমি কোনটি পাস করার জন্য বেছে নেব না কলিং পরিবেশটি উপযুক্ত হিসাবে এটি ব্যাখ্যা করতে পারে value
আমি এখানে যে sensক্যমত্য বলে মনে হয় তার সাথে আমি একমত হয়েছি ("পাওয়া না গেলে নালার প্রত্যাবর্তন করা" একটি সাধারণ সম্ভাব্য ফলাফল, বা যদি পরিস্থিতিটির শব্দার্থবিজ্ঞানের প্রয়োজন হয় যে বস্তুটি সর্বদা খুঁজে পাওয়া যায়)।
তৃতীয় সম্ভাবনা রয়েছে যা আপনার নির্দিষ্ট পরিস্থিতির উপর নির্ভর করে বোধগম্য হতে পারে। আপনার পদ্ধতিটি "পাওয়া যায়নি" শর্তে কোনও ধরণের ডিফল্ট অবজেক্ট ফিরিয়ে আনতে পারে, কলিং কোডটিকে নিশ্চিত করা যায় যে এটি নাল চেকিং বা ব্যতিক্রমী ক্যাচিংয়ের প্রয়োজন ছাড়াই সর্বদা একটি বৈধ অবজেক্টটি গ্রহণ করবে।
একটি নাল ফেরান, ব্যতিক্রমগুলি হ'ল: আপনার কোডটি এমন কিছু করে যা প্রত্যাশিত নয়।
ব্যতিক্রমসমূহ হওয়া উচিত ব্যতিক্রমী । নাল ফিরিয়ে দেওয়া বৈধ হলে নাল ফেরান ।
পদ্ধতিটি যদি কোনও সংগ্রহ ফেরত দেয়, তবে একটি খালি সংগ্রহ (যেমন উপরে বলেছে) ফিরিয়ে দিন। তবে দয়া করে সংগ্রহগুলি নয় EM EMPTY_LIST বা এ জাতীয়! (জাভা ক্ষেত্রে)
যদি পদ্ধতিটি কোনও একক বস্তুটি পুনরুদ্ধার করে তবে আপনার কিছু বিকল্প রয়েছে।
সতর্কতা অবলম্বন করুন, যদি আপনি কোনও শূন্য ফেরত দেওয়ার সিদ্ধান্ত নেন। আপনি যদি প্রকল্পের একমাত্র প্রোগ্রামার না হন তবে রান সময় আপনি নালপয়েন্টারএক্সপ্লেশনগুলি (জাভাতে বা অন্য ভাষাগুলিতে যা কিছু পাবেন) পাবেন! সুতরাং সঙ্কলন সময় পরীক্ষা করা হয় না যা নাল ফিরে না।
null
। আরও তথ্যের জন্য শীর্ষ ভোটের উত্তর দেখুন।
আপনি যদি কোনও লাইব্রেরি বা অন্য কোনও ক্লাস ব্যবহার করছেন যা একটি ব্যতিক্রম ছুঁড়ে ফেলেছে , আপনার এটি পুনর্নির্মাণ করা উচিত । এখানে একটি উদাহরণ। উদাহরণ 2. জাভা লাইব্রেরির মতো এবং উদাহরণ.জভা এটির অবজেক্ট ব্যবহার করে। মেইন.জাভা এই ব্যতিক্রমটি পরিচালনা করার একটি উদাহরণ। আপনার একটি অর্থপূর্ণ বার্তা এবং (যদি প্রয়োজন হয়) কলিংয়ের পক্ষের ব্যবহারকারীর কাছে স্ট্যাক ট্রেস প্রদর্শন করা উচিত।
Main.java
public class Main {
public static void main(String[] args) {
Example example = new Example();
try {
Example2 obj = example.doExample();
if(obj == null){
System.out.println("Hey object is null!");
}
} catch (Exception e) {
System.out.println("Congratulations, you caught the exception!");
System.out.println("Here is stack trace:");
e.printStackTrace();
}
}
}
Example.java
/**
* Example.java
* @author Seval
* @date 10/22/2014
*/
public class Example {
/**
* Returns Example2 object
* If there is no Example2 object, throws exception
*
* @return obj Example2
* @throws Exception
*/
public Example2 doExample() throws Exception {
try {
// Get the object
Example2 obj = new Example2();
return obj;
} catch (Exception e) {
// Log the exception and rethrow
// Log.logException(e);
throw e;
}
}
}
Example2.java
/**
* Example2.java
* @author Seval
*
*/
public class Example2 {
/**
* Constructor of Example2
* @throws Exception
*/
public Example2() throws Exception{
throw new Exception("Please set the \"obj\"");
}
}
আপনি যদি বস্তুটি আবিষ্কার করতে চান বা না পেয়ে থাকেন তবে এটি নির্ভর করে। যদি আপনি এই চিন্তাভাবনাটি অনুসরণ করেন যে ব্যতিক্রমগুলি কোনও কিছুর ইঙ্গিত করার জন্য ব্যবহার করা উচিত, ভাল, ভুল, ব্যতিক্রম তখন ঘটেছিল:
অন্যথায়, নাল ফিরে।