নাল ছাড়াই ভাষার জন্য সর্বোত্তম ব্যাখ্যা


225

প্রায়শই প্রায়শই যখন প্রোগ্রামাররা নাল ত্রুটি / ব্যতিক্রম সম্পর্কে অভিযোগ করে তখন কেউ জিজ্ঞাসা করে যে আমরা শূন্য ছাড়াই কী করি।

বিকল্প ধরণের শীতলতা সম্পর্কে আমার কিছু প্রাথমিক ধারণা আছে তবে এটিকে সর্বোত্তমভাবে প্রকাশ করার মতো জ্ঞান বা ভাষা দক্ষতা আমার নেই। গড় প্রোগ্রামারের কাছে পৌঁছানোর পথে এমনভাবে লিখিত একটি মহান ব্যাখ্যা কী যা আমরা সেই ব্যক্তির দিকে নির্দেশ করতে পারি?

  • রেফারেন্স / পয়েন্টার থাকার অনাকাঙ্ক্ষিতা ডিফল্টরূপে নমনীয়
  • নাল কেস যেমন চেক করা সহজ করতে কৌশলগুলি সহ বিকল্পের ধরণগুলি কীভাবে কাজ করে
    • প্যাটার্ন ম্যাচিং এবং
    • monadic বোধগম্যতা
  • বিকল্প সমাধান যেমন বার্তা খাওয়ার শূন্যতার মতো
  • (অন্যান্য বিষয়গুলি আমি মিস করেছি)

11
আপনি যদি এই প্রশ্নে ফাংশনাল-প্রোগ্রামিং বা এফ # এর জন্য ট্যাগ যুক্ত করেন তবে আপনি কিছু চমত্কার উত্তর পেতে বাধ্য।
স্টিফেন সোয়েনসেন

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

4
আমি সন্দেহ করি যে এই জাতীয় নির্দিষ্ট ট্যাগগুলির জন্য খুব কম প্রয়োজন। ট্যাগগুলি মূলত লোকেদের প্রাসঙ্গিক প্রশ্নগুলি সন্ধানের জন্য অনুমতি দেয় (উদাহরণস্বরূপ, "আমি যে প্রশ্নগুলি সম্পর্কে অনেক কিছু জানি এবং উত্তর দিতে সক্ষম হব", এবং "ফাংশনাল-প্রোগ্রামিং" সেখানে খুব সহায়ক But তবে "নাল" বা "এর মতো কিছু" ); বিকল্প-টাইপ "অনেক কম উপযোগী কমই লোক একটি নিরীক্ষণ করার সম্ভাবনা বেশি।" বিকল্পটি-টাইপ "ট্যাগ প্রশ্ন তারা উত্তর দিতে পারেন খুঁজছেন।
jalf

আসুন ভুলে যাবেন না যে নালার মূল কারণগুলির মধ্যে একটি হ'ল কম্পিউটারগুলি তত্ত্বের সাথে দৃ tied়ভাবে বাঁধা বিবর্তিত হয়েছিল। নাল হ'ল সেট থিউরির সব থেকে একটি গুরুত্বপূর্ণ সেট। এটি ছাড়া পুরো অ্যালগরিদমগুলি ভেঙে যায়। উদাহরণস্বরূপ- একত্রিতকরণ বাছাই করুন। এর মধ্যে অর্ধেকবার একটি তালিকা ভাঙ্গা জড়িত। তালিকাটি যদি দীর্ঘ 7 টি আইটেম দীর্ঘ হয়? প্রথমে আপনি এটি 4 এবং 3 এ বিভক্ত করুন তারপরে 2, 2, 2, এবং 1। তারপরে 1, 1, 1, 1, 1, 1, 1 এবং .... নাল! নলের একটি উদ্দেশ্য রয়েছে, কেবলমাত্র একটি যা আপনি ব্যবহারিকভাবে দেখতে পাচ্ছেন না। এটি তাত্ত্বিক ক্ষেত্রের জন্য আরও বিদ্যমান।
স্টিভেন্ডেসু

6
@ স্টেভেন_ডেসু - আমি একমত নই 'অযোগ্য' ভাষাগুলিতে আপনার খালি তালিকার একটি রেফারেন্স [] থাকতে পারে এবং নাল তালিকার রেফারেন্সও থাকতে পারে। এই প্রশ্নটি উভয়ের মধ্যে বিভ্রান্তির সাথে সম্পর্কিত।
stusmith

উত্তর:


433

আমি মনে করি কেন নাল অনাকাঙ্ক্ষিত তার সংক্ষিপ্তসারটি হ'ল অর্থহীন রাজ্যগুলি উপস্থাপনযোগ্য হওয়া উচিত নয়

মনে করুন আমি একটি দরজা মডেলিং করছি। এটি তিনটি অবস্থার মধ্যে একটিতে থাকতে পারে: খোলা, শাট তবে আনলক করা, এবং বন্ধ এবং লক করা। এখন আমি এর লাইন বরাবর এটি মডেল করতে পারে

class Door
    private bool isShut
    private bool isLocked

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

type DoorState =
    | Open | ShutAndUnlocked | ShutAndLocked

তাহলে আমি সংজ্ঞা দিতে পারি

class Door
    private DoorState state

আর কোনও উদ্বেগ নেই। টাইপ সিস্টেমটি নিশ্চিত করবে যে কেবলমাত্র তিনটি সম্ভাব্য রাজ্য রয়েছে class Doorযাবার জন্য রয়েছে This এটি টাইপ সিস্টেমগুলিতে ভাল - সংকলন-সময়ে সম্পূর্ণ শ্রেণীর ত্রুটিগুলি স্পষ্টভাবে রায় দেয়।

সমস্যাটি nullহ'ল প্রতিটি রেফারেন্স ধরণটি তার স্পেসে এই অতিরিক্ত অবস্থাটি পায় যা সাধারণত অনাকাঙ্ক্ষিত। একটি stringচলক অক্ষরগুলির যে কোনও ক্রম হতে পারে, বা এটি এই ক্রেজি অতিরিক্ত nullমূল্য হতে পারে যা আমার সমস্যা ডোমেনে ম্যাপ করে না। একটি Triangleঅবজেক্টের তিনটি রয়েছে Point, যার নিজস্ব Xএবং Yমান রয়েছে তবে দুর্ভাগ্যক্রমে Points বা Triangleনিজেই এই পাগল নাল মান হতে পারে যা আমি যে গ্রাফিকিং ডোমেনে কাজ করছি তার অর্থহীন E ইত্যাদি t

আপনি যখন সম্ভাব্য-অ-অস্তিত্ব মানকে মডেল করার পরিকল্পনা করেন, তখন আপনাকে এটিকে স্পষ্টভাবে বেছে নেওয়া উচিত। আমি যদি লোকদের মডেল করার ইচ্ছা করি তবে প্রত্যেকটির Personএকটি FirstNameএবং একটি রয়েছে LastNameতবে কেবল কিছু লোকেরই আছে MiddleName, তবে আমি এর মতো কিছু বলতে চাই

class Person
    private string FirstName
    private Option<string> MiddleName
    private string LastName

যেখানে stringএখানে একটি অ-অযোগ্য প্রকার হিসাবে ধরে নেওয়া হয়। তারপরে NullReferenceExceptionকারও নামের দৈর্ঘ্য গণনা করার চেষ্টা করার সময় কোনও ছদ্মবেশী আক্রমণকারী নেই এবং কোনও অপ্রত্যাশিত নেই । টাইপ সিস্টেমটি নিশ্চিত করে যে কোনও কোডই MiddleNameএটির সম্ভাব্যতার জন্য অ্যাকাউন্টগুলির সাথে লেনদেন করে None, অন্যদিকে যে কোনও FirstNameকোডই সুরক্ষিতভাবে ধরে নিতে পারে যে সেখানে একটি মান রয়েছে।

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

let TotalNumCharsInPersonsName(p:Person) =
    let middleLen = match p.MiddleName with
                    | None -> 0
                    | Some(s) -> s.Length
    p.FirstName.Length + middleLen + p.LastName.Length

কোন উদ্বেগ ছাড়া। বিপরীতে, স্ট্রিংয়ের মতো ধরণের জন্য অযোগ্য রেফারেন্স যুক্ত ভাষায়, তারপরে ধরে নেওয়া

class Person
    private string FirstName
    private string MiddleName
    private string LastName

আপনি অনুমোদনের মত জিনিস শেষ

let TotalNumCharsInPersonsName(p:Person) =
    p.FirstName.Length + p.MiddleName.Length + p.LastName.Length

যদি আগত ব্যক্তি অবজেক্টটিতে সমস্ত কিছু অকার্যকর বা অকার্যকর না হয় তবে এটি প্রস্ফুটিত হয়

let TotalNumCharsInPersonsName(p:Person) =
    (if p.FirstName=null then 0 else p.FirstName.Length)
    + (if p.MiddleName=null then 0 else p.MiddleName.Length)
    + (if p.LastName=null then 0 else p.LastName.Length)

অথবা হতে পারে

let TotalNumCharsInPersonsName(p:Person) =
    p.FirstName.Length
    + (if p.MiddleName=null then 0 else p.MiddleName.Length)
    + p.LastName.Length

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

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

(দ্রষ্টব্য ভাল এমনকি এই সহজ উদাহরণ আরো জটিলতা হয়। এমনকি যদি একটি FirstNameহতে পারে না null, একটি stringউপস্থাপন করতে পারেন ""(খালি স্ট্রিং), যা সম্ভবত একটি ব্যক্তি নাম যে আমরা মডেল মনস্থ নয়। যেমন, এমনকি অ সঙ্গে অবিচ্ছেদ্য স্ট্রিংগুলি এখনও এটি হতে পারে যে আমরা "অর্থহীন মূল্যবোধের প্রতিনিধিত্ব করছি"। আবার, আপনি রানটাইমের সময় আক্রমণকারী এবং শর্তসাপেক্ষ কোডের মাধ্যমে বা টাইপ সিস্টেম (উদাহরণস্বরূপ কোনও NonEmptyStringপ্রকারের জন্য) ব্যবহার করে এটির বিরুদ্ধে লড়াই করতে বেছে নিতে পারেন The পরবর্তীকালে সম্ভবত অসুস্থ পরামর্শ দেওয়া হয় ("ভাল" প্রকারগুলি প্রচলিত ক্রিয়াকলাপগুলির একটি সেটের উপরে প্রায়শই "বন্ধ" থাকে এবং উদাহরণস্বরূপ NonEmptyStringবন্ধ হয় না.SubString(0,0)), তবে এটি নকশার জায়গাতে আরও পয়েন্ট প্রদর্শন করে। দিনের শেষে, যে কোনও প্রকারের সিস্টেমে কিছু জটিলতা রয়েছে এটি থেকে মুক্তি পাওয়া খুব ভাল হবে এবং অন্যান্য জটিলতা যা এ থেকে মুক্তি পাওয়ার পক্ষে কেবল আরও শক্ত। এই বিষয়টির মূল কথাটি হ'ল প্রায় প্রতিটি ধরণের সিস্টেমে "ডিফল্ট অনুসারে নাল রেফারেন্স" থেকে "ডিফল্ট অনুসারে নন-রেফারেন্স রেফারেন্স" এ পরিবর্তন প্রায় সর্বদা একটি সহজ পরিবর্তন যা টাইপ সিস্টেমকে জটিলতার সাথে লড়াই করার ক্ষেত্রে একটি দুর্দান্ত চুক্তি তৈরি করে এবং নির্দিষ্ট ধরণের ত্রুটি এবং অর্থহীন অবস্থার রায় দেওয়া। সুতরাং এটি বেশ উন্মাদ যে এতগুলি ভাষা বার বার এই ত্রুটিটি পুনরাবৃত্তি করে)


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

59
কি, তুমি কখনই দরজা খোলে নি?
জোশুয়া

58
লোকেরা কেন নির্দিষ্ট ডোমেনের শব্দার্থবিজ্ঞানের বিষয়ে কাজ করে তা আমি বুঝতে পারি না। ব্রায়ান একটি সংক্ষিপ্ত এবং সাধারণ উপায়ে শূন্যতার সাথে ত্রুটিগুলি প্রতিনিধিত্ব করেছিলেন, হ্যাঁ তিনি তার উদাহরণে সমস্যা ডোমেনটি সহজ করে দিয়েছিলেন প্রত্যেকের প্রথম এবং শেষ নাম রয়েছে বলে। এই প্রশ্নের উত্তর একটি 'টি', ব্রায়ানকে দেওয়া হয়েছিল - আপনি যদি কখনও বোস্টনে থাকেন তবে আমি এখানে যে সমস্ত পোস্টিং করছি তার জন্য আমি একটি বিয়ার পাওনা!
akaphenom

67
@ কফেনোম: ধন্যবাদ, তবে মনে রাখবেন যে সমস্ত লোক বিয়ার পান করে না (আমি একজন নন-পানীয়) er তবে আমি কৃতজ্ঞ যে আপনি কৃতজ্ঞতা জানানোর জন্য বিশ্বের একটি সরলিকৃত মডেল ব্যবহার করছেন, সুতরাং আমি আপনার বিশ্ব-মডেলের ত্রুটিযুক্ত অনুমানগুলি সম্পর্কে আরও চুপচাপ করব না। : পি (বাস্তব বিশ্বে এত জটিলতা! :))
ব্রায়ান

4
আশ্চর্যের বিষয় হল এই পৃথিবীতে 3 টি রাষ্ট্র-দরজা রয়েছে! এগুলি কয়েকটি হোটেলে টয়লেট-দরজা হিসাবে ব্যবহৃত হয়। একটি পুশ-বোতামটি ভিতর থেকে কী হিসাবে কাজ করে যা দরজাটি বাইরে থেকে লক করে। ল্যাচ বোল্ট চলার সাথে সাথে এটি স্বয়ংক্রিয়ভাবে আনলক হয়ে যায়।
comonad

65

বিকল্প ধরণের সম্পর্কে দুর্দান্ত জিনিসটি তারা theyচ্ছিক নয়। এটি অন্যান্য সমস্ত ধরণের নয়

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

কিন্তু প্রায়ই , আমরা এটা প্রয়োজন না থাকে, এবং যার ফলে একটি "নাল" অবস্থায় শুধুমাত্র অস্পষ্টতা এবং বিভ্রান্তি বাড়ে: আমি .NET মধ্যে একটি রেফারেন্স টাইপ পরিবর্তনশীল অ্যাক্সেস প্রত্যেক সময়, আমার বিবেচনায় যে আছে এটা নাল হতে পারে

প্রায়শই, এটি আসলে কখনই নালু হবে না , কারণ প্রোগ্রামার কোডটি এমনভাবে গঠন করেন যাতে এটি কখনই না ঘটে। তবে সংকলকটি এটি যাচাই করতে পারে না এবং প্রতিবার আপনি এটি দেখার পরে আপনাকে নিজেকে জিজ্ঞাসা করতে হবে "এটি কি নাল হতে পারে? আমাকে এখানে নাল পরীক্ষা করার দরকার আছে কি?"

আদর্শভাবে, অনেক ক্ষেত্রে যেখানে নাল বোঝা যায় না, এটির অনুমতি দেওয়া উচিত নয়

.NET অর্জন করা জটিল, যেখানে প্রায় সবকিছুই শূন্য হতে পারে। আপনি যে কোডটি 100% শৃঙ্খলাবদ্ধ এবং সামঞ্জস্যপূর্ণ বলে আহ্বান করছেন তার লেখকের উপর নির্ভর করতে হবে এবং কী নাল হতে পারে এবং কী হতে পারে না তা স্পষ্টভাবে নথিভুক্ত করতে হবে, বা আপনাকে নির্বিকার হতে হবে এবং সমস্ত কিছু পরীক্ষা করতে হবে ।

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

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

যেমন অন্যরা উল্লেখ করেছেন, উদাহরণস্বরূপ সি # বা জাভাতে নাল দুটি জিনিসের মধ্যে একটি বোঝাতে পারে:

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

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


এবং দ্বিতীয় অর্থ হিসাবে, আমরা যদি প্রথমে শালীনতা পরীক্ষা না করে এই ধরণের ভেরিয়েবলগুলি অ্যাক্সেস করার চেষ্টা করি তবে আমরা সংকলকটি আমাদের সতর্ক করতে (থামাতে?) চাই want আসন্ন নাল / নন-নাল সি # বৈশিষ্ট্য (অবশেষে!) সম্পর্কে একটি দুর্দান্ত নিবন্ধটি এখানে দেওয়া হয়েছে: ব্লগস.এমএসএনএন.মাইক্রোসফট
ওহাদ স্নাইডার

44

এখনও অবধি সমস্ত উত্তর কেন nullএকটি খারাপ জিনিস, এবং কোনও ভাষা যদি কোনও গ্যারান্টি দিতে পারে যে নির্দিষ্ট মানগুলি কখনই বাতিল হয় না তার উপরে কেন্দ্রীভূত হয় ।

তারপরে তারা পরামর্শ দেয় যে আপনি যদি সমস্ত মানগুলির জন্য অ-অযোগ্যতা প্রয়োগ করেন তবে এটি একটি সুন্দর ঝরঝরে ধারণা হবে, যদি আপনি এমন ধারণা যুক্ত করেন Optionবা Maybeএমন ধরণের প্রতিনিধিত্ব করতে পারেন যা সর্বদা নির্ধারিত মান না রাখে। এটি হ্যাস্কেল কর্তৃক গৃহীত পদ্ধতি।

সব ভাল জিনিস! তবে এটি একই প্রভাব অর্জনের জন্য সুস্পষ্টভাবে nullable / নন-নাল ধরণের ব্যবহার নিষিদ্ধ করে না। তাহলে, বিকল্পটি এখনও কেন একটি ভাল জিনিস? সর্বোপরি, স্কালা নালাগুলি মানগুলিকে সমর্থন করে (এটি করা দরকার, তাই এটি জাভা গ্রন্থাগারগুলির সাথে কাজ করতে পারে) তবে Optionsপাশাপাশি সমর্থন করে ।

প্র: সুতরাং কোনও ভাষা থেকে সম্পূর্ণরূপে নালগুলি সরাতে সক্ষম হওয়ার বাইরে কী কী সুবিধা রয়েছে?

উ: রচনা

যদি আপনি নাল-সচেতন কোড থেকে একটি নিষ্পাপ অনুবাদ করেন

def fullNameLength(p:Person) = {
  val middleLen =
    if (null == p.middleName)
      p.middleName.length
    else
      0
  p.firstName.length + middleLen + p.lastName.length
}

বিকল্প সচেতন কোড

def fullNameLength(p:Person) = {
  val middleLen = p.middleName match {
    case Some(x) => x.length
    case _ => 0
  }
  p.firstName.length + middleLen + p.lastName.length
}

খুব বেশি পার্থক্য নেই! তবে এটি বিকল্পগুলি ব্যবহার করার একটি ভয়ানক উপায় ... এই পদ্ধতিটি আরও পরিষ্কার:

def fullNameLength(p:Person) = {
  val middleLen = p.middleName map {_.length} getOrElse 0
  p.firstName.length + middleLen + p.lastName.length
}

অথবা এমনকি:

def fullNameLength(p:Person) =       
  p.firstName.length +
  p.middleName.map{length}.getOrElse(0) +
  p.lastName.length

আপনি বিকল্পগুলির তালিকার সাথে কাজ শুরু করার পরে এটি আরও ভাল হয়। ধারণা করুন যে তালিকাটি peopleনিজেই alচ্ছিক:

people flatMap(_ find (_.firstName == "joe")) map (fullNameLength)

কিভাবে কাজ করে?

//convert an Option[List[Person]] to an Option[S]
//where the function f takes a List[Person] and returns an S
people map f

//find a person named "Joe" in a List[Person].
//returns Some[Person], or None if "Joe" isn't in the list
validPeopleList find (_.firstName == "joe")

//returns None if people is None
//Some(None) if people is valid but doesn't contain Joe
//Some[Some[Person]] if Joe is found
people map (_ find (_.firstName == "joe")) 

//flatten it to return None if people is None or Joe isn't found
//Some[Person] if Joe is found
people flatMap (_ find (_.firstName == "joe")) 

//return Some(length) if the list isn't None and Joe is found
//otherwise return None
people flatMap (_ find (_.firstName == "joe")) map (fullNameLength)

নাল চেক সহ সংশ্লিষ্ট কোড (বা এমনকি এলভিস ?: অপারেটর) বেদনাদায়ক দীর্ঘ হবে। এখানে আসল কৌশলটি ফ্ল্যাটম্যাপ অপারেশন, যা বিকল্পগুলি এবং সংগ্রহগুলির নেস্টেড বোধগম্যতাটিকে এমনভাবে মঞ্জুরি দেয় যা অযোগ্য মানগুলি কখনই অর্জন করতে পারে না।


8
+1, এটি জোর দেওয়া ভাল পয়েন্ট। একটি সংযোজন: হাস্কেল-জমিতে ওভার flatMapবলা হবে (>>=), অর্থাত্ মনদেদের জন্য "বাইন্ড" অপারেটর। এটা ঠিক, হাস্কেলাররা flatMapপিং জিনিসগুলিকে এত পছন্দ করে যে আমরা এটি আমাদের ভাষার লোগোতে রেখেছি ।
সিএ ম্যাককান

1
+1 আশা করি এর অভিব্যক্তি Option<T>কখনই নালার হবে না। দুঃখের বিষয়, স্কালা উহ, এখনও জাভার সাথে যুক্ত :-) (অন্যদিকে, স্কালা যদি জাভার সাথে সুন্দর না খেলেন তবে কে এটি ব্যবহার করবে? ওও)

করার জন্য যথেষ্ট সহজ: 'তালিকা (নাল)। হেড অপশন'। মনে রাখবেন যে এর অর্থ 'কিছুই নয়' এর ফেরতের মূল্যের চেয়ে খুব আলাদা জিনিস
কেভিন রাইট

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

দুর্দান্ত উদাহরণ সহ দুর্দান্ত উত্তর!

38

যেহেতু লোকেরা এটি মিস করছে বলে মনে হচ্ছে: nullএটি দ্বিধাগ্রস্ত।

অ্যালিসের জন্ম তারিখটি null। এর মানে কী?

বব-এর মৃত্যুর তারিখ null। ওটার মানে কি?

একটি "যুক্তিসঙ্গত" ব্যাখ্যাটি হতে পারে যে অ্যালিসের জন্মের তারিখটি বিদ্যমান তবে এটি অজানা, যেখানে বব-এর মৃত্যুর তারিখের অস্তিত্ব নেই (বব এখনও জীবিত)। তবে কেন আমরা বিভিন্ন উত্তর পেয়েছি?


আরেকটি সমস্যা: nullএকটি প্রান্তের মামলা।

  • হয় null = null?
  • হয় nan = nan?
  • হয় inf = inf?
  • হয় +0 = -0?
  • হয় +0/0 = -0/0?

উত্তর সাধারণত "হ্যাঁ", "না", "হ্যাঁ", "হ্যাঁ", "না", "হ্যাঁ" যথাক্রমে। ক্রেজি "গণিতবিদ" NaN কে "নালিকা" বলে এবং বলে যে এটি নিজের সাথে সমান তুলনা করে। এসকিউএল নুলকে কোনও কিছুর সমান হিসাবে বিবেচনা করে না (তাই তারা NaNs এর মতো আচরণ করে)। সন্দেহ জাগে কি যখন আপনি দোকান থেকে ± চেষ্টা ∞, ± 0, এবং Nans একই ডাটাবেসের কলাম মধ্যে (সেখানে 2 হয় 53 Nans, যার অর্ধেক "নেগেটিভ" আছে)।

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


এবং এখন বাধ্যতামূলক গল্পের জন্য:

আমি সম্প্রতি পাঁচটি কলাম সহ একটি (sqlite3) ডাটাবেস সারণি ডিজাইন করেছি a NOT NULL, b, id_a, id_b NOT NULL, timestamp। মোটামুটি স্বেচ্ছাচারিত অ্যাপ্লিকেশনগুলির জন্য জেনেরিক সমস্যা সমাধানের জন্য এটি তৈরি করা একটি জেনেরিক স্কিমা কারণ, দুটি স্বতন্ত্রতার প্রতিবন্ধকতা রয়েছে:

UNIQUE(a, b, id_a)
UNIQUE(a, b, id_b)

id_aকেবলমাত্র বিদ্যমান অ্যাপ্লিকেশন ডিজাইনের সাথে সামঞ্জস্যের জন্য উপস্থিত রয়েছে (আংশিক কারণ আমি আরও ভাল সমাধান নিয়ে আসিনি), এবং নতুন অ্যাপ্লিকেশনটিতে ব্যবহৃত হয় না। উপায় শূন্য SQL এর যে কাজ করে কারণ, আমি ঢোকাতে পারবেন (1, 2, NULL, 3, t)এবং (1, 2, NULL, 4, t)এবং প্রথম স্বতন্ত্রতা বাধ্যতা (কারণ লঙ্ঘন করে না (1, 2, NULL) != (1, 2, NULL))।

এটি বিশেষত কাজ করে কারণ বেশিরভাগ ডাটাবেসে NUL কী স্বতন্ত্রতার সীমাবদ্ধতায় কাজ করে (সম্ভবত এটি "রিয়েল-ওয়ার্ল্ড" পরিস্থিতিগুলির মডেল করা আরও সহজ, উদাহরণস্বরূপ কোনও দু'জনেরই একই সামাজিক সুরক্ষা নম্বর থাকতে পারে না, তবে সমস্ত লোকের এক নয়)।


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

সিডিনোট: মাঝে মধ্যে আপনি পারস্পরিক-একচেটিয়া পয়েন্টার (যেমন তাদের মধ্যে কেবল একটিই নন-এনইউএল হতে পারে) চান, যেমন অনুমান আইওএসে type DialogState = NotShown | ShowingActionSheet UIActionSheet | ShowingAlertView UIAlertView | Dismissed। পরিবর্তে, আমি স্টাফ মত কাজ করতে বাধ্য assert((bool)actionSheet + (bool)alertView == 1)


প্রকৃত গণিতবিদরা "এনএএন" ধারণাটি ব্যবহার করেন না, যদিও বিশ্রাম নিন।
নলডোরিন

@ নলডোরিন: তারা তা করে তবে তারা "অনির্দিষ্ট ফর্ম" শব্দটি ব্যবহার করে।
আইজে কেনেডি

@ আইজে কেনেডি: এটি একটি আলাদা কলেজ, যা আমি জানি বেশ ধন্যবাদ আপনাকে ধন্যবাদ। কিছু 'এনএএন' অনির্দিষ্ট রূপের প্রতিনিধিত্ব করতে পারে তবে এফপিএ প্রতীকী যুক্তি না করায় এটিকে অনির্দিষ্ট আকারের সাথে সমান করা বেশ বিভ্রান্তিকর!
নলডোরিন

এর সাথে কী হয়েছে assert(actionSheet ^ alertView)? বা আপনার ভাষা এক্সওআর বুল করতে পারে না?
বিড়াল

16

রেফারেন্স / পয়েন্টার থাকার অনাকাঙ্ক্ষিতা ডিফল্টরূপে নমনীয়।

আমি মনে করি না যে এটি নালগুলির সাথে প্রধান সমস্যা, নালগুলির সাথে প্রধান সমস্যাটি হ'ল তারা দুটি জিনিস বোঝাতে পারে:

  1. রেফারেন্স / পয়েন্টারটি অনির্বাচিত: এখানে সমস্যাটি সাধারণভাবে পরিবর্তনের মতো। একটির জন্য, এটি আপনার কোড বিশ্লেষণ করা আরও কঠিন করে তোলে।
  2. পরিবর্তনশীল নাল হওয়া আসলে কিছু অর্থ: এটি হ'ল অপশন প্রকারগুলি আসলে ফর্মালাইজ করে।

অপশন ধরণের সমর্থনকারী ভাষাগুলি সাধারণত অবিচ্ছিন্ন ভেরিয়েবলগুলির ব্যবহার নিষিদ্ধ বা নিরুৎসাহিত করে।

প্যাটার্ন ম্যাচিংয়ের মতো নাল কেসগুলি পরীক্ষা করা সহজ করার জন্য কৌশলগুলি সহ বিকল্পের ধরণ কীভাবে কাজ করে।

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

এফ # তে:

//first we create the option list, and then filter out all None Option types and 
//map all Some Option types to their values.  See how type-inference shines.
let optionList = [Some(1); Some(2); None; Some(3); None]
optionList |> List.choose id //evaluates to [1;2;3]

//here is a simple pattern-matching example
//which prints "1;2;None;3;None;".
//notice how value is extracted from op during the match
optionList 
|> List.iter (function Some(value) -> printf "%i;" value | None -> printf "None;")

তবে জাভা জাতীয় ভাষায় অপশন ধরণের সরাসরি সমর্থন ছাড়াই আমাদের কাছে এমন কিছু থাকতে হবে:

//here we perform the same filter/map operation as in the F# example.
List<Option<Integer>> optionList = Arrays.asList(new Some<Integer>(1),new Some<Integer>(2),new None<Integer>(),new Some<Integer>(3),new None<Integer>());
List<Integer> filteredList = new ArrayList<Integer>();
for(Option<Integer> op : list)
    if(op instanceof Some)
        filteredList.add(((Some<Integer>)op).getValue());

বিকল্প সমাধান যেমন বার্তা খাওয়ার শূন্যতার মতো

নাল চেকিংয়ের মাথা-ব্যথা হালকা করার চেষ্টা হিসাবে উদ্দেশ্য-সি-এর "বার্তা খাওয়ার নীল" তেমন কোনও সমাধান নয়। মূলত, নাল বস্তুর উপর কোনও পদ্ধতি চালনার চেষ্টা করার সময় রানটাইম ব্যতিক্রম ছুঁড়ে ফেলার পরিবর্তে অভিব্যক্তিটি নিজেই নালকে মূল্যায়ন করে। অবিশ্বাস সাসপেন্ড করা, এ যেন প্রতিটি উদাহরণ পদ্ধতি দিয়ে শুরু হয় if (this == null) return null;। তবে তথ্যের ক্ষতি আছে: আপনি জানেন না যে পদ্ধতিটি বাতিল হয়ে গেছে কারণ এটি বৈধ ফেরতের মান, বা বস্তুটি আসলে নাল is এটি অনেকটা ব্যতিক্রম গিলে ফেলার মতো, এবং পূর্বে উল্লিখিত শূন্যতার সাথে ইস্যুগুলি মোকাবেলায় কোনও অগ্রগতি করে না।


এটি একটি পোষা প্রাণবন্ত তবে সি # তেমন কোনও সি-এর মতো ভাষা নয়।
রোমান এ। টেকার

4
আমি এখানে জাভা যাচ্ছিলাম, যেহেতু সি # এর সম্ভবত একটি ভাল সমাধান হতে পারে ... তবে আমি আপনার উঁকিঝুঁকি প্রশংসা করি, লোকেরা আসলে যা বোঝায় তা হল "সি-অনুপ্রাণিত বাক্য বিশিষ্ট ভাষা"। আমি এগিয়ে গিয়ে "সি-লাইক" স্টেটমেন্টটি প্রতিস্থাপন করেছি।
স্টিফেন সোয়েনসেন

লিনক সহ, ডান। আমি সি # এর কথা ভাবছিলাম এবং এটি লক্ষ্য করিনি।
রোমান এ। টেকার

1
হ্যাঁ সি অনুপ্রেরণামূলক সিনট্যাক্স সহ বেশিরভাগই, তবে আমি মনে করি যে আমি পাইথন / রুবীর মতো অত্যাবশ্যক প্রোগ্রামিং ভাষাগুলি সি এর মতো সিট্যাক্সের মতো খুব কম ব্যবহার করেছি যা কার্যকরী প্রোগ্রামাররা সি-লাইক হিসাবে উল্লেখ করেছেন।
রোমান এ। টেকার

11

অ্যাসেম্বলি আমাদের ঠিকানাগুলি আনয়ন টাইপ পয়েন্টার হিসাবেও নিয়ে আসে। সি তাদের টাইপড পয়েন্টার হিসাবে সরাসরি ম্যাপ করে তবে আলগোলের নালকে একটি অনন্য পয়েন্টার মান হিসাবে প্রবর্তন করে, যা সমস্ত টাইপড পয়েন্টারের সাথে সামঞ্জস্য করে। সিটিতে নাল দিয়ে বড় সমস্যাটি হ'ল যেহেতু প্রতিটি পয়েন্টারটি শূন্য হতে পারে তাই ম্যানুয়াল চেক ব্যতীত কেউ নিরাপদে কোনও পয়েন্টার ব্যবহার করতে পারে না।

উচ্চ-স্তরের ভাষাগুলিতে, নাল থাকা অদ্ভুত কারণ এটি সত্যিই দুটি স্বতন্ত্র ধারণা প্রকাশ করে:

  • এমন কিছু বলা যা অপরিজ্ঞাত
  • কিছু বলা .চ্ছিক

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

দ্বিতীয় কেসটি বিকল্পতা এবং সর্বোত্তমভাবে স্পষ্টভাবে সরবরাহ করা হয়, উদাহরণস্বরূপ কোনও বিকল্প ধরণের সাথে


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

সিতে আমরা থাকতে পারতাম:

struct PhoneNumber { ... };
struct MotorbikeLicence { ... };
struct CarLicence { ... };
struct TruckLicence { ... };

struct Driver {
  char name[32]; /* Null terminated */
  struct PhoneNumber * emergency_phone_number;
  struct MotorbikeLicence * motorbike_licence;
  struct CarLicence * car_licence;
  struct TruckLicence * truck_licence;
};

যেমন আপনি পর্যবেক্ষণ করেন, আমাদের ড্রাইভারের তালিকার কোনও প্রসেসিংয়ে আমাদের নাল পয়েন্টারগুলি পরীক্ষা করতে হবে। সংকলক আপনাকে সাহায্য করবে না, প্রোগ্রামের সুরক্ষা আপনার কাঁধের উপর নির্ভর করে।

ওক্যামেলে, একই কোডটি দেখতে এই রকম হবে:

type phone_number = { ... }
type motorbike_licence = { ... }
type car_licence = { ... }
type truck_licence = { ... }

type driver = {
  name: string;
  emergency_phone_number: phone_number option;
  motorbike_licence: motorbike_licence option;
  car_licence: car_licence option;
  truck_licence: truck_licence option;
}

এখন বলা যাক যে আমরা সমস্ত ড্রাইভারের নাম ও তাদের ট্রাক লাইসেন্স নম্বর প্রিন্ট করতে চাই।

সি তে:

#include <stdio.h>

void print_driver_with_truck_licence_number(struct Driver * driver) {
  /* Check may be redundant but better be safe than sorry */
  if (driver != NULL) {
    printf("driver %s has ", driver->name);
    if (driver->truck_licence != NULL) {
      printf("truck licence %04d-%04d-%08d\n",
        driver->truck_licence->area_code
        driver->truck_licence->year
        driver->truck_licence->num_in_year);
    } else {
      printf("no truck licence\n");
    }
  }
}

void print_drivers_with_truck_licence_numbers(struct Driver ** drivers, int nb) {
  if (drivers != NULL && nb >= 0) {
    int i;
    for (i = 0; i < nb; ++i) {
      struct Driver * driver = drivers[i];
      if (driver) {
        print_driver_with_truck_licence_number(driver);
      } else {
        /* Huh ? We got a null inside the array, meaning it probably got
           corrupt somehow, what do we do ? Ignore ? Assert ? */
      }
    }
  } else {
    /* Caller provided us with erroneous input, what do we do ?
       Ignore ? Assert ? */
  }
}

ওসিএএমএলে এটি হবে:

open Printf

(* Here we are guaranteed to have a driver instance *)
let print_driver_with_truck_licence_number driver =
  printf "driver %s has " driver.name;
  match driver.truck_licence with
    | None ->
        printf "no truck licence\n"
    | Some licence ->
        (* Here we are guaranteed to have a licence *)
        printf "truck licence %04d-%04d-%08d\n"
          licence.area_code
          licence.year
          licence.num_in_year

(* Here we are guaranteed to have a valid list of drivers *)
let print_drivers_with_truck_licence_numbers drivers =
  List.iter print_driver_with_truck_licence_number drivers

আপনি এই তুচ্ছ উদাহরণটিতে দেখতে পাচ্ছেন, নিরাপদ সংস্করণে জটিল কিছু নেই:

  • এটা পরিশ্রম।
  • আপনি আরও ভাল গ্যারান্টি পেতে এবং কোনও নাল চেক প্রয়োজন হয় না।
  • সংকলকটি নিশ্চিত করেছে যে আপনি বিকল্পটির সাথে সঠিকভাবে কাজ করেছেন

যদিও সি তে, আপনি কেবল একটি নাল চেক এবং বুমকে ভুলে যেতে পারেন ...

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


আমি এটি কখনও চেষ্টা করি নি তবে এন.ইউইকিপিডিয়া.আর / উইকি / সাইক্লোন_৯২০ প্রোগ্রামিং_এলংয়েজ ১০৯৯ দাবি করেছে যে সি-র জন্য নন-পয়েন্টারকে মঞ্জুরি দেয়।
রোমান এ। টেকার

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

আমি বিশ্বাস করি NULL"কিছু উল্লেখ করতে পারে না এমন রেফারেন্সে" কিছু আলগোল ভাষার জন্য উদ্ভাবিত হয়েছিল (উইকিপিডিয়া সম্মত হয়, en.wikedia.org/wiki/Null_pointer# নাল_পয়েন্টার দেখুন )। তবে অবশ্যই এটি সম্ভাব্য যে এসেম্বলি প্রোগ্রামাররা তাদের পয়েন্টারগুলিকে একটি অবৈধ ঠিকানাতে সূচনা করেছিল (পড়ুন: নাল = 0)।

1
@ স্টিফেন: আমরা সম্ভবত একই জিনিসটি বোঝাতে চাইছিলাম। আমার কাছে তারা নিঃশব্দ বা অবিচ্ছিন্ন জিনিস ব্যবহার নিষিদ্ধ করে বা স্পষ্টভাবে নিষেধ করে কারণ অপরিজ্ঞাত বিষয় নিয়ে আলোচনা করার কোনও অর্থ নেই কারণ আমরা তাদের সাথে বুদ্ধিমান বা দরকারী কিছু করতে পারি না। এতে যা কিছু হবে তা নিয়ে আগ্রহ নেই।
bltxd

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

5

মাইক্রোসফ্ট রিসার্চ একটি আন্তঃসাহী প্রকল্প বলা হয়

ফটকা খেলা #

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


4

.NET পটভূমি থেকে আসা, আমি সবসময় মনে করি নাল একটি পয়েন্ট ছিল, এটি দরকারী। যতক্ষণ না আমি স্ট্রাক্টস সম্পর্কে জানতাম এবং তাদের সাথে প্রচুর বয়লারপ্লেট কোড এড়ানো এতো সহজ কাজ করছিল। টনি হোয়ের ২০০৯ সালে কিউকন লন্ডনে বক্তৃতা করে নাল রেফারেন্স আবিষ্কার করার জন্য ক্ষমা চেয়েছিলেন । তাকে উদ্ধৃত করার জন্য:

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

এই প্রশ্নটি প্রোগ্রামারগুলিতেও দেখুন


3

রবার্ট নাইস্ট্রম এখানে একটি সুন্দর নিবন্ধ অফার:

http://journal.stuffwithstuff.com/2010/08/23/void-null-maybe-and-nothing/

তাঁর ম্যাগপি প্রোগ্রামিং ভাষায় অনুপস্থিতি এবং ব্যর্থতার জন্য সমর্থন যুক্ত করার সময় তাঁর চিন্তার প্রক্রিয়াটির বর্ণনা দিচ্ছেন ।


1

আমি সর্বদা নুলকে (বা শূন্য) কোনও মূল্য অনুপস্থিত হিসাবে দেখেছি ।

কখনও কখনও আপনি এটি চান, কখনও কখনও আপনি না। এটি আপনি যে ডোমেনের সাথে কাজ করছেন তার উপর নির্ভর করে। যদি অনুপস্থিতি অর্থবহ হয়: কোনও মাঝের নাম নেই, তবে আপনার অ্যাপ্লিকেশন সেই অনুযায়ী কাজ করতে পারে। অন্যদিকে শূন্য মানটি না থাকলে: প্রথম নামটি নাল হয়, তারপরে বিকাশকারী প্রবাদটি 2 am ফোন কল পেয়ে যায়।

আমি শূন্যতার জন্য চেক সহ কোড ওভারলোডেড এবং অতিরিক্ত-জটিলও দেখেছি। আমার কাছে এটি দুটি জিনিসের একটির অর্থ:
ক) অ্যাপ্লিকেশন ট্রিতে একটি বাগ উচ্চতর
খ) খারাপ / অসম্পূর্ণ নকশা

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

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


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

@ স্টেফেন - আসলে আমার বার্তাটির পিছনে ফিরে তাকানোর পরে, আমি মনে করি পুরো দ্বিতীয়ার অর্ধেকটি একটি এখনও-জিজ্ঞাসা করা প্রশ্নে স্থানান্তরিত করা উচিত। তবে আমি এখনও বলছি যে কিছু অনুপস্থিত আছে কিনা তা পরীক্ষা করে দেখার জন্য নালটি খুব দরকারী।
জন

0

ভেক্টর ভাষাগুলি মাঝে মাঝে শূন্যতা না পেয়ে পালিয়ে যেতে পারে।

খালি ভেক্টর এই ক্ষেত্রে একটি টাইপড নাল হিসাবে কাজ করে।


আমি মনে করি আপনি যা বলছেন তা আমি বুঝতে পেরেছি তবে আপনি কি কয়েকটি উদাহরণ তালিকাভুক্ত করতে পারেন? বিশেষত একাধিক ফাংশন সম্ভবত নাল মান প্রয়োগ করার জন্য?
রোমান এ। টেকার

ভাল একটি ভেক্টরকে খালি ভেক্টরে রূপান্তরিত করার ফলস্বরূপ অন্য খালি ভেক্টরের ফলস্বরূপ। এফওয়াইআই, এসকিউএল বেশিরভাগ ভেক্টরের ভাষা language
জোশুয়া

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