যেখানে ফিরতি মান উপস্থিত নেই এমন ফাংশন / পদ্ধতিগুলি থেকে নুল বা খালি মানগুলি ফেরত দেওয়া ভাল?


135

আমি এখানে একটি সুপারিশ খুঁজছি। আমি যখন সংগ্রামের সাথে লড়াই করছি তখন যখন মূল্য ফেরৎ মূল্য উপস্থিত না থাকে বা নির্ধারণ করা যায় না তখন কোনও পদ্ধতি থেকে ন্যূনাল ফিরিয়ে দেওয়া ভাল বা খালি মান whether

উদাহরণ হিসাবে নিম্নলিখিত দুটি পদ্ধতি গ্রহণ করুন:

string ReverseString(string stringToReverse) // takes a string and reverses it.
Person FindPerson(int personID)    // finds a Person with a matching personID.

ইন ReverseString(), আমি বলব একটি খালি স্ট্রিং রিটার্ন করুন কারণ রিটার্নের ধরনটি স্ট্রিং, তাই কলার এটি প্রত্যাশা করে। এছাড়াও, এইভাবে, কলকারীকে কোনও এনএলএল ফিরে এসেছে কিনা তা পরীক্ষা করে দেখতে হবে না।

ইন FindPerson(), NULL ফিরিয়ে দেওয়া আরও ভাল ফিট বলে মনে হচ্ছে। এনইউএল বা খালি ব্যক্তি অবজেক্ট ( new Person()) ফিরিয়ে দেওয়া হয়েছে কিনা তা বিবেচনা না করেই ফোনকারীকে কিছু করার আগে (ফোন করার মতো UpdateName()) পার্সন অবজেক্ট নাল বা খালি কিনা তা পরীক্ষা করে দেখতে হবে । সুতরাং কেন এখানে কেবল NULL ফিরিয়ে দেওয়া হবে না এবং তারপরে কলকারীকে কেবল NULL পরীক্ষা করতে হবে।

এর সাথে আর কেউ লড়াই করে? কোনও সহায়তা বা অন্তর্দৃষ্টি প্রশংসা করা হয়।


2
এটি বিভিন্ন হবে। আপনি এই যুক্তিও দিতে পারেন যে পদ্ধতিটির সামনে সঠিক হওয়া মানগুলি বন্ধ করা উচিত, উদাহরণস্বরূপ আপনার স্ট্রিংট্রোভার্স প্যারামিটারটি খালি বা নাল হিসাবে পাস করা হবে। আপনি যদি এই চেকটি সম্পাদন করেন (ব্যতিক্রমটিকে পিছনে ফেলে দিয়েছিলেন), এটি সর্বদা নাল ব্যতীত অন্য কোনও কিছু ফিরে আসবে।
অ্যারন ম্যাকআইভার

পাখি পিওইএএ - পি। 496 বেস প্যাটার্নস - বিশেষ কেস (নাল বস্তু) ব্লাচ কার্যকর জাভা, দ্বিতীয় সংস্করণ আইটেম 43: নাল নয় খালি অ্যারে বা সংগ্রহগুলি
ফিরিয়ে দিন

1
@ বোরিস আমি আপনার মন্তব্যটি দেখিনি। আমি আসলে একটি উত্তর হিসাবে বিশেষ কেস পোস্ট।
থমাস Owens

@ থমাস আমি এতে কোনও সমস্যা দেখছি না :)। প্রশ্ন হিসাবে এটি যাইহোক সাধারণ জ্ঞানের বিষয়।
বরিস ত্রেখভভ

একটি আকর্ষণীয় মন্তব্য হ'ল ওরাকল ডাটাবেসে NULL এবং খালি স্ট্রিং একই
WuHoUnited

উত্তর:


77

স্ট্যাকওভারফ্লো এই প্রশ্নোত্তরটিতে এই সঠিক বিষয় সম্পর্কে ভাল আলোচনা করেছে । শীর্ষ রেটেড প্রশ্নে ক্রোনোজ নোটগুলি:

নাল রিটার্নিং সাধারণত সেরা ধারণা যদি আপনি কোনও ডেটা উপলভ্য নয় এমন নির্দেশ করে থাকেন indicate

একটি খালি অবজেক্ট বোঝায় যে ডেটা ফিরিয়ে দেওয়া হয়েছে, যদিও নাল ফেরানো স্পষ্টভাবে ইঙ্গিত দেয় যে কিছুই ফিরে আসে নি।

তদুপরি, নাল ফিরিয়ে দেওয়ার ফলে নাল ব্যতিক্রম ঘটবে যদি আপনি বস্তুতে সদস্যদের অ্যাক্সেস করার চেষ্টা করেন যা বগি কোডটি হাইলাইট করার জন্য দরকারী হতে পারে - কোনও কিছুরই সদস্যের অ্যাক্সেস করার চেষ্টা করা কোনও অর্থহীন নয়। একটি খালি বস্তুর সদস্যদের অ্যাক্সেস ব্যর্থ হবে না এর অর্থ বাগগুলি অনাবৃত হতে পারে।

ব্যক্তিগতভাবে, আমি ফাংশনগুলির জন্য খালি স্ট্রিংগুলি ফিরিয়ে আনতে চাই যা ত্রুটিগুলি পরিচালনা করার পরিমাণটি কমানোর জন্য স্ট্রিংগুলি ফিরে আসে place যাইহোক, আপনাকে নিশ্চিত করতে হবে যে আপনার সাথে যে গ্রুপটি কাজ করছে তারা একই সম্মেলনটি অনুসরণ করবে - অন্যথায় এই সিদ্ধান্তের সুবিধা অর্জন করা হবে না।

যাইহোক, এসও উত্তরের পোস্টারে যেমন উল্লেখ করা হয়েছে, কোনও বস্তুর প্রত্যাশা করা হলে সম্ভবত নালগুলি ফিরিয়ে দেওয়া উচিত যাতে ডেটা ফেরানো হচ্ছে কিনা তা নিয়ে সন্দেহ নেই।

শেষ পর্যন্ত, জিনিসগুলি করার একক সেরা উপায় নেই। একটি দলের sensক্যমত্য তৈরি চূড়ান্তভাবে আপনার দলের সেরা অনুশীলনগুলি চালিত করবে।


8
ব্যক্তিগতভাবে, আমি ফাংশনগুলির জন্য খালি স্ট্রিংগুলি ফিরিয়ে আনতে চাই যা ত্রুটিগুলি পরিচালনা করার পরিমাণটি কমানোর জন্য স্ট্রিংগুলি ফিরে আসে place এই যুক্তিটি কখনই বুঝতে পারিনি। নাল চেকটি কি, সর্বাধিক <10 টি অক্ষর? শ্রমকে নমন করে আমরা কেন এমন আচরণ করব?
অ্যারন ম্যাকআইভার

19
কেউ বলেনি এটি শ্রমের বাঁকানো ছিল was কিন্তু এটা হয় শ্রম। এটি কোডে একটি বিশেষ কেস যুক্ত করে যার অর্থ পরীক্ষা করার জন্য আরও একটি শাখা। এছাড়াও, এটি কোডের প্রবাহকে ব্যাহত করে। for x in list_of_things() {...}তত্ক্ষণাত যুক্তিযুক্তভাবে দ্রুততরl = list_of_things(); if l != null {...}
ব্রায়ান ওকলে

5
@ ব্রায়ান: মানগুলির একটি খালি তালিকা এবং একটি খালি স্ট্রিংয়ের মধ্যে একটি বড় পার্থক্য রয়েছে। একটি স্ট্রিং কদাচিৎ অক্ষরের একটি তালিকা উপস্থাপন করে।
কেভিন cline

3
@ কেভিন ক্লাইন: অবশ্যই তবে স্ট্রিংয়ের ক্ষেত্রে, আপনি চাইছেন যে স্ট্রিংটি নথ হোক বা না হোক কোনও লগটিতে প্রদর্শিত হোক। এটি নাল কিনা তা যাচাই করার পরে আপনি খালি স্ট্রিংটি মুদ্রণ করতে পারবেন আসল অভিপ্রায়ে। অথবা এটি ডাটাবেস ক্ষেত্রের মতো এমন কিছু যা ব্যবহারকারীর দ্বারা অবদান করা সামগ্রী রয়েছে যা আপনি একটি ওয়েব পৃষ্ঠায় যুক্ত করতে চান। এটা করতে সহজ emit(user.hometown)চেয়েif user.hometown == null { emit("") else {emit(user.hometown)}
ব্রায়ান Oakley,

1
এটি কেবল অতিরিক্ত টাইপিং নয় (কোনও বড় বিষয় নয়), তবে এটি পঠনযোগ্যতাকে প্রভাবিত করে। আমি ব্যক্তিগতভাবে কোডগুলি নাল চেকগুলিকে বিভ্রান্ত করার সাথে খুঁজে পেয়েছি।
টডআর

82

আমি যে সমস্ত কোড লিখি সেগুলিতে আমি nullকোনও ফাংশন থেকে ফিরে এড়াতে চাই । আমি ক্লিন কোড এ পড়েছি ।

ব্যবহারের nullক্ষেত্রে সমস্যাটি হ'ল ইন্টারফেসটি ব্যবহার করা ব্যক্তি nullকোনও সম্ভাব্য ফলাফল কিনা তা জানেন না এবং তাদের জন্য এটি পরীক্ষা করতে হবে কিনা, কারণ কোনও not nullরেফারেন্স টাইপ নেই।

এফ # তে আপনি কোনও optionপ্রকার ফিরে আসতে পারেন, যা হতে পারে some(Person)বা noneতাই, কলার কাছে তাদের পরীক্ষা করা উচিত তা স্পষ্ট।

অ্যানালগাস সি # (বিরোধী) প্যাটার্নটি হ'ল Try...পদ্ধতি:

public bool TryFindPerson(int personId, out Person result);

এখন আমি জানি লোকেরা বলেছে যে তারা প্যাটার্নটিকে ঘৃণা করে Try...কারণ আউটপুট প্যারামিটার থাকা খাঁটি ফাংশনের ধারণাগুলি ভেঙে দেয় তবে এটি এর চেয়ে আলাদা নয়:

class FindResult<T>
{
   public FindResult(bool found, T result)
   {
       this.Found = found;
       this.Result = result;
   }

   public bool Found { get; private set; }
   // Only valid if Found is true
   public T Result { get; private set;
}

public FindResult<Person> FindPerson(int personId);

... এবং সত্যি বলতে আপনি অনুমান করতে পারেন যে প্রতিটি। নেট প্রোগ্রামার Try...প্যাটার্ন সম্পর্কে জানেন কারণ এটি নেট কাঠামোর দ্বারা অভ্যন্তরীণভাবে ব্যবহৃত হয়েছে used এর অর্থ এটি কী করে তা বোঝার জন্য তাদের ডকুমেন্টেশন পড়তে হবে না, যা ফাংশনগুলির সম্পর্কে কিছু পিউরিস্টের দৃষ্টিভঙ্গির সাথে আঁকিয়ে পড়া ( প্যারামিটার নয়, বোঝার resultজন্য ) আমার কাছে গুরুত্বপূর্ণ।outref

সুতরাং আমি সাথে যাব TryFindPersonকারণ আপনি মনে করছেন এটি সন্ধান করতে অক্ষম হওয়া একেবারে স্বাভাবিক।

অন্যদিকে, যদি ফোন করার কোনও যুক্তিযুক্ত কারণ নেই যে কলার কখনও এমন একটি সরবরাহ করত personIdযা উপস্থিত ছিল না, আমি সম্ভবত এটি করতাম:

public Person GetPerson(int personId);

... এবং তারপরে যদি আমি অবৈধ ছিলাম তবে আমি একটি ব্যতিক্রম ছুঁড়ে ফেলতাম। Get...উপসর্গ আহ্বানকারী জানে যে এটা সফল হবে বোঝা।


28
+1, যদি আপনি ইতিমধ্যে এটি না করে থাকেন তবে আমি ক্লিন কোডের একটি রেফারেন্স দিয়ে এই প্রশ্নের উত্তর দেব। আমি মন্ত্রটি পছন্দ করি: "যদি আপনার ফাংশন এটির নাম কী বলে, তবে তারপরে ছাড় ছাড়"। প্রতি ডজন লাইন বা তাই নাল পরীক্ষা করার চেয়ে মুউচ আরও ভাল ....
গ্রাহাম

13
আমি মানুষের জ্ঞান সম্পর্কে কিছু ধরে নিয়েই ছেড়ে দিয়েছি।
ক্যাফগীক

5
"নাল ব্যবহারের ক্ষেত্রে সমস্যাটি হ'ল যে ইন্টারফেসটি ব্যবহার করছে সে জানে না যে নাল একটি সম্ভাব্য ফলাফল কিনা, এবং তাদের এটি পরীক্ষা করতে হবে কিনা, কারণ কোনও নাল রেফারেন্স টাইপ নেই।" যেহেতু রেফারেন্সের ধরণগুলি নাল হতে পারে, তাই আপনি কি সর্বদা ধরে নিতে পারবেন না যে নাল একটি সম্ভাব্য ফলাফল?
টমি কারিয়ার

4
যদি কোনও ফাংশন কোনও পয়েন্টার (সি / সি ++) বা কোনও অবজেক্টের (জাভা) রেফারেন্স দেয় তবে আমি সবসময় ধরে নিই যে এটি বাতিল হয়ে যেতে পারে।
জর্জিও

7
"নাল ব্যবহারের ক্ষেত্রে সমস্যাটি হ'ল যে ব্যক্তি ইন্টারফেসটি ব্যবহার করে তা জানে না যে নাল একটি সম্ভাব্য ফলাফল কিনা, এবং তাদের এটি পরীক্ষা করতে হবে কিনা, [...]" যদি কোনও পদ্ধতি শূন্য হয়ে যেতে পারে, তবে তা স্পষ্টভাবে হওয়া উচিত এপিআই চুক্তির অংশ হিসাবে উল্লেখ করা হয়েছে।
Zsolt Török

28

এন্টারপ্রাইজ অ্যাপ্লিকেশন আর্কিটেকচারের প্যাটার্নস থেকে আপনি মার্টিন ফোলারের বিশেষ কেস প্যাটার্নটি চেষ্টা করতে পারেন :

নলগুলি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামগুলিতে বিশ্রী জিনিস কারণ তারা বহুবর্ষকে পরাস্ত করে। সাধারণত আপনি আইটেমটি সঠিক টাইপ বা উপ-শ্রেণীর কিনা তা নিয়ে চিন্তা না করে নিখরচায় একটি নির্দিষ্ট ধরণের পরিবর্তনশীল রেফারেন্সে বিনা দ্বিধায় ফুকতে পারেন। দৃ strongly়ভাবে টাইপিত ভাষার সাথে আপনার কাছেও সংকলকটি কলটি সঠিক কিনা তা পরীক্ষা করতে পারেন। তবে, যেহেতু কোনও ভেরিয়েবলে নাল থাকতে পারে, তাই আপনি নালিতে একটি বার্তা প্রেরণ করে একটি রানটাইম ত্রুটিতে দৌড়াতে পারেন যা আপনাকে একটি সুন্দর, বন্ধুত্বপূর্ণ স্ট্যাক ট্রেস পাবে।

যদি কোনও ভেরিয়েবলের নাল হওয়া সম্ভব হয় তবে আপনাকে এটিকে নাল টেস্ট কোড দিয়ে ঘিরে রাখতে হবে যাতে কোনও নাল উপস্থিত থাকলে আপনি সঠিক কাজটি করতে পারেন। প্রায়শই ডান জিনিসটি অনেক ক্ষেত্রে একই হয়, তাই আপনি অনেক জায়গায় একই কোড লেখার সমাপ্তি করেন - কোড সদৃশতার পাপ করে।

নালগুলি এ জাতীয় সমস্যার সাধারণ উদাহরণ এবং অন্যরা নিয়মিত ক্রপ হয়। সংখ্যার সিস্টেমে আপনাকে অনন্তর মোকাবেলা করতে হবে, যার সংযোজন সম্পর্কিত বিষয়গুলির জন্য বিশেষ বিধি রয়েছে যা প্রকৃত সংখ্যার স্বাভাবিক আক্রমণকারীদের ভেঙে দেয়। ব্যবসায়ের সফ্টওয়্যার সম্পর্কে আমার প্রথম অভিজ্ঞতাটি ছিল একটি ইউটিলিটি গ্রাহকের সাথে, যিনি পুরোপুরি পরিচিত ছিলেন না, "দখলকারী" হিসাবে পরিচিত। এগুলি সমস্তই ধরণের স্বাভাবিক আচরণকে পরিবর্তিত করে।

নাল, বা কিছু বিজোড় মান ফিরে আসার পরিবর্তে, একটি বিশেষ কেস ফিরিয়ে দিন যার কাছে কলারের প্রত্যাশা মতো একই ইন্টারফেস থাকে।


আমি এই দৃশ্যে ছুটে এসেছি তবে সফ্টওয়্যারটি প্রকাশের পরেই। আমার পরীক্ষার ডেটা এটিকে কখনই ট্রিগার করতে পারেনি, তাই এটি নীল থেকে কিছুটা দূরে ছিল এবং ডিবাগ করার জন্য ব্যথা হয়েছিল। যদিও আমি এটি বিশেষ কেস প্যাটার্ন দিয়ে সমাধান করি নি, এটি সম্পর্কে সচেতন হওয়া ভাল।
সমিস

14

আমি মনে করি ReverseString()বিপরীত স্ট্রিংটি ফিরে আসবে এবং এটি একটিতে IllegalArgumentExceptionপাস হলে এটি নিক্ষেপ করবে Null

আমার মনে FindPerson()হয় নুলবজেক্ট প্যাটার্নটি অনুসরণ করা উচিত বা আপনার সন্ধানের জন্য সর্বদা কিছু সক্ষম হতে হবে এমন কিছু না পাওয়ার বিষয়ে একটি চেক করা ব্যতিক্রম বাড়াতে হবে।

মোকাবেলা Nullকরা এমন একটি বিষয় যা এড়ানো উচিত। Nullভাষাগুলিতে থাকার বিষয়টি এর উদ্ভাবক দ্বারা বিলিয়ন ডলার ভুল বলে অভিহিত করেছেন !

আমি এটিকে আমার বিলিয়ন ডলারের ভুল বলছি। এটি 1965 সালে নাল রেফারেন্সের আবিষ্কার ছিল that সেই সময়ে, আমি কোনও অবজেক্ট ওরিয়েন্টেড ল্যাঙ্গুয়েজে (ALGOL ডাব্লু) রেফারেন্সের জন্য প্রথম বিস্তৃত টাইপ সিস্টেমটি ডিজাইন করছিলাম।

আমার লক্ষ্যটি নিশ্চিত করা ছিল যে সমস্ত সংস্থাগুলির দ্বারা রেফারেন্সগুলির ব্যবহার সম্পূর্ণরূপে নিরাপদ হওয়া উচিত checking তবে নাল রেফারেন্স দেওয়ার প্রলোভনটি আমি প্রতিহত করতে পারিনি, কেবল কারণ এটি কার্যকর করা এত সহজ ছিল।

এর ফলে অসংখ্য ত্রুটি, দুর্বলতা এবং সিস্টেম ক্র্যাশ হয়েছে, যা সম্ভবত চল্লিশ বছরে এক বিলিয়ন ডলার ব্যথা এবং ক্ষতির কারণ হয়ে দাঁড়িয়েছে।

সাম্প্রতিক বছরগুলিতে, মাইক্রোসফ্টে প্রিফিক্স এবং প্রিফ্লাস্টের মতো বেশ কয়েকটি প্রোগ্রাম বিশ্লেষক রেফারেন্সগুলি পরীক্ষা করতে ব্যবহার করা হয়েছে, এবং যদি ঝুঁকি থাকে তবে তারা শূন্য হতে পারে এমন সতর্কতা প্রদান করে। স্পেস # এর মতো আরও সাম্প্রতিক প্রোগ্রামিং ল্যাঙ্গুয়েজ নন-নাল রেফারেন্সের জন্য ঘোষণা প্রবর্তন করেছে। এটিই সমাধান, যা আমি 1965 সালে প্রত্যাখ্যান করেছি।

টনি হোয়ার


11

একটি বিকল্প ফেরত দিন । নালপয়েন্টার এক্সসেপশন কোনও ঝুঁকি ছাড়াই একটি ভিন্ন অবৈধ মান (যেমন আপনার সংগ্রহে খালি মান রাখতে সক্ষম হওয়া) ফিরিয়ে দেওয়ার সমস্ত সুবিধা।


1
মজাদার. জাভাতে কোনও বিকল্প কীভাবে প্রয়োগ করবেন? এবং সি ++ এ?
জর্জিও 12

1
@Giorgio, জাভা, Google থেকে পেয়ারা লাইব্রেরি, একটি বর্গ বলা ঐচ্ছিক
ওটাভিও ম্যাসাডো

1
সি ++ এর জন্য রয়েছেboost::optional<T>
MSalters

8

আমি এই তর্কটির উভয় পক্ষই দেখছি এবং আমি বুঝতে পারি যে কিছু পরিষ্কার প্রভাবশালী কণ্ঠস্বর (যেমন, ফওলার) কোড পরিষ্কার রাখতে, অতিরিক্ত ত্রুটি-পরিচালনা পরিচালনা ব্লকগুলি এড়াতে ইত্যাদির জন্য শূন্যতা ফিরে না পাওয়াকে সমর্থন করে etc.

যাইহোক, আমি নাল প্রত্যাবর্তনের সমর্থকদের সাথে ঝোঁক। আমি দেখতে পেলাম যে কোনও পদ্ধতিতে অনুরোধ করার মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে এবং এটির সাথে প্রতিক্রিয়া জানায় যে আমার কাছে কোনও ডেটা নেই এবং এটির সাথে প্রতিক্রিয়া জানায় আমার কাছে এই খালি স্ট্রিং রয়েছে

যেহেতু আমি আলোচনার কিছু লোককে একজন ব্যক্তি শ্রেণির উল্লেখ করে দেখেছি, সেই দৃশ্যের বিষয়টি বিবেচনা করুন যেখানে আপনি ক্লাসের কোনও উদাহরণ সন্ধান করার চেষ্টা করছেন। আপনি যদি কিছু অনুসন্ধানকারী বৈশিষ্ট্য (যেমন, একটি আইডি) পাস করেন তবে ক্লায়েন্ট কোনও মান খুঁজে পাওয়া যায়নি কিনা তা জানতে তাত্ক্ষণিকভাবে নাল পরীক্ষা করে দেখতে পারেন। এটি অগত্যা ব্যতিক্রমী নয় (সুতরাং ব্যতিক্রমের প্রয়োজন নেই), তবে এটি পরিষ্কারভাবে নথিভুক্তও করা উচিত। হ্যাঁ, এটির জন্য ক্লায়েন্টের পক্ষ থেকে কিছু কঠোরতা প্রয়োজন, এবং না, আমি মনে করি এটি মোটেও খারাপ জিনিস নয়।

এখন বিকল্পটি বিবেচনা করুন যেখানে আপনি কোনও বৈধ ব্যক্তি বস্তুটি ফিরিয়ে দেন ... এতে কিছুই নেই। আপনি কি এর সমস্ত মানগুলিতে (নাম, ঠিকানা, প্রিয়ড্রিংক) নালাগুলি রেখেছেন বা আপনি এখন বৈধ তবে খালি বস্তুগুলিকে বিশিষ্ট করতে যান? এখন আপনার ক্লায়েন্ট কীভাবে নির্ধারণ করবেন যে কোনও প্রকৃত ব্যক্তি পাওয়া যায় নি? নামটি শূন্যের পরিবর্তে খালি স্ট্রিং কিনা তা কি তাদের খতিয়ে দেখা উচিত? এই ধরণের জিনিসটি কি আসলে বেশি বা আরও বেশি কোড বিশৃঙ্খলা এবং শর্তাধীন বিবৃতিতে নেতৃত্ব দিচ্ছে না যদি আমরা কেবল নাল পরীক্ষা করে পরীক্ষা করে দেখি?

আবার এই যুক্তির উভয় পক্ষেই আমার পক্ষে একমত হতে পারে এমন পয়েন্ট রয়েছে তবে আমি খুঁজে পাই এটি বেশিরভাগ লোকের কাছে সর্বাধিক অর্থবোধ করে (কোডটি আরও রক্ষণাবেক্ষণযোগ্য করে তোলে)।


পার্থক্যটি হ'ল, " কীটি উপস্থিত না থাকলে একটি শূন্যতা ফিরিয়ে দেয় FindPersonবা GetPersonএকটি ব্যতিক্রম ছুঁড়ে দেয়?" এপিআইর একজন ব্যবহারকারী হিসাবে আমি কেবল জানি না এবং আমাকে ডকুমেন্টেশন চেক করতে হবে। অন্যদিকে, bool TryGetPerson(Guid key, out Person person)আমাকে ডকুমেন্টেশন চেক করার প্রয়োজন নেই এবং আমি জানি যে একটি ব্যতিক্রম কোন ব্যতিক্রমী ব্যতিক্রমী পরিস্থিতি হিসাবে পরিমাণে নিক্ষেপ করা হয় না। আমি আমার উত্তরটি দেওয়ার চেষ্টা করছি।
স্কট হুইটলক

4
আমি মনে করি লোকেরা ব্যতিক্রমগুলির সাথে খুব বেশি সংযুক্ত হয়ে পড়েছে। ব্যতিক্রমগুলি খারাপ এবং সম্পদ গ্রহণযোগ্য। লোকেরা কোনও সমাধান না করে চেষ্টা করে বিবৃতি ধরার চেষ্টা করে mention ব্যতিক্রমগুলি স্পষ্ট লক্ষণ যে কিছু মৌলিকভাবে ভুল হয়েছে। উদাহরণস্বরূপ, নাল রেফারেন্সগুলি একটি ব্যতিক্রম ছোঁড়ে, কারণ নাল বস্তুগুলি উল্লেখ করা স্পষ্টতই ভুল। ব্যক্তিটি পাওয়া গেছে কি না তা পরীক্ষা করে এটি ব্যবহার করা ভুল।
ভ্লাদিমির কোকজানিক

1
@ ভ্লাদিমিরকজানসিক: আমি সম্পূর্ণ একমত: ব্যতিক্রমগুলি যেমন সফ্টওয়্যার বাগ, হার্ডওয়্যার ব্যর্থতা, সিস্টেমের ভুল কনফিগারেশনের মতো ব্যতিক্রমী পরিস্থিতির জন্য ব্যবহার করা উচিত। আপনি যদি কোনও আংশিক ফাংশন গণনা করছেন (যেমন findPerson) তবে কোনও ফলাফল ফিরে পাওয়া একেবারেই স্বাভাবিক। এটি একটি ব্যতিক্রম হতে হবে না।
জর্জিও

6

আপনার যদি আইটেমটির উপস্থিতি আছে কি না তা জানতে প্রয়োজন হলে নালু করুন। অন্যথায়, প্রত্যাশিত ডেটা প্রকারটি ফিরিয়ে দিন। আপনি আইটেমের একটি তালিকা ফিরিয়ে দিলে এটি বিশেষভাবে সত্য। কলকারী কোনও তালিকা চাইছেন কিনা তা ধরে নেওয়া সাধারণত নিরাপদ, তারা তালিকার উপরে পুনরাবৃত্তি করতে চাইবে। অনেকগুলি (সর্বাধিক?) ভাষা ব্যর্থ হয় যদি আপনি শূন্যতার সাথে পুনরাবৃত্তি করতে চেষ্টা করেন তবে ফাঁকা থাকা কোনও তালিকার উপরে পুনরাবৃত্তি করার সময় নয়।

আমি এই জাতীয় কোডটি চেষ্টা করে ব্যবহার করতে হতাশাবোধ করি, কেবল এটি ব্যর্থ হওয়ার জন্য:

for thing in get_list_of_things() {
    do_something_clever(thing)
}

যখন জিনিস নেই তখন মামলার জন্য আমাকে একটি বিশেষ কেস যুক্ত করতে হবে না ।


7
একটি তালিকা বা মানগুলির অন্যান্য গোষ্ঠী প্রত্যাশিত ক্ষেত্রে, আমি সর্বদা ঠিক এই কারণে একটি খালি তালিকা ফিরিয়ে আনার নির্বাচন করি। ডিফল্ট ক্রিয়া (একটি খালি তালিকা জুড়ে পুনরুক্তি করা) প্রায় সর্বদা সঠিক, এবং যদি তা না হয় তবে কলার তালিকাটি খালি কিনা তা স্পষ্ট করে পরীক্ষা করতে পারেন।
টিএমএন

5

এটি পদ্ধতির শব্দার্থবিজ্ঞানের উপর নির্ভর করে। আপনি সম্ভবত উল্লেখ করতে পারেন, আপনার পদ্ধতিটি কেবল "নাল নয়" গ্রহণ করে। জাভাতে আপনি ঘোষণা করতে পারেন যে কিছু মেটাডেটা টিকা ব্যবহার করে:

string ReverseString(@NotNull String stringToReverse)

আপনার কোনওভাবে ফেরতের মান নির্দিষ্ট করা উচিত। যদি আপনি ঘোষণা করেন, আপনি কেবল নটনুল মানগুলি স্বীকার করেন, আপনি খালি স্ট্রিং ফিরিয়ে দিতে বাধ্য (যদি ইনপুটটিও ফাঁকা স্ট্রিং থাকে)।

দ্বিতীয় কেসটি এর শব্দার্থবিজ্ঞানে কিছুটা জটিল। যদি এই পদ্ধতিটি কোনও ব্যক্তিকে তার প্রাথমিক কী দ্বারা প্রত্যাবর্তন করা হয় (এবং সেই ব্যক্তির অস্তিত্ব প্রত্যাশিত) তবে ব্যতিক্রম ছুঁড়ে ফেলা ভাল উপায়।

Person FindPerson(int personID)

আপনি যদি কিছু অনুমান করা আইডির মাধ্যমে ব্যক্তিকে অনুসন্ধান করেন (যা আমার কাছে বিজোড় বলে মনে হয়), তবে আপনি সেই পদ্ধতিটি @ নুলযোগ্য হিসাবে আরও ভালভাবে ঘোষণা করবেন।


3

আমি যখনই সম্ভব নাল অবজেক্ট প্যাটার্নটি ব্যবহার করার পরামর্শ দেব। আপনার পদ্ধতিগুলি কল করার সময় এটি কোডটি সহজতর করে এবং আপনি কুরুচিপূর্ণ কোডটি পড়তে পান না

if (someObject != null && someObject.someMethod () != whateverValue)

উদাহরণস্বরূপ, যদি কোনও পদ্ধতি যদি কিছু প্যাটার্নের সাথে ফিট করে এমন বস্তুর সংকলন ফেরত দেয় তবে খালি সংগ্রহটি ফেরত দেওয়ার চেয়ে ফিরে আসার চেয়ে আরও বেশি অর্থ হয় nullএবং এই খালি সংগ্রহটি পুনরাবৃত্তি করার কারণে কার্যত কোনও কার্যকারিতার দণ্ড থাকবে না। অন্য কেসটি এমন একটি পদ্ধতি হবে যা ডেটা লগ করার জন্য ক্লাসের উদাহরণটি ফেরত দেয়, nullআমার মতে অগ্রাধিকারের চেয়ে নুল বস্তু ফিরিয়ে দেওয়া হয়, কারণ এটি ব্যবহারকারীদের সর্বদা ফিরে আসা রেফারেন্স কিনা তা পরীক্ষা করতে বাধ্য করে না null

যে ক্ষেত্রে ফিরে আসার nullঅর্থ হয় ( findPerson ()উদাহরণস্বরূপ পদ্ধতিটি কল করা ), আমি অন্তত এমন একটি পদ্ধতি সরবরাহ করার চেষ্টা করব যা যদি বস্তুটি উপস্থিত থাকে তবে ( personExists (int personId)উদাহরণস্বরূপ), অন্য একটি উদাহরণ জাভাতে থাকা containsKey ()পদ্ধতি হবে Map)। এটি কলকারীদের কোডকে ক্লিনার করে তোলে, আপনি সহজেই দেখতে পারেন যে পছন্দসই বস্তুটি নাও পাওয়া যেতে পারে (ব্যক্তির অস্তিত্ব নেই, মানচিত্রটিতে কী উপস্থিত নেই)। কোনও রেফারেন্স nullআমার মতে কোডটি অবিচ্ছিন্ন করে কিনা তা ক্রমাগত পরীক্ষা করা ।


3

নীচের শর্তগুলি প্রয়োগ করা হয় এবং কেবল যদি তবেই ফিরে আসার জন্য নাল সেরা জিনিস:

  • নাল ফলাফল স্বাভাবিক অপারেশন আশা করা হয় । এটি প্রত্যাশা করা যেতে পারে যে আপনি কিছু যুক্তিসঙ্গত পরিস্থিতিতে একজন ব্যক্তির সন্ধান করতে পারবেন না, সুতরাং ফাইন্ড পার্সন () নাল ফেরানো ভাল। তবে এটি যদি সত্যই অপ্রত্যাশিত ব্যর্থতা হয় (যেমন সেভমাইম্পোর্ট্যান্ট ডেটা () নামে একটি ফাংশনে) তবে আপনাকে একটি ব্যতিক্রম ছোঁড়া উচিত। নামে একটি ইঙ্গিত রয়েছে - ব্যতিক্রম ব্যতিক্রমী পরিস্থিতিতে!
  • নাল অর্থ "পাওয়া যায় নি / কোন মূল্য নেই" বোঝাতে ব্যবহৃত হয় । আপনি যদি অন্য কিছু বোঝাতে চান তবে অন্য কিছু ফিরিয়ে দিন! ভাল উদাহরণগুলি ভাসমান পয়েন্ট অপারেশন বা এনএনএন ফিরিয়ে নেওয়া হবে - এগুলি নির্দিষ্ট অর্থ সহ মানগুলি তাই আপনি এখানে শূন্য হয়ে ফিরে আসলে এটি খুব বিভ্রান্ত হবে get
  • ফাংশনটির অর্থ ফোল্ডার পার্সন () যেমন একটি একক মান ফেরত দেওয়া । যদি এটি কোনও সংগ্রহ যেমন ফোল্ডারএলআল্ডপিয়োপ () অনুসন্ধান করার জন্য ডিজাইন করা হয় তবে একটি খালি সংগ্রহ সেরা is এর একটি তাত্পর্য যা কোনও ফাংশন যা কোনও সংগ্রহ ফিরিয়ে দেয় তা কখনই শূন্য হয় না

এছাড়াও, নিশ্চিত হয়ে নিন যে ফাংশনটি শূন্য হয়ে যেতে পারে তা আপনি নথিভুক্ত করেছেন

আপনি যদি এই নিয়মগুলি মেনে চলেন তবে নালগুলি বেশিরভাগ ক্ষেত্রে নিরীহ। মনে রাখবেন যে আপনি যদি নাল পরীক্ষা করতে ভুলে যান তবে আপনি সাধারনত তার পরেই একটি নালপয়েন্টার এক্সসেপশন পাবেন যা সাধারণত ঠিক করার জন্য বেশ সহজ বাগ bu এই ব্যর্থ দ্রুত পদ্ধতির একটি জাল রিটার্ন মান (উদাহরণস্বরূপ একটি খালি স্ট্রিং) থাকার চেয়ে অনেক ভাল , যা কোনও ব্যতিক্রম ছাড়াই আপনার সিস্টেমের চারপাশে চুপচাপ প্রচারিত হয়, সম্ভবত ডেটাটিকে দূষিত করে।

অবশেষে, আপনি যদি প্রশ্নটিতে তালিকাবদ্ধ দুটি ফাংশনে এই নিয়মগুলি প্রয়োগ করেন:

  • ফাইন্ডপারসন - এই ব্যক্তিটি খুঁজে পাওয়া না গেলে এই ফাংশনটি নালাগুলি ফেরা উপযুক্ত হবে
  • রিভার্সস্ট্রিং - দেখে মনে হচ্ছে কোনও স্ট্রিং উত্তীর্ণ হলে ফলাফলটি কখনওই ব্যর্থ হয় না (যেহেতু সমস্ত স্ট্রিং খালি স্ট্রিং সহ বিপরীত হতে পারে)। সুতরাং এটি কখনই বাতিল হবে না। যদি কিছু ভুল হয়ে যায় (স্মৃতি থেকে দূরে?) তবে এটির ব্যতিক্রম হওয়া উচিত।

1

আমার মতে NULL ফিরিয়ে দেওয়া, কিছু খালি ফলাফল (উদাহরণস্বরূপ খালি স্ট্রিং বা একটি খালি তালিকা) ফেরানো এবং একটি ব্যতিক্রম ছুঁড়ে ফেলার মধ্যে পার্থক্য রয়েছে।

আমি সাধারণত নিম্নলিখিত পদ্ধতিটি গ্রহণ করি। আমি কোনও ফাংশন বা পদ্ধতি f (v1, ..., vn) কলটিকে কোনও ফাংশনের প্রয়োগ হিসাবে বিবেচনা করি

f : S x T1 x ... x Tn -> T

যেখানে এটি বিশ্বের "বিশ্বের রাষ্ট্র" টি 1, ..., টিএন হ'ল ইনপুট পরামিতিগুলির প্রকার, এবং টি হল প্রত্যাবর্তনের ধরণ।

আমি প্রথমে এই ফাংশনটি সংজ্ঞায়িত করার চেষ্টা করি। যদি ফাংশনটি আংশিক হয় (যেমন কিছু সংখ্যার ইনপুট মান রয়েছে যার জন্য এটি সংজ্ঞায়িত করা হয়নি) আমি এটি সিগন্যাল করতে NULL ফিরিয়ে দেব। এটি কারণ আমি গণনাটি স্বাভাবিকভাবে শেষ হতে চাই এবং আমাকে বলি যে আমি অনুরোধ করা ফাংশনটি প্রদত্ত ইনপুটগুলিতে সংজ্ঞায়িত করা হয়নি। উদাহরণস্বরূপ, রিটার্ন মান হিসাবে একটি খালি স্ট্রিং অস্পষ্ট কারণ এটি হতে পারে যে ফাংশনটি ইনপুটগুলিতে সংজ্ঞায়িত করা হয় এবং খালি স্ট্রিংটি সঠিক ফলাফল।

আমি মনে করি কলিং কোডে একটি NUL পয়েন্টার জন্য অতিরিক্ত চেক প্রয়োজনীয় কারণ আপনি একটি আংশিক ফাংশন প্রয়োগ করছেন এবং প্রদত্ত ইনপুটটির জন্য সংজ্ঞায়িত না থাকলে ফাংশনটি কিনা তা আপনাকে বলা পদ্ধতির কাজ।

আমি ত্রুটিগুলির জন্য ব্যতিক্রমগুলি ব্যবহার করতে পছন্দ করি যা গণনা পরিচালনা করতে দেয় না (যেমন কোনও উত্তর পাওয়া সম্ভব ছিল না)।

উদাহরণস্বরূপ, ধরুন আমার একটি ক্লাস গ্রাহক আছে এবং আমি একটি পদ্ধতি প্রয়োগ করতে চাই

Customer findCustomer(String customerCode)

অ্যাপ্লিকেশন ডাটাবেসে কোনও গ্রাহককে তার কোড দিয়ে সন্ধান করতে। এই পদ্ধতিতে, আমি চাই

  • কোয়েরিটি সফল হলে শ্রেণি গ্রাহকের কোনও বস্তু ফেরত দিন,
  • যদি কোয়েরিতে কোনও গ্রাহক না পাওয়া যায় তবে নাল ফেরান।
  • ডাটাবেসের সাথে সংযোগ স্থাপন করা সম্ভব না হলে একটি ব্যতিক্রম নিক্ষেপ করুন।

নাল জন্য অতিরিক্ত চেক, উদাহরণস্বরূপ

Customer customer = findCustomer("...");
if (customer != null && customer.getOrders() > 0)
{
    ...
}

আমি যা করছি সেগুলির শব্দার্থতন্ত্রের অংশ এবং কোডটি আরও ভালভাবে পড়ার জন্য আমি কেবল "এগুলি এড়িয়ে চলি" না। আমি মনে করি না যে কোডটি সহজ করার জন্য হাতে সমস্যাটির শব্দার্থক শব্দগুলি সহজ করে দেওয়া একটি ভাল অনুশীলন।

অবশ্যই, যেহেতু নুলের জন্য চেকটি প্রায়শই ঘটে থাকে ভাষাটি যদি এর জন্য কিছু বিশেষ বাক্য গঠন সমর্থন করে তবে এটি ভাল।

আমি নাল অবজেক্ট প্যাটার্নটি (ল্যাফের পরামর্শ অনুসারে) ব্যবহার করার বিষয়টিও বিবেচনা করব যতক্ষণ না আমি অন্য শ্রেণীর সমস্ত বস্তুর থেকে কোনও শ্রেণির নাল বস্তুকে পৃথক করতে পারি।


0

সংগ্রহগুলি ফেরত দেওয়ার পদ্ধতিগুলি খালি ফিরে আসতে হবে তবে অন্যরা শূন্য ফিরে আসতে পারে, কারণ সংগ্রহগুলির জন্য এমনটি ঘটতে পারে যে আপনার অবজেক্ট থাকবে তবে এতে কোনও উপাদান নেই, তাই কলার কেবল উভয় আকারের জন্য বৈধতা দেবে।


0

আমার কাছে এখানে দুটি মামলা রয়েছে। আপনি যদি কোনও প্রকারের তালিকাটি ফিরিয়ে দিচ্ছেন তবে আপনার সর্বদা তালিকাটি ফিরিয়ে দেওয়া উচিত যাই হোক না কেন, খালি যদি আপনার কাছে কিছু রাখার থাকে না তবে খালি।

আপনি যখন কোনও একক আইটেম ফিরিয়ে দিচ্ছেন কেবল তখনই আমি যে কোনও বিতর্ক দেখি case জিনিসগুলিকে দ্রুত ব্যর্থ করার ভিত্তিতে এমন পরিস্থিতিতে ব্যর্থতার ক্ষেত্রে আমি নিজেকে নালার দিকে অগ্রাধিকার দেওয়া পছন্দ করি।

যদি আপনি কোনও নাল বস্তুটি ফিরে পান এবং কলারের যদি সত্যিকারের কোনও জিনিসের প্রয়োজন হয় তবে তারা এগিয়ে যেতে পারে এবং অপ্রত্যাশিত আচরণের নাল বস্তুটি ব্যবহার করার চেষ্টা করতে পারে। আমি মনে করি যে তারা পরিস্থিতি মোকাবেলা করতে ভুলে গেলে রুটিনের পক্ষে এটি আরও ভাল হয়। কিছু ভুল হলে আমি ASAP ব্যতিক্রম চাই। আপনি এভাবে কোনও বাগ চালানোর সম্ভাবনা কম পাবেন less


0

Maybeটাইপ কনস্ট্রাক্টর সম্পর্কে লোকেরা ইতিমধ্যে যা বলেছিল তাতে যুক্ত হচ্ছে :

এনপিইগুলি ঝুঁকি না নেওয়ার পরে আর একটি বড় লাভটি হ'ল শব্দার্থক শব্দ। কার্যকরী বিশ্বে, যেখানে আমরা খাঁটি ফাংশনগুলি নিয়ে কাজ করি, আমরা এমন ফাংশনগুলি তৈরি করতে চেষ্টা করতে চাই যা প্রয়োগ করা হলে তাদের ফেরতের মূল্যের সমান হয় । এর ক্ষেত্রে বিবেচনা করুন String.reverse(): এটি এমন একটি ফাংশন যা একটি নির্দিষ্ট স্ট্রিং দেয় সেই স্ট্রিংটির বিপরীত সংস্করণ উপস্থাপন করে। আমরা জানি যে এই স্ট্রিংটি বিদ্যমান, কারণ প্রতিটি স্ট্রিং বিপরীত হতে পারে (স্ট্রিংগুলি মূলত অক্ষরের সেটগুলি অর্ডার করা হয়)।

এখন, কি findCustomer(int id)? এই ফাংশনটি প্রদত্ত আইডি থাকা গ্রাহকের প্রতিনিধিত্ব করে। এটি এমন কিছু যা বিদ্যমান বা নাও থাকতে পারে। তবে মনে রাখবেন, ফাংশনগুলির একটি একক রিটার্ন মান থাকে, তাই আপনি সত্যই বলতে পারবেন না "এই ফাংশনটি কোনও গ্রাহককে প্রদত্ত আইডি দিয়ে দেয় বা এটি ফেরত দেয় null

nullশূন্য বস্তুটি ফিরে আসা এবং ফিরে দেওয়া উভয়ই আমার মূল বিষয়টি । তারা বিভ্রান্ত করছে। nullকোনও গ্রাহক নয় এবং এটি সত্যই "গ্রাহকের অনুপস্থিতি" নয়। এটি কোনও কিছুর অনুপস্থিতি। এটি কিছুই নয় কেবল একটি টাইপলেস পয়েন্টার। খুব নিম্ন-স্তরের এবং খুব কুরুচিপূর্ণ এবং খুব ত্রুটি-প্রবণ। একটি নাল বস্তু এখানে বেশ বিভ্রান্তিকর আমিও মনে করি। একটি নাল গ্রাহক একজন গ্রাহক। এটি কারওর অনুপস্থিতি নয়, এটি যে আইডি চেয়েছে তা গ্রাহক নয়, সুতরাং এটি ফিরিয়ে দেওয়া কেবল ভুল। এটি আমি যে গ্রাহকের জন্য জিজ্ঞাসা করেছি তা নয়, তবে আপনি এখনও দাবি করেন যে আপনি কোনও গ্রাহককে ফিরিয়ে দিয়েছেন। এটির ভুল আইডি রয়েছে, স্পষ্টত এটি একটি বাগ। এটি পদ্ধতির নাম এবং স্বাক্ষর দ্বারা প্রস্তাবিত চুক্তিটি ভঙ্গ করে। আপনার নকশা সম্পর্কে জিনিস ধরে নিতে বা ডকুমেন্টেশন পড়ার জন্য এটির ক্লায়েন্ট কোড প্রয়োজন।

এই দুটি বিষয়ই একটি দ্বারা সমাধান করা হয় Maybe Customer। হঠাৎ, আমরা বলছি না "এই ফাংশন প্রদত্ত আইডি সহ গ্রাহককে উপস্থাপন করে"। আমরা বলছি "এই ফাংশনটি প্রদত্ত আইডি উপস্থিত থাকলে গ্রাহককে প্রতিনিধিত্ব করে it এটি এখন কী করে তা সম্পর্কে খুব স্পষ্ট এবং স্পষ্ট। আপনি যদি অস্তিত্বহীন আইডি সহ গ্রাহকের জন্য জিজ্ঞাসা করেন তবে আপনি পাবেন Nothingbetter এটি আরও কীভাবে ভাল? চেয়ে null? শুধু নয় NPE ঝুঁকি। কিন্তু এটাও একটা কারণ ধরণ Nothingঠিক নয় Maybe। এটা Maybe Customer। এটি শব্দার্থিক অর্থ রয়েছে। এটা বিশেষভাবে, মানে "একটি গ্রাহক অভাবে" যা নির্দেশ করে এমন একটি গ্রাহক অস্তিত্ব নেই।

শূন্যের সাথে আর একটি সমস্যা অবশ্যই এটি দ্ব্যর্থক। আপনি কি গ্রাহককে খুঁজে পেলেন না, বা সেখানে কোনও ডিবি সংযোগের ত্রুটি রয়েছে বা আমাকে কেবল সেই গ্রাহককে দেখার অনুমতি দেওয়া হচ্ছে না?

যদি হ্যান্ডল করার জন্য আপনার মতো বেশ কয়েকটি ত্রুটিযুক্ত সমস্যা থাকে তবে আপনি either সংস্করণগুলির জন্য ব্যতিক্রম ছুঁড়ে ফেলতে পারেন বা (এবং আমি এইভাবে পছন্দ করি) আপনি Either CustomerLoadError Customerকোনওটি ভুল হয়ে গেছে বা প্রত্যাবর্তিত গ্রাহককে উপস্থাপন করে কোনও ফিরিয়ে দিতে পারেন। Maybe Customerআপনাকে কী ভুল হতে পারে তা নির্দিষ্ট করার অনুমতি দেওয়ার পাশাপাশি এর সমস্ত সুবিধা রয়েছে ।

আমি পরে প্রধান জিনিস হ'ল এটির স্বাক্ষরে ফাংশনের চুক্তিটি ক্যাপচার করা। জিনিস অনুমান করবেন না, ক্ষণস্থায়ী সম্মেলনে নির্ভর করবেন না, সুস্পষ্ট হয়ে উঠুন।


0

1) যদি ফাংশনটির অর্থগত ধারণাটি হয় যে এটি কিছুই ফিরিয়ে দিতে পারে না, কলারের পক্ষে এটির জন্য পরীক্ষা অবশ্যই করা উচিত, অন্যথায় তিনি যেমন। আপনার টাকা নিয়ে কাউকে দিন না

2) শব্দার্থকভাবে সবসময় কিছু ফিরে (বা নিক্ষিপ্ত) ফাংশনগুলি করা ভাল।

কোনও লগার দিয়ে , লগারটি ফেরত দেওয়া বোধগম্য যে কোনও লগার সংজ্ঞায়িত না হলে লগ হয় না। সংগ্রহ ফিরে আসার সময়, এটি কখনই কিছুই বোঝায় না ("নিম্ন পর্যায়ে পর্যায়ে" ব্যতীত, যেখানে সংগ্রহটি নিজেই ডেটা হয়, যা এতে থাকে না) কিছুই ফেরত দেয় না, কারণ খালি সেটটি একটি সেট, কিছুই নয়।

একজন ব্যক্তির উদাহরণ সহ, আমি "হাইবারনেট" পথে যাব (বনাম লোড, আইআইআরসি পেতে, তবে সেখানে অলস লোডিংয়ের জন্য প্রক্সি অবজেক্টগুলি জটিল) সেখানে দুটি ফাংশন রয়েছে যা একটি নাল এবং দ্বিতীয়টি ছুড়ে দেয়।


-1
  • যদি অ্যাপ্লিকেশনটি কোনও ডেটা উপলব্ধ হওয়ার প্রত্যাশা করে তবে ডেটা উপলব্ধ না হয় N উদাহরণস্বরূপ, একটি পরিষেবা যা জিপকোডের উপর ভিত্তি করে সিটিটি ফেরত দেয় যদি শহরটি খুঁজে পাওয়া যায় না তবে তা শূন্য করা উচিত। কলার তারপরে নালটি পরিচালনা করতে বা আপকে উড়িয়ে দেওয়ার সিদ্ধান্ত নিতে পারে।

  • দুটি সম্ভাবনা থাকলে খালি তালিকা ফিরিয়ে দিতে হবে। ডেটা উপলব্ধ বা কোনও ডেটা উপলব্ধ। উদাহরণস্বরূপ একটি পরিষেবা যা জনসংখ্যা নির্দিষ্ট সংখ্যার চেয়ে বেশি হলে সিটিটি (গুলি) দেয়। প্রদত্ত মানদণ্ডকে সন্তুষ্ট না করে এমন কোনও ডেটা না থাকলে এটি খালি তালিকা ফেরত দিতে পারে।


-2

NUL রিটার্নিং একটি ভয়ঙ্কর নকশা , অবজেক্ট-ওরিয়েন্টেড বিশ্বে। সংক্ষেপে, নুল ব্যবহারের দিকে নিয়ে যায়:

  • অ্যাডহক ত্রুটি পরিচালনা (ব্যতিক্রম পরিবর্তে)
  • অস্পষ্ট শব্দার্থক
  • দ্রুত ব্যর্থতার পরিবর্তে ধীর
  • কম্পিউটার চিন্তা বনাম বস্তু চিন্তাভাবনা
  • পরিবর্তনীয় এবং অসম্পূর্ণ বস্তু

বিস্তারিত ব্যাখ্যার জন্য এই ব্লগ পোস্টটি দেখুন: http://www.yegor256.com/2014/05/13/why-null-is-bad.html

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.