সঠিকভাবে নাল ব্যবহার করা
ব্যবহারের বিভিন্ন উপায় রয়েছে null
। সবচেয়ে সাধারণ এবং শব্দার্থগতভাবে সঠিক উপায় হ'ল এটি যখন আপনি একক মান বা নাও রাখতে পারেন তখন তা ব্যবহার করা । এই ক্ষেত্রে একটি মান হয় সমান null
বা ডাটাবেস বা কিছু থেকে রেকর্ড মত অর্থবহ কিছু।
এই পরিস্থিতিতে আপনি তখন বেশিরভাগ ক্ষেত্রে এটি ব্যবহার করেন (সিউডো কোডে):
if (value is null) {
doSomethingAboutIt();
return;
}
doSomethingUseful(value);
সমস্যা
এবং এটি একটি খুব বড় সমস্যা আছে। সমস্যাটি হ'ল সময়টি অনুসারে আপনি doSomethingUseful
মানটির জন্য পরীক্ষা করা হয়নি null
! যদি এটি না হয় তবে প্রোগ্রামটি সম্ভবত ক্রাশ হবে। এবং ব্যবহারকারী এমনকি "ভয়াবহ ত্রুটি: মূল্য চেয়েছিল তবে নাল!" এর মতো কিছু রেখে কোনও ভাল ত্রুটির বার্তাও দেখতে পাবে না! (আপডেটের পরে: যদিও এর চেয়েও কম তথ্যযুক্ত ত্রুটি হতে পারে Segmentation fault. Core dumped.
বা আরও খারাপ এখনও হতে পারে , কিছু ক্ষেত্রে নাল সম্পর্কে কোনও ত্রুটি এবং ভুল কারসাজি নেই)
চেকগুলি লিখতে ভুলে যাওয়া null
এবং null
পরিস্থিতি পরিচালনা করা একটি অত্যন্ত সাধারণ বাগ । এই কারণেই টনি হোয়ার null
2009 সালে কিউকন লন্ডন নামে একটি সফ্টওয়্যার সম্মেলনে বলেছিলেন যে তিনি 1965 সালে বিলিয়ন ডলারের ভুল করেছিলেন: https://www.infoq.com/preferencesations/ নাল- রেফারেন্স- The- বিলিয়ন- ডোলার-
ভুল-টনি-হোয়ারে
সমস্যা এড়ানো
কিছু প্রযুক্তি এবং ভাষাগুলি null
বিভিন্ন উপায়ে ভুলে যাওয়া অসম্ভবকে পরীক্ষা করে তোলে এবং বাগের পরিমাণ হ্রাস করে।
উদাহরণস্বরূপ, হাস্কেলের Maybe
নাল পরিবর্তে মোনাড রয়েছে । ধরুন এটি DatabaseRecord
কোনও ব্যবহারকারী-সংজ্ঞায়িত প্রকার। হাসকেলে টাইপের মান Maybe DatabaseRecord
সমান Just <somevalue>
বা এটি সমান হতে পারে Nothing
। এরপরে আপনি এটি বিভিন্ন উপায়ে ব্যবহার করতে পারেন তবে আপনি এটি কীভাবে ব্যবহার করেন তা বিবেচনা না Nothing
করেই আপনি কিছু অপারেশন প্রয়োগ করতে পারবেন না ।
উদাহরণস্বরূপ এই ফাংশনটির জন্য এবং এর জন্য zeroAsDefault
রিটার্ন বলা হয় :x
Just x
0
Nothing
zeroAsDefault :: Maybe Int -> Int
zeroAsDefault mx = case mx of
Nothing -> 0
Just x -> x
খ্রিস্টান হ্যাকেল বলেছেন সি ++ 17 এবং স্কালার নিজস্ব উপায় রয়েছে have সুতরাং আপনি আপনার ভাষাতে এর মতো কিছু আছে কিনা এবং তা ব্যবহার করার চেষ্টা করতে চাইতে পারেন।
নালগুলি এখনও ব্যাপক ব্যবহারে রয়েছে
আপনার যদি আরও ভাল কিছু না থাকে তবে ব্যবহার null
করা ভাল। কেবল এটির জন্য নজর রাখুন। ফাংশনগুলিতে প্রকারের ঘোষণাগুলি আপনাকে কিছুটা হলেও সহায়তা করবে।
এটি খুব প্রগতিশীল নাও লাগতে পারে তবে আপনার সহকর্মীরা null
বা অন্য কিছু ব্যবহার করতে চান কিনা তা আপনার পরীক্ষা করা উচিত । তারা রক্ষণশীল হতে পারে এবং কিছু কারণে নতুন ডেটা স্ট্রাকচার ব্যবহার করতে নাও পারে। উদাহরণস্বরূপ কোনও ভাষার পুরানো সংস্করণকে সমর্থন করা। এই জাতীয় বিষয়গুলির প্রকল্পের কোডিং মানগুলিতে ঘোষণা করা উচিত এবং দলের সাথে সঠিকভাবে আলোচনা করা উচিত।
আপনার প্রস্তাবের উপর
আপনি একটি পৃথক বুলিয়ান ক্ষেত্র ব্যবহার করার পরামর্শ দিচ্ছেন। তবে আপনাকে যে কোনও উপায়ে এটি পরীক্ষা করতে হবে এবং এখনও এটি পরীক্ষা করতে ভুলে যেতে পারে। সুতরাং এখানে কিছুই জিততে পারে না। যদি আপনি এমনকি অন্য কিছু ভুলে যেতে পারেন, যেমন প্রতিবার উভয় মান আপডেট করা, তবে এটি আরও খারাপ। যদি চেক করতে ভুলে সমস্যাটি null
সমাধান না হয় তবে কোনও লাভ নেই। এড়ানো এড়ানো null
কঠিন এবং আপনার এটি এমনভাবে করা উচিত নয় যা এটি আরও খারাপ করে।
কিভাবে নাল ব্যবহার করবেন না
অবশেষে null
ভুল পদ্ধতিতে ব্যবহারের সাধারণ উপায় রয়েছে । এর একটি উপায় হ'ল অ্যারে এবং স্ট্রিংয়ের মতো খালি ডেটা স্ট্রাকচারের জায়গায় এটি ব্যবহার করা। খালি অ্যারে হ'ল অন্যের মতো যথাযথ অ্যারে! এটি প্রায় সর্বদা ডেটা স্ট্রাকচারের জন্য গুরুত্বপূর্ণ এবং দরকারী, যা একাধিক মানের ফিট করতে পারে, খালি থাকতে সক্ষম হতে পারে, যার দৈর্ঘ্য 0 আছে।
বীজগণিতের দৃষ্টিকোণ থেকে স্ট্রিংগুলির জন্য খালি স্ট্রিং সংখ্যার জন্য 0 এর মতো, যেমন পরিচয়:
a+0=a
concat(str, '')=str
খালি স্ট্রিং সাধারণভাবে স্ট্রিংগুলিকে মনোয়েডে পরিণত করতে সক্ষম করে:
https://en.wikedia.org/wiki/Monoid
আপনি যদি এটি না পান তবে এটি আপনার পক্ষে তেমন গুরুত্বপূর্ণ নয়।
এখন আসুন দেখুন এই উদাহরণ সহ প্রোগ্রামিংয়ের জন্য এটি গুরুত্বপূর্ণ কেন:
for (element in array) {
doSomething(element);
}
আমরা যদি এখানে একটি খালি অ্যারে পাস করি তবে কোডটি ঠিকঠাক কাজ করবে। এটা ঠিক কিছুই করবে না। তবে আমরা যদি null
এখানে একটি পাস করি তবে আমরা সম্ভবত "নাল দিয়ে লুপ করতে পারি না, দুঃখিত" এর মতো একটি ত্রুটিযুক্ত ক্র্যাশ পেয়ে যাব। আমরা এটিকে গুটিয়ে রাখতে পারি if
তবে এটি কম পরিষ্কার এবং আবার, আপনি এটি পরীক্ষা করতে ভুলে যেতে পারেন
কিভাবে নাল পরিচালনা করবেন
কী করা doSomethingAboutIt()
উচিত এবং বিশেষত এটির ব্যতিক্রম হওয়া উচিত কিনা তা অন্য জটিল সমস্যা। সংক্ষেপে এটি null
কোনও প্রদত্ত কার্যের জন্য একটি গ্রহণযোগ্য ইনপুট মান ছিল এবং প্রতিক্রিয়াতে কী প্রত্যাশিত তা নির্ভর করে । ব্যতিক্রমগুলি এমন ইভেন্টগুলির জন্য যা প্রত্যাশিত ছিল না। আমি আর এই বিষয়ে যেতে হবে না। এই উত্তরটি ইতিমধ্যে দীর্ঘ is
std::optional
বা ব্যবহার করতে পারেনOption
। অন্যান্য ভাষায়, আপনাকে নিজে একটি উপযুক্ত ব্যবস্থা তৈরি করতে হতে পারে, বা আপনি আসলে অবলম্বন করতে পারেনnull
বা অনুরূপ কিছু হ'ল কারণ এটি আরও বুদ্ধিমান।