আমি কিছু ভয়েস শুনেছি যে পদ্ধতিগুলি থেকে ফেরত নাল মান পরীক্ষা করা খারাপ নকশা is আমি এর কিছু কারণ শুনতে চাই।
সুডোকোড:
variable x = object.method()
if (x is null) do something
আমি কিছু ভয়েস শুনেছি যে পদ্ধতিগুলি থেকে ফেরত নাল মান পরীক্ষা করা খারাপ নকশা is আমি এর কিছু কারণ শুনতে চাই।
সুডোকোড:
variable x = object.method()
if (x is null) do something
উত্তর:
নাল না ফেরার পিছনে যুক্তি হ'ল আপনাকে এটি পরীক্ষা করতে হবে না এবং তাই আপনার কোডটি ফেরতের মানের ভিত্তিতে আলাদা পথ অনুসরণ করার প্রয়োজন নেই । আপনি নাল অবজেক্ট প্যাটার্নটি পরীক্ষা করতে চাইতে পারেন যা এ সম্পর্কে আরও তথ্য সরবরাহ করে।
উদাহরণস্বরূপ, যদি আমি জাভাতে এমন কোনও পদ্ধতি সংজ্ঞায়িত করতে পারি যা কোনও সংগ্রহ ফিরিয়ে দেয় তবে আমি সাধারণত Collections.emptyList()
ক্লায়েন্ট কোডটি ক্লিনার বলে নাল পরিবর্তে খালি সংগ্রহ (অর্থাত্ ) ফেরত দিতে পছন্দ করব; যেমন
Collection<? extends Item> c = getItems(); // Will never return null.
for (Item item : c) { // Will not enter the loop if c is empty.
// Process item.
}
... যা এর চেয়ে পরিষ্কার:
Collection<? extends Item> c = getItems(); // Could potentially return null.
// Two possible code paths now so harder to test.
if (c != null) {
for (Item item : c) {
// Process item.
}
}
null
একটি "ধারক", এতে শূন্য বা বস্তুর প্রতি এক পয়েন্টার রয়েছে। (এই অবশ্যই কিভাবে এটা স্পষ্টভাবে Haskell, এর দ্বারা অনুকরণে হচ্ছে Maybe
সেই ক্ষেত্রে, এবং সমস্ত লোকের ফলে জন্য উত্তম।)
এখানে কারণ।
ইন ক্লিন কোড রবার্ট মার্টিন তিনি লিখেছেন যে ফিরে নাল খারাপ নকশা যখন আপনি যদি এর পরিবর্তে আসতে পারেন, বলো, খালি অ্যারে। প্রত্যাশিত ফলাফল যেহেতু একটি অ্যারে, কেন নয়? এটি আপনাকে কোনও অতিরিক্ত শর্ত ছাড়াই ফলাফলের মাধ্যমে পুনরাবৃত্তি করতে সক্ষম করবে। যদি এটি একটি পূর্ণসংখ্যা হয়, তবে 0 টি যথেষ্ট হবে, যদি এটি একটি হ্যাশ, খালি হ্যাশ হয়। প্রভৃতি
ভিত্তিটি হ'ল তাত্ক্ষণিকভাবে সমস্যাগুলি হ্যান্ডেল করার জন্য কলিং কোডকে জোর না করা। কলিং কোড তাদের সাথে নিজেকে উদ্বেগ করতে নাও পারে। এ কারণেই অনেক ক্ষেত্রে ব্যতিক্রম শূন্যের চেয়ে ভাল।
নাল ফেরার ভাল ব্যবহার:
খারাপ ব্যবহার: ব্যতিক্রমী পরিস্থিতি প্রতিস্থাপন বা আড়াল করার চেষ্টা করা যেমন:
এই ক্ষেত্রে ব্যতিক্রম ছুঁড়ে ফেলা অধিক পর্যাপ্ত:
তবে ব্যতিক্রমগুলি সাধারণ প্রোগ্রাম অপারেশন শর্তাদি যেমন পরিচালনা করতে ব্যবহার করা উচিত নয়:
boolean login(String,String)
বলে মনে হয় এবং ঠিক তাই হয়AuthenticationContext createAuthContext(String,String) throws AuthenticationException
হ্যাঁ, এনইউএলএলকে ফিরিয়ে দেওয়া হ'ল এক ভয়ঙ্কর নকশা object সংক্ষেপে, নুল ব্যবহারের দিকে নিয়ে যায়:
বিস্তারিত ব্যাখ্যার জন্য এই ব্লগ পোস্টটি দেখুন: http://www.yegor256.com/2014/05/13/why-null-is-bad.html । আমার গ্রন্থে মার্জিত অবজেক্টস , বিভাগ 4.1।
bool TryGetBlah(out blah)
বা FirstOrNull()
বা MatchOrFallback(T fallbackValue)
।
isEmpty()
) এবং যদি এটি সত্য হয় তবেই পদ্ধতিটি কল করুন। লোকেরা দ্বিতীয়টির বিরুদ্ধে তর্ক করে বলেছে এটি খারাপ কাজ করে - তবে ইউনিক্স দর্শন হিসাবে বলা হয়েছে, "মেশিনের সময়ের চেয়ে মানুষের সময়কে মূল্য দিন" (অর্থাত্ তুচ্ছভাবে ধীর পারফরম্যান্স ডেভলপারদের ডিবাগিং কোডের তুলনায় কম সময় নষ্ট করে যা তুচ্ছ ত্রুটি দিচ্ছে))
কে বলেছে এটি খারাপ নকশা?
নালগুলির জন্য অনুসন্ধান করা একটি সাধারণ অনুশীলন, এমনকি উত্সাহিতও করা হয়, অন্যথায় আপনি সর্বত্র নালরফেরান এক্সেক্সসেপসের ঝুঁকিটি চালান। আপনার যখন প্রয়োজন হবে না তখন ব্যতিক্রম ছোঁড়ার চেয়ে কৃপণভাবে ত্রুটিটি পরিচালনা করা ভাল।
আপনি এতক্ষণ যা বলেছেন তার ভিত্তিতে, আমি মনে করি পর্যাপ্ত তথ্য নেই।
একটি ক্রিয়েট উইজেট () পদ্ধতি থেকে নাল ফেলা খারাপ মনে হয়।
একটি FindFooInBar () পদ্ধতি থেকে নালায় ফেরা ভাল মনে হচ্ছে।
Create...
নতুন উদাহরণ দেয়, বা ছোঁড়ে ; Get...
প্রত্যাশিত বিদ্যমান উদাহরণটি ফেরত দেয় , বা ছোঁড়ে ; GetOrCreate...
একটি বিদ্যমান উদাহরণ, বা নতুন উদাহরণ উপস্থিত না থাকলে, বা ছুঁড়ে ফেলে দেয় ; Find...
একটি বিদ্যমান উদাহরণ প্রদান করে, যদি এটি বিদ্যমান থাকে, বাnull
। সংগ্রহের প্রশ্নের জন্য - Get...
সর্বদা একটি সংগ্রহ ফিরিয়ে দেয়, যা কোনও মিল খুঁজে পাওয়া যায় না যদি খালি থাকে empty
এর উদ্ভাবক বলেছেন এটি এক বিলিয়ন ডলারের ভুল!
এটি আপনি যে ভাষাটি ব্যবহার করছেন তার উপর নির্ভর করে। আপনি যদি সি # এর মতো ভাষায় থাকেন যেখানে কোনও মানের অভাবের ইঙ্গিত দেওয়ার মূ .় উপায়টি নালার দিকে ফিরে আসে, তারপরে যদি আপনার কোনও মান না থাকে তবে নাল ফেরানো ভাল ডিজাইন। বিকল্পভাবে, হাস্কেলের মতো ভাষায় যা এই মামলার জন্য আইডেমিকভাবে সম্ভবত মোনাদ ব্যবহার করে, তবে নাল ফেরানো একটি খারাপ নকশা হবে (যদি এটি এমনকি সম্ভব হত)।
null
সি # এবং জাভা এর মতো ভাষাগুলির সংজ্ঞাটি প্রায়শই ওভারলোড করে এবং ডোমেনে কিছু অর্থ প্রদান করা হয়। আপনি যদি null
ভাষা স্পেসে কীওয়ার্ডটি সন্ধান করেন তবে এর অর্থ সহজেই "একটি অবৈধ পয়েন্টার"। সম্ভবত কোনও সমস্যা ডোমেনে কিছুই বোঝা যাচ্ছে না।
null
বা "আরম্ভ নয়"null
আপনি যদি সমস্ত উত্তর পড়েন তবে এটি পরিষ্কার হয়ে যায় যে এই প্রশ্নের উত্তরটি ধরণের পদ্ধতির উপর নির্ভর করে।
প্রথমত, যখন ব্যতিক্রমী কিছু ঘটে (আইওপ্রব্লেম ইত্যাদি), যৌক্তিকভাবে ব্যতিক্রম ছুঁড়ে দেওয়া হয়। যখন ঠিক কিছু ব্যতিক্রমী হয় তখন সম্ভবত অন্য কোনও বিষয়ের জন্য ..
যখনই কোনও পদ্ধতির প্রত্যাশা করা হয় তখন সম্ভবত দুটি ফলাফল নেই:
যতক্ষণ না আমাদের কাছে একটি আনুষ্ঠানিক উপায় রয়েছে যে কোনও ফাংশনটি বাতিল বা ফিরে আসতে পারে না তা বোঝানোর জন্য আমি নামকরণের সম্মেলনটি বোঝানোর চেষ্টা করি। যে পদ্ধতিগুলির ব্যর্থতা প্রত্যাশিত হয় তার জন্য
আপনার যেমন ট্র্যাথ সামথিং () কনভেনশন রয়েছে ঠিক তেমনই পদ্ধতিটি শূন্যের পরিবর্তে কোনও নিরপেক্ষ ফলাফল ফেরত দেওয়ার সময় আমি প্রায়শই আমার পদ্ধতিগুলি সেফ সামথিং () রাখি ।
আমি এখনও নামটির সাথে পুরোপুরি ঠিক নেই, তবে এর থেকে ভাল আর কিছু করতে পারিনি। সুতরাং আমি আপাতত যে সাথে চালাচ্ছি।
আমার এই অঞ্চলে একটি সম্মেলন হয়েছে যা আমাকে ভালভাবে উপভোগ করেছে
একক আইটেম প্রশ্নের জন্য:
Create...
একটি নতুন উদাহরণ দেয়, বা ছোঁড়াGet...
প্রত্যাশিত বিদ্যমান উদাহরণটি দেয় বা নিক্ষেপ করেGetOrCreate...
কোনও বিদ্যমান উদাহরণ বা নতুন উদাহরণ উপস্থিত না থাকলে, বা নিক্ষেপ করে না returnsFind...
একটি বিদ্যমান উদাহরণ প্রদান করে, যদি এটি বিদ্যমান থাকে, বাnull
সংগ্রহের প্রশ্নের জন্য:
Get...
সর্বদা একটি সংগ্রহ ফিরিয়ে দেয়, যা [1] আইটেমের কোনও মিল না পাওয়া গেলে খালি[1] ফাংশনের নাম বা পরামিতি হিসাবে দেওয়া কিছু মানদণ্ড, সুস্পষ্ট বা অন্তর্নিহিত given
Get
যখন এটি সেখানে থাকার প্রত্যাশা করব তখন আমি এটি ব্যবহার করি , যাতে এটি যদি না থাকে তবে এটি একটি ত্রুটি এবং আমি নিক্ষেপ করি - আমাকে কখনই ফেরতের মান পরীক্ষা করার দরকার নেই। আমি এটি ব্যবহার Find
করি কিনা তা যদি আমি সত্যিই না জানি বা ব্যবহার করি - তবে আমার ফেরতের মানটি পরীক্ষা করতে হবে।
ব্যতিক্রম অন্যান্য পরিস্থিতিতে ব্যতিক্রম al
যদি আপনার ফাংশনটি কোনও প্রদত্ত বস্তুর সাথে সম্পর্কিত কোনও অ্যাট্রিবিউট সন্ধান করার উদ্দেশ্যে তৈরি করা হয়, এবং সেই অবজেক্টটির তেমন কোনও বৈশিষ্ট্য নেই, তবে এটি নাল ফেরানো উপযুক্ত হতে পারে be যদি বস্তুর অস্তিত্ব না থাকে তবে একটি ব্যতিক্রম ছুঁড়ে দেওয়া আরও উপযুক্ত হতে পারে। যদি ফাংশনটি বৈশিষ্ট্যের একটি তালিকা ফেরত বোঝানো হয় এবং ফিরে আসার মতো কিছু না থাকে তবে খালি তালিকা ফিরিয়ে দেওয়া অর্থপূর্ণ হয় - আপনি সমস্ত শূন্য বৈশিষ্ট্য ফিরিয়ে দিচ্ছেন।
এটি কোনওভাবেই অর্থপূর্ণ হলে নাল ফিরে ফেলা ভাল:
public String getEmployeeName(int id){ ..}
এই জাতীয় ক্ষেত্রে যদি আইডিটি কোনও বিদ্যমান সত্তার সাথে সামঞ্জস্য না করে তবে নাল ফেরানো অর্থপূর্ণ, কারণ এটি আপনাকে সেই ক্ষেত্রে পার্থক্য করতে দেয় যেখানে বৈধ ত্রুটি থেকে কোনও মিল খুঁজে পাওয়া যায় নি।
লোকেরা এটি খারাপ বলে মনে করতে পারে কারণ এটি "বিশেষ" রিটার্ন মান হিসাবে অপব্যবহার করা যেতে পারে যা একটি ত্রুটি শর্ত নির্দেশ করে, যা এতটা ভাল নয়, কিছুটা ফাংশন থেকে ত্রুটি কোডগুলি ফিরিয়ে দেওয়ার মতো তবে বিভ্রান্তিকর কারণ কারণ ব্যবহারকারীকে রিটার্ন পরীক্ষা করতে হবে নাল, উপযুক্ত ব্যতিক্রমগুলি ধরার পরিবর্তে, যেমন
public Integer getId(...){
try{ ... ; return id; }
catch(Exception e){ return null;}
}
এটি অগত্যা কোনও খারাপ নকশা নয় - অনেকগুলি ডিজাইনের সিদ্ধান্তের সাথে এটি নির্ভর করে।
যদি পদ্ধতির ফলাফল এমন কিছু হয় যা সাধারণ ব্যবহারে ভাল ফলাফল না করে তবে নাল ফেরানো ভাল:
object x = GetObjectFromCache(); // return null if it's not in the cache
যদি সত্যিই সর্বদা একটি নন-ফলাফল হওয়া উচিত, তবে একটি ব্যতিক্রম ছুঁড়ে ফেলা ভাল:
try {
Controller c = GetController(); // the controller object is central to
// the application. If we don't get one,
// we're fubar
// it's likely that it's OK to not have the try/catch since you won't
// be able to really handle the problem here
}
catch /* ... */ {
}
Optional<>
নির্দিষ্ট পরিস্থিতিতে, আপনি ব্যর্থতা হওয়ার সাথে সাথেই এটি লক্ষ্য করতে চান।
NULL এর বিরুদ্ধে চেক করা এবং ব্যর্থতার ক্ষেত্রে (প্রোগ্রামার ত্রুটির জন্য) দৃ as়তা না দেওয়া বা নিক্ষেপ করা (ব্যবহারকারী বা কলার ত্রুটির জন্য) নিক্ষেপ করার অর্থ এই হতে পারে যে পরে ক্র্যাশগুলি ট্র্যাক ডাউন করা আরও শক্ত, কারণ আসল বিজোড় কেসটি খুঁজে পাওয়া যায় নি।
তদ্ব্যতীত, ত্রুটিগুলি উপেক্ষা করে সুরক্ষা কাজে লাগাতে পারে। সম্ভবত নাল-নেসটি এসেছে যে কোনও বাফার ওভাররাইট করা হয়েছে বা এর মতো হয়েছে। এখন, আপনি ক্রাশ করছেন না , যার অর্থ শোষকের কাছে আপনার কোডে কার্যকর করার সুযোগ রয়েছে।
নাল ফিরতে আপনি কোন বিকল্পগুলি দেখছেন?
আমি দুটি কেস দেখতে পাচ্ছি:
এক্ষেত্রে আমরা পারলাম: নাল ফিরুন বা একটি (পরীক্ষিত) ব্যতিক্রম নিক্ষেপ করুন (বা সম্ভবত কোনও আইটেম তৈরি করুন এবং এটি ফেরত দিন)
এই ক্ষেত্রে আমরা নাল ফিরিয়ে দিতে, একটি খালি তালিকা ফিরতে বা একটি ব্যতিক্রম নিক্ষেপ করতে পারি।
আমি বিশ্বাস করি যে বিকল্পের তুলনায় রিটার্ন নাল কম ভাল হতে পারে কারণ ক্লায়েন্টকে নাল পরীক্ষা করার জন্য মনে রাখা দরকার, প্রোগ্রামাররা ভুলে যায় এবং কোড দেয়
x = find();
x.getField(); // bang null pointer exception
জাভাতে, একটি চেক করা ব্যতিক্রম, রেকর্ডনটফাউন্ডএক্সসেপশন নিক্ষেপ করে, সংকলককে ক্লায়েন্টকে কেস মোকাবেলার জন্য স্মরণ করিয়ে দেওয়ার অনুমতি দেয়।
আমি দেখতে পেয়েছি যে খালি তালিকা ফিরিয়ে দেওয়া অনুসন্ধানগুলি বেশ সুবিধাজনক হতে পারে - কেবলমাত্র তালিকার সমস্ত বিষয়বস্তু সহ প্রদর্শনকে জনপ্রিয় করুন, ওহ এটি খালি, কোড "স্রেফ কাজ করে"।
কখনও কখনও, NULL ফিরিয়ে দেওয়া সঠিক জিনিস, তবে বিশেষত যখন আপনি বিভিন্ন ধরণের ক্রমের (অ্যারে, তালিকাগুলি, স্ট্রিংগুলি, আপনি কী করেন) কাজ করছেন তখন সম্ভবত একটি শূন্য দৈর্ঘ্যের ক্রমটি ফেরত দেওয়া ভাল better সংক্ষিপ্ততর এবং আশা করি আরও বোধগম্য কোড বাড়ে, যখন এপিআই প্রয়োগকারীদের অংশে আরও বেশি লেখা না নেয়।
পূর্ববর্তী কলটি শূন্য ছিল কিনা তা নির্ধারণ করার জন্য তাদের অন্য পদ্ধতিতে কল করুন। ;-) আরে, জেডিবিসির পক্ষে এটি যথেষ্ট ভাল ছিল
এই থ্রেডের পিছনের বেস ধারণাটি ডিফেন্সিভভাবে প্রোগ্রাম করা। যে, অপ্রত্যাশিত বিরুদ্ধে কোড। বিভিন্ন জবাবের একটি অ্যারে রয়েছে:
অ্যাডামস্কি নাল অবজেক্ট প্যাটার্নটি দেখার পরামর্শ দিয়েছিলেন, সেই উত্তরটির সাথে সেই পরামর্শটির পক্ষে ভোট দেওয়া হয়েছে।
মাইকেল ভ্যালেন্টি বিকাশকারীকে কী প্রত্যাশা করা যেতে পারে তা জানানোর জন্য একটি নামকরণের সম্মেলনের পরামর্শ দেয়। জিরো কনসেপ্ট ব্যতিক্রমের যথাযথ ব্যবহারের পরামর্শ দেয়, যদি এটি NUL এর কারণ হয়। এবং অন্যদের.
আমরা যদি সর্বদা রক্ষণাত্মক প্রোগ্রামিং করতে চাই "নিয়ম" তৈরি করি তবে আমরা দেখতে পাব যে এই পরামর্শগুলি বৈধ।
তবে আমাদের কাছে দুটি বিকাশের পরিস্থিতি রয়েছে।
বিকাশকারী "রচয়িতা" ক্লাস: লেখক
অন্য (সম্ভবত) বিকাশকারী দ্বারা "গ্রাসিত" শ্রেণি: বিকাশকারী
কোনও শ্রেণি একটি রিটার্ন মান সহ পদ্ধতিগুলির জন্য NULL প্রদান করে কিনা তা নির্বিশেষে, বিকাশকারীকে বস্তুটি বৈধ কিনা তা পরীক্ষা করতে হবে।
যদি বিকাশকারী এটি করতে না পারে তবে সেই শ্রেণি / পদ্ধতিটি নির্বিচারক নয়। এটি হ'ল, যদি "পদ্ধতি কল" অবজেক্টটি পেতে চায় তবে এটি "বিজ্ঞাপন" হিসাবে কী করে না (যেমন getEmployee) এটি চুক্তি ভঙ্গ করেছে।
কোনও শ্রেণীর লেখক হিসাবে আমি কোনও পদ্ধতি তৈরি করার সময় সর্বদা সদয় এবং প্রতিরক্ষামূলক (এবং সংজ্ঞাবাদী) হতে চাই।
সুতরাং প্রদত্ত যে NULL বা NULL OBJECT (উদাহরণস্বরূপ (যদি NullEmployee.ISVALID হিসাবে কর্মচারী)) পরীক্ষা করা দরকার এবং এটি কর্মচারীদের সংগ্রহের সাথে ঘটতে পারে তবে নাল অবজেক্টের পদ্ধতিকেই হল আরও ভাল পদ্ধতির।
তবে আমি মাইকেল ভ্যালেন্টির এই পদ্ধতির নামকরণের পরামর্শটিও পছন্দ করি যা অবশ্যই নালাগুলি ফিরে আসবে যেমন getEmployeeOrNull।
কোনও লেখক যিনি ব্যতিক্রম ছুঁড়েছেন এটি বিকাশকারীর পক্ষে অবজেক্টের বৈধতা পরীক্ষা করার জন্য পছন্দটি সরিয়ে দিচ্ছেন, যা বস্তুর সংগ্রহের ক্ষেত্রে খুব খারাপ and
বিকাশকারী ক্লাস গ্রাসকারী হিসাবে, আমি আশা করি লেখক আমাকে তাদের ক্লাস / পদ্ধতিগুলির সাথে যে নালীন পরিস্থিতির মুখোমুখি হতে পারে সেই নাল পরিস্থিতিটি এড়াতে বা প্রোগ্রাম করার দক্ষতা দিয়েছেন।
সুতরাং একজন বিকাশকারী হিসাবে আমি কোনও পদ্ধতি থেকে NULL এর বিরুদ্ধে ডিফেন্সিভ প্রোগ্রাম করব। যদি লেখক আমাকে একটি চুক্তি দেয় যা সর্বদা কোনও বস্তু ফেরত দেয় (NULL OBJECT সর্বদা করে) এবং সেই বস্তুর কোনও পদ্ধতি / সম্পত্তি রয়েছে যার দ্বারা অবজেক্টের বৈধতা পরীক্ষা করতে হয়, তবে আমি সেই পদ্ধতিটি / সম্পত্তিটি ব্যবহার করে অবজেক্টটি ব্যবহার চালিয়ে যেতে চাই নাহলে বস্তুটি বৈধ নয় এবং আমি এটি ব্যবহার করতে পারি না।
নীচের লাইনটি হ'ল শ্রেণি / পদ্ধতিগুলির লেখককে অবশ্যই এমন ব্যবস্থাগুলি সরবরাহ করতে হবে যা কোনও বিকাশকারী তাদের ডিফেন্সিভ প্রোগ্রামিংয়ে ব্যবহার করতে পারেন। যে, পদ্ধতির একটি পরিষ্কার উদ্দেশ্য।
অন্য বর্গ / পদ্ধতি থেকে ফিরে আসা সামগ্রীর বৈধতা পরীক্ষা করতে বিকাশকারীকে সর্বদা রক্ষণাত্মক প্রোগ্রামিং ব্যবহার করা উচিত।
শুভেচ্ছা
GregJF
এর অন্যান্য বিকল্পগুলি হ'ল: কিছু মূল্য ফেরৎ যা সাফল্যকে নির্দেশ করে বা না (বা একটি ত্রুটির ধরণ), তবে আপনার যদি কেবল বুলিয়ান মান প্রয়োজন যা সাফল্য / ব্যর্থতা, ব্যর্থতার জন্য নাল ফিরে আসবে এবং সাফল্যের জন্য কোনও পদার্থকে নির্দেশ করবে না কম সঠিক হয়ে উঠুন, তারপরে সত্য / মিথ্যা ফিরে আসা এবং প্যারামিটারের মাধ্যমে অবজেক্টটি পাওয়া getting
অন্যান্য পদ্ধতির ব্যর্থতা নির্দেশ করতে ব্যতিক্রম ব্যবহার করা উচিত, তবে এখানে - আসলে আরও অনেক ভয়েস রয়েছে যা বলে যে এটি একটি বিএডি অনুশীলন (ব্যতিক্রমগুলি ব্যবহার করা সুবিধাজনক হতে পারে তবে এর অনেক অসুবিধাও রয়েছে) has
সুতরাং আমি ব্যক্তিগতভাবে কিছু নষ্ট হয়ে যাওয়ার ইঙ্গিত হিসাবে নাল ফিরে ফেরাতে খারাপ কিছু দেখতে পাচ্ছি না এবং পরে এটি পরীক্ষা করে দেখছি (আসলে আপনি সফল হয়েছেন কিনা তা জানতে)। এছাড়াও, অন্ধভাবে ভাবছেন যে আপনার পদ্ধতিটি নাল ফেরায় না, এবং তারপরে আপনার কোডটি বেস করে, অন্যকে, কখনও কখনও খুঁজে পাওয়া শক্ত, ত্রুটিগুলি হতে পারে (যদিও বেশিরভাগ ক্ষেত্রে এটি কেবল আপনার সিস্টেমে ক্র্যাশ হয়ে যাবে :), যেমন আপনি উল্লেখ করবেন 0x00000000 তাড়াতাড়ি বা পরে)।
জটিল প্রোগ্রামগুলির বিকাশের সময় অজান্তেই নাল ফাংশনগুলি দেখা দিতে পারে এবং ডেড কোডের মতো এ জাতীয় ঘটনাগুলি প্রোগ্রাম কাঠামোর গুরুতর ত্রুটিগুলি নির্দেশ করে।
একটি নাল ফাংশন বা পদ্ধতি প্রায়শই কোনও অবজেক্ট ফ্রেমওয়ার্কে একটি শ্রদ্ধেয় ফাংশন বা ওভাররাইডযোগ্য পদ্ধতির ডিফল্ট আচরণ হিসাবে ব্যবহৃত হয়।
ঠিক আছে, এটি নিশ্চিত যে পদ্ধতিটির উদ্দেশ্য নির্ভর করে ... কখনও কখনও, তার চেয়ে ব্যতিক্রম একটি ভাল পছন্দ হতে পারে। এটি সমস্ত ক্ষেত্রে থেকে কেস নির্ভর করে।
কোডটি যদি এমন কিছু হয়:
command = get_something_to_do()
if command: # if not Null
command.execute()
যদি আপনার একটি ডামি অবজেক্ট থাকে যার এক্সিকিউট () পদ্ধতিটি কিছুই করে না, এবং আপনি উপযুক্ত ক্ষেত্রে নলের পরিবর্তে ফিরে এসেছেন, আপনাকে নুল কেসটি পরীক্ষা করতে হবে না এবং পরিবর্তে কেবল এটি করতে পারবেন:
get_something_to_do().execute()
সুতরাং, এখানে সমস্যাটি একটি ব্যতিক্রম ব্যান্ডের তুলনায় NUL অনুসন্ধানের মধ্যে নয়, পরিবর্তে কলারটির মধ্যে বিশেষ নন-কেসগুলি আলাদাভাবে পরিচালনা করতে হবে (যেভাবেই হোক না কেন) is
আমার ব্যবহারের ক্ষেত্রে আমাকে পদ্ধতি থেকে একটি মানচিত্র ফিরিয়ে নেওয়া এবং তারপর একটি নির্দিষ্ট কীটি সন্ধান করা দরকার। তবে আমি যদি খালি মানচিত্রটি ফিরিয়ে দিই, তবে এটি নুলপয়েন্টার এক্সসেপশনকে নিয়ে যাবে এবং তারপরে এটি খালি মানচিত্রের পরিবর্তে নালাগুলির চেয়ে ভিন্ন ভিন্ন হবে। কিন্তু Java8 থেকে অনওয়ার্ড আমরা ব্যবহার করতে পারে ঐচ্ছিক । উপরের কারণেই ptionচ্ছিক ধারণাটি চালু হয়েছিল।
গ দিন,
যখন আপনি একটি নতুন অবজেক্ট তৈরি করতে অক্ষম হন তখন NULL ফিরিয়ে দেওয়া অনেকগুলি API এর জন্য স্ট্যান্ডার্ড অনুশীলন।
কেন এটা খারাপ ডিজাইন আমার কোনও ধারণা নেই।
সম্পাদনা: এটি সেই ভাষার ক্ষেত্রে সত্য যেখানে আপনার ব্যতিক্রম নেই যেমন সি যেখানে এটি বহু বছর ধরে সম্মেলন হয়ে আসছে।
আছে HTH
'Avahappy,