যখন কোনও মান অর্থপূর্ণভাবে অনুপস্থিত থাকতে পারে তখন কোনও নতুন বুলিয়ান ক্ষেত্রটি কি নাল রেফারেন্সের চেয়ে ভাল?


39

উদাহরণস্বরূপ, ধরুন আমার একটি ক্লাস রয়েছে Member, যার একটি সর্বশেষ চেঞ্জপ্যাসওয়ার্ডটাইম রয়েছে:

class Member{
  .
  .
  .
  constructor(){
    this.lastChangePasswordTime=null,
  }
}

যার সর্বশেষ চেঞ্জপ্যাসওয়ার্ডটাইম অর্থহীন অনুপস্থিত হতে পারে, কারণ কিছু সদস্য কখনও তাদের পাসওয়ার্ড পরিবর্তন করতে পারেন না।

তবে মতে যদি নালগুলি দুষ্কর হয় তবে কোনও মান যখন অর্থপূর্ণভাবে অনুপস্থিত হতে পারে তখন কী ব্যবহার করা উচিত? এবং https: //softwareen હવે। তাই আমি একটি বুলিয়ান পতাকা যুক্ত করার চেষ্টা করি:

class Member{
  .
  .
  .
  constructor(){
    this.isPasswordChanged=false,
    this.lastChangePasswordTime=null,
  }
}

তবে আমি মনে করি এটি বেশ অপ্রচলিত কারণ:

  1. যখন পাসওয়ার্ডচেন্জডটি মিথ্যা হয়, লাস্ট চেঞ্জপ্যাসওয়ার্ডটাইমটি অবশ্যই নাল হতে হবে এবং শেষচ্যাঞ্জপ্যাসওয়ার্ডটাইম == নাল পরীক্ষা করা প্রায় পাসওয়ার্ডচেনডে চেক করা মিথ্যা, তাই আমি সর্বশেষে চেক পরীক্ষা করতে পছন্দ করি পাসওয়ার্ড পাসওয়ার্ডটাইম == নাল সরাসরি

  2. এখানে যুক্তি পরিবর্তন করার সময়, আমি উভয় ক্ষেত্র আপডেট করতে ভুলে যেতে পারি ।

দ্রষ্টব্য: যখন কোনও ব্যবহারকারী পাসওয়ার্ড পরিবর্তন করে, আমি সময়টি এইভাবে রেকর্ড করব:

this.lastChangePasswordTime=Date.now();

অতিরিক্ত বুলিয়ান ক্ষেত্রটি কি এখানে নাল রেফারেন্সের চেয়ে ভাল?


51
এই প্রশ্নটি বেশ ভাষা-নির্দিষ্ট, কারণ একটি ভাল সমাধান গঠন করে যা আপনার প্রোগ্রামিং ভাষা কী প্রস্তাব দেয় তার উপর নির্ভর করে। উদাহরণস্বরূপ, সি ++ 17 বা স্কালায় আপনি ব্যবহার করতে std::optionalবা ব্যবহার করতে পারেন Option। অন্যান্য ভাষায়, আপনাকে নিজে একটি উপযুক্ত ব্যবস্থা তৈরি করতে হতে পারে, বা আপনি আসলে অবলম্বন করতে পারেন nullবা অনুরূপ কিছু হ'ল কারণ এটি আরও বুদ্ধিমান।
খ্রিস্টান হ্যাকেল

16
পাসওয়ার্ড তৈরির সময়টিতে সর্বশেষ চেঞ্জপ্যাসওয়ার্ডটাইম সেট করতে চান না এমন কোনও কারণ রয়েছে (সর্বোপরি সৃষ্টিটি একটি মোড)?
ক্রিশ্চিয়ান এইচ

@ ক্রিশ্চিয়ানহ্যাক হুম, সম্মত হন যে এখানে বিভিন্ন "নিখুঁত" সমাধান রয়েছে, তবে আমি কোনও (প্রধান) ভাষা দেখছি না যেখানে নল / নীল চেক করার চেয়ে আলাদাভাবে বুলিয়ান ব্যবহার করা সাধারণভাবে ভাল ধারণা হতে পারে। সি / সি ++ সম্পর্কে পুরোপুরি নিশ্চিত নন কারণ যদিও আমি বেশ কিছুদিন ধরে সেখানে সক্রিয় ছিলাম না।
ফ্র্যাঙ্ক হপকিন্স

@ ফ্র্যাঙ্কহপকিন্স: উদাহরণগুলির মধ্যে এমন ভাষা হবে যেখানে ভেরিয়েবলগুলি অবিচ্ছিন্নভাবে ছেড়ে দেওয়া যেতে পারে, যেমন সি বা সি ++। lastChangePasswordTimeসেখানে একটি অবিচ্ছিন্ন পয়েন্টার হতে পারে এবং এটিকে যে কোনও কিছুর সাথে তুলনা করা হবে সংজ্ঞায়িত আচরণ। পয়েন্টারটির পরিবর্তে NULL/ nullptrপরিবর্তে সূচনা না করা সত্যিই বাধ্যতামূলক কারণ নয় , বিশেষত আধুনিক সি ++ তে নয় (যেখানে আপনি কোনও পয়েন্টার ব্যবহার করবেন না) তবে কে জানে? আর একটি উদাহরণ পয়েন্টারবিহীন ভাষা বা পয়েন্টারগুলির পক্ষে খারাপ সমর্থন সহ হতে পারে maybe (ফরটারান 77 মাথায় আসে ...)
ক্রিশ্চিয়ান হ্যাকেল

আমি এর জন্য 3 কেস সহ একটি এনাম ব্যবহার করব :)
জে ডঃ

উত্তর:


72

nullআপনি যদি ইচ্ছাকৃতভাবে এবং যত্নবান হন তবে কেন আপনার যদি অর্থবহ অনুপস্থিত মান থাকে তা ব্যবহার করা উচিত না see

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

class Member {
    DateTime lastChangePasswordTime = null;
    bool isPasswordChanged() { return lastChangePasswordTime != null; }

}

আমার মতে, এটি এইভাবে করা:

  • নাল-চেকের চেয়ে আরও ভাল কোড পঠনযোগ্যতা দেয় যা প্রসঙ্গটি হারাতে পারে।
  • আপনি isPasswordChangedযে মানটি উল্লেখ করেছেন তা বজায় রাখার বিষয়ে আপনাকে আসলে চিন্তা করার প্রয়োজনটি সরিয়ে দেয় ।

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


29
খোলার জন্য +1। নাল ব্যবহারের অযোগ্য ব্যবহার সাধারণত কেবল সেই ক্ষেত্রেই অস্বীকার করা হয় যেখানে নালটি একটি অপ্রত্যাশিত পরিণতি হয়, অর্থাত্ যেখানে এটি কোনও অর্থ দেয় না (গ্রাহকের কাছে)। যদি নাল অর্থবহ হয়, তবে এটি কোনও অপ্রত্যাশিত ফলাফল নয়।
তোলা

28
আমি এটিকে আরও শক্তিশালী করে তুলব কারণ একই সাথে দু'টি ভেরিয়েবল একইরকম বজায় থাকে না। এটা ব্যর্থ হবে। নাল মানটি আড়াল করে, নাল মান ধরে নেওয়া বাহ্যিকভাবে উদাহরণের মধ্যে বোঝায় যে খুব ভাল জিনিস। এই ক্ষেত্রে যেখানে আপনি পরে সিদ্ধান্ত নিতে পারেন যে 1970-01-01 বোঝায় যে পাসওয়ার্ড কখনও পরিবর্তন করা হয়নি। তারপরে বাকি প্রোগ্রামটির লজিক যত্ন নেওয়ার দরকার নেই।
বেন্ট করুন

3
আপনি যেমন কল isPasswordChangedকরতে ভুলে যেতে পারেন ঠিক তেমন কল করতেও ভুলে যেতে পারতেন যে এটি নাল কিনা। আমি এখানে কিছুই অর্জন দেখছি না।
গেরম্যান

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

2
@ ফ্র্যাঙ্কহপকিন্স: ভাল কথা, তবে যদি একযোগে ব্যবহার করা হয়, এমনকি একটি একক ভেরিয়েবলের পরিদর্শন লকিংয়ের প্রয়োজন হতে পারে।
খ্রিস্টান হ্যাকেল

63

nullsমন্দ নয়। চিন্তা না করে এগুলো ব্যবহার করা হচ্ছে। এটি এমন একটি ক্ষেত্রে যেখানে nullঠিক সঠিক উত্তর - কোনও তারিখ নেই।

মনে রাখবেন যে আপনার সমাধান আরও সমস্যা তৈরি করে। তারিখটি কোনও কিছুর উপর সেট করা মানে কী তবে isPasswordChangedতা মিথ্যা? আপনি সবেমাত্র দ্বন্দ্বমূলক একটি তথ্য তৈরি করেছেন যা আপনার বিশেষভাবে ধরা এবং চিকিত্সা করা উচিত, যখন একটি nullমানটির একটি স্পষ্টভাবে সংজ্ঞায়িত, দ্ব্যর্থহীন অর্থ থাকে এবং এটি অন্যান্য তথ্যের সাথে বিরোধী হতে পারে না।

সুতরাং না, আপনার সমাধান এর চেয়ে ভাল নয়। একটি nullমান জন্য অনুমতি এখানে সঠিক পদ্ধতির হয়। যে nullসমস্ত লোকেরা দাবী করেন যে সর্বদা মন্দ, প্রসঙ্গটি কেন তা nullবিদ্যমান তা বুঝতে পারে না exists


17
nullExistsতিহাসিকভাবে , উপস্থিত রয়েছে কারণ টনি হোয়ের 1965 সালে বিলিয়ন ডলার ভুল করেছিলেন। যে লোকেরা null"দুষ্ট" বলে দাবী করে তারা অবশ্যই বিষয়টিকে অতি-সরল করে দিচ্ছে, তবে এটি খুব ভাল বিষয় যে আধুনিক ভাষা বা প্রোগ্রামিং শৈলীগুলি nullপ্রতিস্থাপন করে সরিয়ে চলেছে এটি ডেডিকেটেড বিকল্প ধরণের সহ।
খ্রিস্টান হ্যাকেল

9
@ ক্রিশ্চিয়ানহ্যাকল: historicalতিহাসিক আগ্রহের বাইরে - মরে হোয়ার কি কখনও বলেছিলেন যে এর চেয়ে ভাল ব্যবহারিক বিকল্পটি কী হত (সম্পূর্ণ নতুন দৃষ্টান্ত না বদলে)?
এএনওই

5
@ কোন: আকর্ষণীয় প্রশ্ন। হোয়ারের তাতে কী বলার ছিল তা সম্পর্কে জানেন না, তবে নালামুক্ত প্রোগ্রামিং এই দিনগুলিতে প্রায়শই আধুনিক, সু-নকশাকৃত প্রোগ্রামিং ভাষায় বাস্তবতা।
খ্রিস্টান হ্যাকেল

10
@ টম ওয়াট? সি # এবং জাভার মতো ভাষায়, DateTimeক্ষেত্রটি একটি পয়েন্টার। nullশুধুমাত্র পুরো ধারণাটি পয়েন্টারগুলির জন্য অর্থবোধ করে!
টড সেলাই

16
@ টম: নাল পয়েন্টারগুলি কেবলমাত্র ভাষা এবং প্রয়োগের ক্ষেত্রেই বিপজ্জনক যা তাদের অন্ধভাবে তালিকাবদ্ধ করা যায় এবং। যে ভাষায় কোনও নাল পয়েন্টারকে সূচক বা অবজ্ঞার চেষ্টা করে, এটি কোনও ডামি অবজেক্টের পয়েন্টারের চেয়ে প্রায়শই কম বিপজ্জনক হবে। অনেকগুলি পরিস্থিতি রয়েছে যেখানে কোনও প্রোগ্রাম অস্বাভাবিকভাবে শেষ হওয়া অর্থহীন সংখ্যা তৈরি করা ভাল এবং এটি যে সিস্টেমে তাদের ফাঁদে ফেলে, তার জন্য নাল পয়েন্টার হ'ল সঠিক রেসিপি।
সুপারক্যাট

29

আপনার প্রোগ্রামিং ভাষার উপর নির্ভর করে ভাল বিকল্প থাকতে পারে যেমন একটি optionalডেটা টাইপ। সি ++ (17) এ এটি স্ট্যান্ড :: বৈকল্পিক হবে । এটি হয় অনুপস্থিত থাকতে পারে বা অন্তর্নিহিত ডেটা ধরণের একটি নির্বিচার মান থাকতে পারে।


8
Optionalজাভাতেও আছে ; আপনার কাছে নালু Optionalহওয়া মানে ...
ম্যাথিউ এম।

1
Cameচ্ছিকের সাথে সংযোগ করতেও এখানে এসেছিলেন। আমি এগুলিকে এমন একটি ভাষার ধরণ হিসাবে এনকোড করব।
জিপ

2
@ ফ্র্যাঙ্কহপকিন্স এটি লজ্জার বিষয় যে জাভাতে কোনও কিছুই আপনাকে লেখাগুলি রোধ করে Optional<Date> lastPasswordChangeTime = null;না, তবে আমি কেবল এই কারণে হাল ছাড়ব না। পরিবর্তে, আমি একটি খুব দৃly়ভাবে অনুষ্ঠিত দলীয় নিয়ম স্থাপন করব, যে কোনও alচ্ছিক মান কখনই নির্ধারিত হয় না null। Onচ্ছিক আপনি সহজেই এটি ছেড়ে দিতে অনেকগুলি সুন্দর বৈশিষ্ট্য কিনে। আপনি সহজেই ডিফল্ট মানগুলি ( orElseবা অলস মূল্যায়ন সহ orElseGet) নির্ধারণ করতে পারেন , ত্রুটি নিক্ষেপ করতে পারেন ( orElseThrow), নাল নিরাপদ উপায়ে ( map, flatmap) ইত্যাদি রূপান্তর করতে পারেন
আলেকজান্ডার

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

5
@ ফ্র্যাঙ্কহপকিন্স: এটি হতে পারে যে জাভা সম্প্রদায়ের কেবল সামান্য প্যারাডিজম শিফট দরকার, যা এখনও অনেক বছর সময় নিতে পারে। আপনি Scala তাকান, উদাহরণস্বরূপ, এটি সমর্থন nullকারণ ভাষা জাভা 100% সামঞ্জস্যপূর্ণ, কিন্তু কেউ এটা ব্যবহার করে এবং Option[T]জায়গায় বেশি সব, মত চমৎকার কার্মিক-প্রোগ্রামিং সমর্থনে map, flatMap, প্যাটার্ন ম্যাচিং ইত্যাদি, যা যায় অনেক দূরে, অনেক দূরে বহুদূরে == nullচেক। আপনি ঠিক বলেছেন যে তত্ত্ব অনুসারে, কোনও বিকল্প ধরণের গৌরবময় পয়েন্টারের চেয়ে কিছু বেশি মনে হয়, কিন্তু বাস্তবতা সেই যুক্তিটিকে ভুল প্রমাণ করে।
খ্রিস্টান হ্যাকেল

11

সঠিকভাবে নাল ব্যবহার করা

ব্যবহারের বিভিন্ন উপায় রয়েছে null। সবচেয়ে সাধারণ এবং শব্দার্থগতভাবে সঠিক উপায় হ'ল এটি যখন আপনি একক মান বা নাও রাখতে পারেন তখন তা ব্যবহার করা । এই ক্ষেত্রে একটি মান হয় সমান nullবা ডাটাবেস বা কিছু থেকে রেকর্ড মত অর্থবহ কিছু।

এই পরিস্থিতিতে আপনি তখন বেশিরভাগ ক্ষেত্রে এটি ব্যবহার করেন (সিউডো কোডে):

if (value is null) {
  doSomethingAboutIt();
  return;
}

doSomethingUseful(value);

সমস্যা

এবং এটি একটি খুব বড় সমস্যা আছে। সমস্যাটি হ'ল সময়টি অনুসারে আপনি doSomethingUsefulমানটির জন্য পরীক্ষা করা হয়নি null! যদি এটি না হয় তবে প্রোগ্রামটি সম্ভবত ক্রাশ হবে। এবং ব্যবহারকারী এমনকি "ভয়াবহ ত্রুটি: মূল্য চেয়েছিল তবে নাল!" এর মতো কিছু রেখে কোনও ভাল ত্রুটির বার্তাও দেখতে পাবে না! (আপডেটের পরে: যদিও এর চেয়েও কম তথ্যযুক্ত ত্রুটি হতে পারে Segmentation fault. Core dumped.বা আরও খারাপ এখনও হতে পারে , কিছু ক্ষেত্রে নাল সম্পর্কে কোনও ত্রুটি এবং ভুল কারসাজি নেই)

চেকগুলি লিখতে ভুলে যাওয়া nullএবং nullপরিস্থিতি পরিচালনা করা একটি অত্যন্ত সাধারণ বাগ । এই কারণেই টনি হোয়ার null2009 সালে কিউকন লন্ডন নামে একটি সফ্টওয়্যার সম্মেলনে বলেছিলেন যে তিনি 1965 সালে বিলিয়ন ডলারের ভুল করেছিলেন: https://www.infoq.com/preferencesations/ নাল- রেফারেন্স- The- বিলিয়ন- ডোলার- ভুল-টনি-হোয়ারে

সমস্যা এড়ানো

কিছু প্রযুক্তি এবং ভাষাগুলি nullবিভিন্ন উপায়ে ভুলে যাওয়া অসম্ভবকে পরীক্ষা করে তোলে এবং বাগের পরিমাণ হ্রাস করে।

উদাহরণস্বরূপ, হাস্কেলের Maybeনাল পরিবর্তে মোনাড রয়েছে । ধরুন এটি DatabaseRecordকোনও ব্যবহারকারী-সংজ্ঞায়িত প্রকার। হাসকেলে টাইপের মান Maybe DatabaseRecordসমান Just <somevalue>বা এটি সমান হতে পারে Nothing। এরপরে আপনি এটি বিভিন্ন উপায়ে ব্যবহার করতে পারেন তবে আপনি এটি কীভাবে ব্যবহার করেন তা বিবেচনা না Nothingকরেই আপনি কিছু অপারেশন প্রয়োগ করতে পারবেন না ।

উদাহরণস্বরূপ এই ফাংশনটির জন্য এবং এর জন্য zeroAsDefaultরিটার্ন বলা হয় :xJust x0Nothing

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


5
আসলে, horrible error: wanted value but got null!আরও Segmentation fault. Core dumped.
সাধারণের

2
@ টবিস্পাইট ট্রু, তবে আমি এমন কিছু পছন্দ করতে চাই যা ব্যবহারকারীর শর্তাবলীতে পছন্দ করে Error: the product you want to buy is out of stock
ঘেরম্যান

অবশ্যই - আমি কেবল পর্যবেক্ষণ করছিলাম যে এটি আরও খারাপ হতে পারে (এবং প্রায়শই হয়) । এর চেয়ে ভাল কি হবে তা নিয়ে আমি পুরোপুরি একমত! এবং আপনার উত্তরটি অনেকটা আমি এই প্রশ্নটিতে কি বলতাম: +1।
টবির স্পিড

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

1
@ এরিকডুমিনিল আমরা কোনও ভুল হওয়ার সম্ভাবনা অপসারণ করতে (বা হ্রাস করতে) চাই, nullনিজেকে পুরোপুরি সরাতে পারি না , এমনকি পটভূমি থেকেও।
ঘেরম্যান

4

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


এটি একটি দুর্দান্ত পয়েন্ট। বিকল্প ধরণের ক্ষেত্রে প্রায়শই একই ঘটনা ঘটে; কোনও বিকল্পকে সিকোয়েন্সের বিশেষ কেস হিসাবে দেখা যায়।
খ্রিস্টান হ্যাকেল

2

নিজেকে এটিকে জিজ্ঞাসা করুন: কোন আচরণের জন্য সর্বশেষ ক্ষেত্রের ক্ষেত্রপ্যাসওয়ার্ডটাইম প্রয়োজন?

আপনার যদি এই পদ্ধতিটি ইস্প্যাসওয়ার্ডএক্সপায়ার্ড () এর জন্য প্রয়োজন হয় তবে যদি কোনও সদস্যকে তাদের পাসওয়ার্ডটি প্রায়শই ঘন ঘন পরিবর্তন করার অনুরোধ জানানো উচিত তবে আমি সদস্যটিকে প্রাথমিকভাবে তৈরি হওয়ার সময়টিতে ক্ষেত্রটি সেট করব। নতুন ও বিদ্যমান সদস্যদের জন্য ইসপ্যাসওয়ার্ড এক্সপায়ার্ড () বাস্তবায়ন একই।

class Member{
   private DateTime lastChangePasswordTime;

   public Member(DateTime lastChangePasswordTime) {
      // set value, maybe check for null
   }

   public bool IsPasswordExpired() {
      DateTime limit = DateTime.Now.AddMonths(-3);
      return lastChangePasswordTime < limit;
   }
}

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

class Member{
   private DateTime lastChangePasswordTime;
   private bool passwordShouldBeChanged;

   public Member(DateTime lastChangePasswordTime, bool passwordShouldBeChanged) {
      // set values, maybe check for nulls
   }

   public bool ShouldChangePassword() {
      return PasswordExpired(lastChangePasswordTime) || passwordShouldBeChanged;
   }

   private static bool PasswordExpired(DateTime lastChangePasswordTime) {
      DateTime limit = DateTime.Now.AddMonths(-3);
      return lastChangePasswordTime < limit;
   }
}

আপনার উদ্দেশ্যগুলি কোডে সুস্পষ্ট করুন।


2

প্রথমত, নালস দুষ্ট হওয়ার বিষয়টি হ'ল কৌতূহল এবং ডগমা সহ যথারীতি এটি গাইডলাইন হিসাবে সবচেয়ে ভাল কাজ করে, পাস / পাসের পরীক্ষার মতো নয়।

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

মনে রাখবেন যে এটি যখন সামান্য ব্যয়ে আসে তখন আপনি এখনই গণনা করতে পারেন যে পাসওয়ার্ডটি শেষ সেট হওয়ার পরে কতক্ষণ হয়েছে।


1

উভয়ই 'নিরাপদ / জ্ঞান / সঠিক' হ'ল যদি কলার ব্যবহারের আগে চেক করে। কলার চেক না করলে সমস্যাটি ঘটে। কোনটি ভাল, নাল ত্রুটির কিছু গন্ধ বা একটি অবৈধ মান ব্যবহার করে?

কোন একক সঠিক উত্তর নেই। এটি আপনি যে সম্পর্কে উদ্বিগ্ন তার উপর নির্ভর করে।

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

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

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