'নাল' এবং 'হতে পারে' উভয় ধারণাটি কী বোঝায়?


11

সি # তে একটি ওয়েব এপিআইয়ের জন্য ক্লায়েন্ট তৈরি করার সময় , আমি nullএকটি মান হিসাবে যেখানে এটি দুটি পৃথক বিষয় উপস্থাপন করবে তা নিয়ে আমি একটি সমস্যায় পড়েছি :

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

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

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


9
এটি থাকাতে স্যানসে করে না null। এটি সম্পূর্ণরূপে ভাঙা ধারণা।
আন্দ্রেজ বাউয়ার

7
একটি সম্ভবত-সম্ভবত-ফু তৈরি করবেন না যার মধ্যে সম্ভবত-ফু-এর চেয়ে আলাদা শব্দার্থক শব্দ রয়েছে। হতে পারে একটি মোনাড হতে পারে , এবং মোনাদ আইনগুলির মধ্যে একটি হ'ল M M xএবং M xএকই শব্দার্থিক হওয়া উচিত।
এরিক লিপার্ট

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

3
হ্যাঁ, আমি সম্ভবত ব্যবহার করব না। কিন্তু, আসলে, ঠিক যেমন Maybe aহিসাবে একই , শব্দার্থিক ভাবে হিসাবে একই , এবং isomorphic করার @Andej উত্তর থেকে টাইপ করুন। আপনি এই ধরণের জন্য আপনার নিজের মনড উদাহরণটিও সংজ্ঞায়িত করতে পারেন এবং তাই বিভিন্ন মোনাড সংযুক্তকারীগুলি ব্যবহার করতে পারেন। a + 1 + 1a+1Maybe Maybe aa+1+1UserInput a
ইউজ

12
@ এরিকলিপার্ট: এটি "মিথ্যা M (M x)এবং M xএটি একই শব্দার্থক হওয়া উচিত " এটি মিথ্যা । M = Listউদাহরণস্বরূপ নিন : তালিকার তালিকাগুলি তালিকার মতো জিনিস নয়। যখন Mএকটি একসংখ্যা, সেখানে একটি হল রূপান্তর থেকে (যথা একসংখ্যা গুণ) M (M x)থেকে M xযা তাদের মধ্যে সম্পর্ক ব্যাখ্যা, কিন্তু তারা "একই শব্দার্থবিদ্যা" হবে না।
আন্দ্রেজ বাউয়ার

উত্তর:


14

nullএকটি ডিফল্ট উপহার হিসেবে মান সর্বত্র শুধু একটি হল সত্যিই ভেঙ্গে ধারণা , যাতে প্রায় ভুলে যাওয়া।

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

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

data UnknownNothing a =
     Unknown
   | Nothing
   | Value a

এমনকি এমন ঘটনাও হতে পারে যে আপনার আরও বর্ণনামূলক কিছু ব্যবহার করা উচিত যা মনে রাখা সহজ:

data UserInput a =
     Unknown
   | NotGiven
   | Answer a

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


আপনি যখন এটির মতো বানান দেখেন তখন নির্ভুল জ্ঞান তৈরি করে। আমি বেশিরভাগ ধারণাগুলিতে আগ্রহী, বিদ্যমান লাইব্রেরি সমর্থনটি কেবল একটি বোনাস :)
স্টিজন

এই জাতীয় ধরণের তৈরি করতে কেবল বাধা থাকলে অনেক ভাষায় কম ছিল। : /
রাফেল

যদি কেবল লোকেরা 1960 এর দশক (বা 1980 এর দশকে তাদের পুনর্জন্ম) ভাষা ব্যবহার বন্ধ করে দেয়।
আন্দ্রেজ বাউর

@ আন্দ্রেজবাউর: কি? তবে তাত্ত্বিকদের কাছে অভিযোগ করার কিছু নেই!
Yttrill

আমরা অভিযোগ করি না, আমরা একদম উপরে আছি।
আন্দ্রেজ বাউর

4

যতদূর আমি জানি, nullসি # তে মানটি কিছু ভেরিয়েবলের জন্য তার মান (আমি ঠিক আছি?) এর উপর নির্ভর করে একটি সম্ভাব্য মান । উদাহরণস্বরূপ, কিছু শ্রেণীর উদাহরণ। বাকী প্রকারের জন্য (যেমন int, boolইত্যাদি) আপনি পরিবর্তনের সাথে int?বা bool?পরিবর্তে ডিক্লেয়ার করে এই ব্যতিক্রম মানটি যুক্ত করতে পারেন (এটি ঠিক Maybeকনস্ট্রাক্টর তাই করে, যেমন আমি পরেরটি বর্ণনা করব)।

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

আইএমও, এই শেষ পদ্ধতির কোনও প্রোগ্রামিং ভাষার জন্য ভাল।


হ্যাঁ, আপনার # সি সম্পর্কে উপলব্ধিটি সঠিক। সুতরাং আমি কি আপনার উত্তর থেকে অনুমান করতে পারি যে আপনি বাসা বাঁধার Maybeএবং nullপুরোপুরি বাদ দেওয়ার পরামর্শ দিয়েছেন ?
Stijn

2
আমার মতামত একটি ভাষা কেমন হওয়া উচিত। আমি সত্যিই সি # প্রোগ্রামিংয়ের সেরা অনুশীলনগুলি জানি না। আপনার ক্ষেত্রে, সেরা বিকল্পটি হ'ল @ আন্দ্রেজ বাউর বর্ণিত হিসাবে একটি ডেটাটাইপ সংজ্ঞায়িত করা হবে, তবে আমার ধারণা আপনি সি # তে এটি করতে পারবেন না।
ইউজ

@ ইউজ: বীজগণিত সামের প্রকারগুলি (মোটামুটিভাবে) ক্লাসিকাল ওও-স্টাইলের সাব টাইপিং এবং সাব টাইপ পলিমারফিক ম্যাসেজ প্রেরণের সাথে প্রায় অনুমান করা যেতে পারে। উদাহরণস্বরূপ, এটি স্ক্যালায় এটি কীভাবে করা হয়েছে যাতে বন্ধ প্রকারের জন্য অতিরিক্ত মোচড় দেওয়া যায় । প্রকারটি একটি বিমূর্ত সুপারক্লাসে পরিণত হয়, প্রকার নির্মাতারা কংক্রিট সাবক্লাসে পরিণত হয়, কনস্ট্রাক্টরের সাথে প্যাটার্নের মিলগুলি কংক্রিট সাবক্লাস বা isinstanceপরীক্ষাগুলিতে ওভারলোড পদ্ধতিতে কেসগুলি সরিয়ে দিয়ে প্রায় অনুমান করা যায় । স্কালায় "যথাযথ" প্যাটার্নের মিলও রয়েছে এবং সি ♯ সম্প্রতি খুব সাধারণ প্যাটার্নও অর্জন করেছে।
Jörg ডব্লু মিট্টাগ

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

অবশ্যই আপনি সি # তে এই শব্দার্থকগুলির সাথে প্রকারগুলি ডিজাইন করতে পারেন। দ্রষ্টব্য যে সি # বিল্ট-ইন সম্ভবত টাইপ (সি # তে নুলাবল নামে পরিচিত) বাসা বাঁধার অনুমতি দেয় না। int??সি # তে অবৈধ।
এরিক লিপার্ট

3

আপনি যদি টাইপ ইউনিয়নগুলি পছন্দ করতে পারেন, যেমন X or Y, এবং যদি আপনার নামের মতো কোনও টাইপ থাকে Nullযা কেবলমাত্র nullমান (এবং অন্য কিছুই নয়) উপস্থাপন করে তবে কোনও প্রকারের জন্য T, T or Nullআসলে এর চেয়ে আলাদা নয় Maybe T। সমস্যাটি nullতখনই হয় যখন ভাষা কোনও প্রকারের Tসাথে T or Nullস্পষ্টভাবে আচরণ nullকরে, প্রতিটি প্রকারের জন্য একটি বৈধ মান তৈরি করে (যে ভাষাগুলিতে রয়েছে তাদের মধ্যে আদিম প্রকার বাদে)। এটি জাভাতে উদাহরণস্বরূপ ঘটে যেখানে একটি ফাংশন যা গ্রহণ করে Stringতা গ্রহণ করে null

আপনি যদি মানগুলির সেট এবং orসেটগুলির ইউনিয়ন হিসাবে প্রকারগুলি আচরণ করেন , তবে (T or Null) or Nullমানগুলির সেটটি উপস্থাপন করেন T ∪ {null} ∪ {null}যা সমান T or Null। এমন সংকলক রয়েছে যা এই ধরণের বিশ্লেষণ (এসবিসিএল) সম্পাদন করে। মন্তব্যে যেমন বলা হয়েছে, আপনি ডোমেন হিসাবে প্রকারগুলি দেখতে Maybe Tএবং Maybe Maybe Tঅন্যদিকে সহজেই পার্থক্য করতে পারবেন না (অন্যদিকে, এই দৃশ্যটি গতিযুক্ত টাইপড প্রোগ্রামগুলির জন্য বেশ কার্যকর)। তবে আপনি বিভিন্ন ধরণের বীজগণিতীয় এক্সপ্রেশন হিসাবে রাখতে পারেন, যেখানে (T or Null) or Nullমেইবেসের একাধিক স্তর প্রতিনিধিত্ব করে।


2
আসলে, এটি গুরুত্বপূর্ণ যে Maybe (Maybe X)হিসাবে একই জিনিস নয় Maybe XNothingহিসাবে একই জিনিস নয় Just Nothing। এর সাথে সংঘাতের Maybe (Maybe X)ফলে বহুবর্ষচিকিত্সা Maybe Xকরা অসম্ভব হয়ে পড়ে Maybe _
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

1

আপনি কী প্রকাশ করতে চান তা খুঁজে বের করতে হবে এবং তারপরে কীভাবে তা প্রকাশ করবেন তার উপায় খুঁজে বের করতে হবে।

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

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

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

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

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