উত্তর:
ব্যবহার Maybe(বা তার মামাতো ভাই Eitherযা মূলত একই ভাবে কাজ করে কিন্তু আপনি জায়গায় একটি অবাধ মান দেয় Nothing) ব্যতিক্রম চেয়ে কিছুটা ভিন্ন উদ্দেশ্য করে তোলে। জাভা পদগুলিতে এটি রানটাইম ব্যতিক্রমের চেয়ে পরীক্ষিত ব্যতিক্রমের মতো। এটি প্রত্যাশিত এমন কিছু উপস্থাপন করে যা আপনার মোকাবিলা করতে হবে, আপনি প্রত্যাশিত ত্রুটির পরিবর্তে।
সুতরাং মত একটি ফাংশন indexOfএকটি Maybeমান ফিরে আসবে কারণ আপনি আশা করেন যে আইটেমটি তালিকায় নেই। এটি অনেকটা nullকোনও ফাংশন থেকে ফিরে আসার মতো , কেবলমাত্র কোনও টাইপ-নিরাপদ উপায়ে যা আপনাকে nullমামলা মোকাবেলা করতে বাধ্য করে । Eitherব্যতীত আপনি ত্রুটি ক্ষেত্রে সঙ্গে যুক্ত তথ্য আসতে পারেন যে একই ভাবে কাজ করে, তাই এটা আসলে বেশি ব্যতিক্রম অনুরূপ Maybe।
সুতরাং Maybe/ Eitherপদ্ধতির সুবিধা কি ? একটির জন্য, এটি ভাষার প্রথম শ্রেণির নাগরিক। আসুন Eitherএকটি ব্যতিক্রম ছোঁড়া ব্যবহার করে একটি ফাংশন তুলনা করা যাক । ব্যতিক্রম ক্ষেত্রে, আপনার একমাত্র আসল আশ্রয় একটি try...catchবিবৃতি। জন্য Eitherফাংশন, আপনি যদি বিদ্যমান combinators ব্যবহার প্রবাহ নিয়ন্ত্রণ স্বচ্ছ করে তুলতে পারে। এখানে উদাহরণ তুলে ধরা হলো:
প্রথমে ধরা যাক যে আপনি বেশ কয়েকটি ফাংশন চেষ্টা করতে চান যা একটি ক্রমাগত ত্রুটিযুক্ত হতে পারে যতক্ষণ না আপনি এমনটি না পেয়ে পান না। আপনি যদি ত্রুটি ছাড়াই কোনও না পান তবে আপনি একটি বিশেষ ত্রুটি বার্তাটি ফিরিয়ে দিতে চান। এটি আসলে খুব দরকারী প্যাটার্ন তবে এটি ব্যবহারে ভয়াবহ ব্যথা হতে পারে try...catch। আনন্দের, যেহেতু Eitherশুধু একটি স্বাভাবিক মান, আপনি যদি বিদ্যমান ফাংশন কোড অনেক স্বচ্ছ করে তুলতে ব্যবহার করতে পারেন:
firstThing <|> secondThing <|> throwError (SomeError "error message")
অন্য একটি উদাহরণ একটি alচ্ছিক ফাংশন হচ্ছে। আসুন ধরা যাক আপনার চালানোর জন্য বেশ কয়েকটি ফাংশন রয়েছে যা একটি ক্যোয়ারী অনুকূল করার চেষ্টা করে including যদি এটি ব্যর্থ হয় তবে আপনি অন্য যে কোনও উপায়ে চালানো চান। আপনি কোড কিছু লিখতে পারেন:
do a <- getA
b <- getB
optional (optimize query)
execute query a b
এই উভয় ক্ষেত্রেই ব্যবহারের চেয়ে পরিষ্কার এবং খাটো try..catch, এবং আরও গুরুত্বপূর্ণভাবে, আরও শব্দার্থক। সর্বদা ব্যতিক্রমগুলি হ্যান্ডেল করার চেয়ে ব্যবহারের মতো <|>বা optionalআপনার উদ্দেশ্যগুলি আরও পরিষ্কার করে তোলে try...catch।
এছাড়াও নোট করুন যে আপনার লাইনের মতো লাইন দিয়ে আপনার কোড লিটার করতে হবে নাif a == Nothing then Nothing else ... ! চিকিত্সা Maybeএবং Eitherএকটি monad হিসাবে পুরো বিষয়টি হ'ল এড়ানো। আপনি বাইন্ড ফাংশনে প্রসারণ শব্দার্থকে এনকোড করতে পারেন যাতে আপনি বিনামুল্যে নাল / ত্রুটি চেক পান। আপনাকে কেবলমাত্র একবার পরিষ্কারভাবে যাচাই করতে হবে যদি আপনি Nothingপ্রদত্ত একটি ব্যতীত অন্য কোনও কিছু ফিরিয়ে দিতে চান Nothingতবে তারপরেও এটি সহজ: সেই কোডটি আরও সুন্দর করার জন্য স্ট্যান্ডার্ড লাইব্রেরি ফাংশনগুলির একটি গুচ্ছ রয়েছে।
শেষ অবধি, আরেকটি সুবিধা হ'ল একটি Maybe/ Eitherপ্রকারটি কেবল সহজ। অতিরিক্ত কীওয়ার্ড বা নিয়ন্ত্রণ কাঠামো সহ ভাষা প্রসারিত করার দরকার নেই - সবকিছু কেবল একটি লাইব্রেরি। যেহেতু এগুলি কেবলমাত্র সাধারণ মান, তাই এটি টাইপ সিস্টেমটিকে সহজতর করে তোলে - জাভাতে, আপনাকে প্রকারের (যেমন: রিটার্নের ধরণ) এবং প্রভাবগুলির (উদাহরণস্বরূপ throwsবিবৃতি) এর মধ্যে পার্থক্য করতে হবে যেখানে আপনি ব্যবহার করছেন না Maybe। তারা অন্য যে কোনও ব্যবহারকারী-সংজ্ঞায়িত প্রকারের মতোই আচরণ করে - ভাষায় বিশেষ ত্রুটি-পরিচালনা করার কোডের দরকার নেই।
আর একটি জয় হ'ল Maybe/ Eitherফান্টেক্টর এবং মোনাদ, যার অর্থ তারা বিদ্যমান মোনাড কন্ট্রোল ফ্লো ফাংশনগুলি (যার মধ্যে একটি মোটামুটি সংখ্যা রয়েছে) এর সুবিধা নিতে পারে এবং সাধারণভাবে, অন্যান্য মনাদের সাথে সুন্দরভাবে খেলতে পারে।
বলেছিল, কিছু ক্যাভেট রয়েছে। একটির জন্য, চেক করা ব্যাতিক্রমণ Maybeবা Eitherপ্রতিস্থাপন করুন না । 0 দিয়ে ভাগ করার মতো জিনিসগুলি পরিচালনা করার জন্য আপনি অন্য কোনও উপায় চাইবেন কেবল কারণ প্রতিটি একক বিভাগের একটি Maybeমূল্য ফেরত পাওয়া ব্যথা হবে ।
অন্য সমস্যাটিতে একাধিক ধরণের ত্রুটি ফিরে আসা (এটি কেবল প্রযোজ্য Either)। ব্যতিক্রম সহ, আপনি একই ফাংশনে কোনও ব্যতিক্রম বিভিন্ন ধরণের নিক্ষেপ করতে পারেন। সাথে Either, আপনি কেবল এক প্রকার পান। এটি উপ-টাইপিং বা এডিটি দিয়ে কন্সট্রাক্টর হিসাবে সমস্ত ধরণের ত্রুটিযুক্ত (যা এই দ্বিতীয় পদ্ধতিটি সাধারণত হাস্কেলের ক্ষেত্রে সাধারণত ব্যবহৃত হয়) দিয়ে পারা যায়।
তবুও, সর্বোপরি, আমি Maybe/ Eitherপদ্ধতির পছন্দ করি কারণ আমি এটিকে সহজ এবং আরও নমনীয় মনে করি।
OpenFile()নিক্ষেপ করতে পারেন FileNotFoundবা NoPermissionবা TooManyDescriptorsইত্যাদি কোনটি এই তথ্য বহন করে না।if None return Noneস্টাইলের প্রচুর বিবরণ ছাড়াই খুব সহজেই স্ট্যাকের তথ্য প্রেরণ করতে দেয় ।সর্বাধিক গুরুত্বপূর্ণ বিষয়, একটি ব্যতিক্রম এবং একটি মোনাদ বিভিন্ন উদ্দেশ্য থাকতে পারে - একটি ব্যতিক্রম একটি সমস্যা বোঝাতে ব্যবহৃত হয়, এবং সম্ভবত না হয়।
"নার্স, 5 রুমে যদি কোনও রোগী থাকে, আপনি কি তাকে অপেক্ষা করতে বলতে পারেন?"
("যদি" লক্ষ্য করুন - এর অর্থ ডাক্তার সম্ভবত মোনাদ আশা করছেন )
Noneমানগুলি কেবল প্রচার করা যায়)। আপনার পঞ্চম বিন্দুটি কেবল এক প্রকারের সঠিক ... প্রশ্নটি হল: কোন পরিস্থিতিটি স্পষ্টতই ব্যতিক্রমী? এটি সক্রিয় হিসাবে ... অনেক না ।
bindএমনভাবে লিখতে পারেন যে পরীক্ষার জন্য Noneকোনও সিনট্যাকটিক ওভারহেড ব্যয় হয় না। একটি খুব সাধারণ উদাহরণ, সি # Nullableঅপারেটরদের যথাযথভাবে ওভারলোড করে । Noneপ্রকারটি ব্যবহার করার পরেও প্রয়োজনীয় পরীক্ষা করার দরকার নেই । অবশ্যই চেকটি এখনও সম্পন্ন হয়েছে (এটি নিরাপদ প্রকারের), তবে পর্দার আড়ালে রয়েছে এবং আপনার কোডটিকে বিশৃঙ্খলা করবে না। (5) আমার আপত্তি সম্পর্কে আপনার আপত্তিতে কিছুটা একই অর্থে প্রযোজ্য তবে আমি সম্মত হই যে এটি সর্বদা প্রযোজ্য নাও হতে পারে।
Maybeমোনাড হিসাবে চিকিত্সার পুরো বিষয়টি হ'ল প্রচারকে Noneনিখুঁতভাবে তৈরি করা। এর অর্থ এই যে আপনি Noneপ্রদত্ত ফিরিয়ে দিতে চান None, আপনাকে কোনও বিশেষ কোড লিখতে হবে না। আপনি যদি বিশেষ কিছু করতে চান তবে আপনাকে কেবলমাত্র মিলানোর প্রয়োজন None। আপনার কখনও if None then Noneবাছাই বাছাইয়ের দরকার নেই ।
null (যেমন if Nothing then Nothing) নিখরচায় পরীক্ষা করতে পারেন কারণ Maybeএটি একটি মোনাড। এটি বাইন্ডের সংজ্ঞা ( >>=) এর জন্য এনকোডযুক্ত Maybe।
Either) ঠিক ঠিক মতো আচরণ করে Maybe। দুজনের মধ্যে স্যুইচিং করা আসলে বরং সহজ কারণ Maybeসত্যই এটির একটি বিশেষ ঘটনা Either। (হাস্কেল-তে, আপনি Maybeযেমনটি ভাবতে পারেন Either ())
"হতে পারে" ব্যতিক্রমগুলির জন্য প্রতিস্থাপন নয়। ব্যতিক্রমগুলি ব্যতিক্রমী ক্ষেত্রে ব্যবহৃত হতে বোঝানো হয় (উদাহরণস্বরূপ: একটি ডিবি সংযোগ খোলার এবং এটি হওয়া উচিত যদিও ডিবি সার্ভার নেই)। "হতে পারে" এমন একটি পরিস্থিতি মডেলিংয়ের জন্য যখন আপনার বৈধ মান থাকতে পারে বা নাও থাকতে পারে; বলুন যে আপনি কোনও চাবির জন্য অভিধান থেকে একটি মূল্য পেয়ে যাচ্ছেন: এটি উপস্থিত থাকতে পারে বা নাও হতে পারে - এর ফলাফলগুলির মধ্যে কোনও "ব্যতিক্রমী" কিছুই নেই।
আমি টিখনের জবাব দ্বিতীয়, কিন্তু আমি মনে করি একটি খুব গুরুত্বপূর্ণ ব্যবহারিক বিন্দু যে সবাই অনুপস্থিত:
Eitherপ্রক্রিয়া আদৌ থ্রেড করতে মিলিত হয় না।তাই আমরা আজকাল বাস্তব জীবনে যা দেখছি তা হ'ল অনেকগুলি অ্যাসিনক্রোনাস প্রোগ্রামিং সলিউশন Eitherত্রুটি পরিচালনার স্টাইলের একটি রূপ গ্রহণ করে । জাভাস্ক্রিপ্ট প্রতিশ্রুতি বিবেচনা করুন , এই লিঙ্কগুলির যে কোনওটিতে বিশদ হিসাবে:
প্রতিশ্রুতিগুলির ধারণা আপনাকে এ জাতীয় অ্যাসিক্রোনাস কোডটি লিখতে দেয় (শেষ লিঙ্ক থেকে নেওয়া):
var greetingPromise = sayHello();
greetingPromise
.then(addExclamation)
.then(function (greeting) {
console.log(greeting); // 'hello world!!!!’
}, function(error) {
console.error('uh oh: ', error); // 'uh oh: something bad happened’
});
মূলত, প্রতিশ্রুতি এমন একটি বস্তু যা:
মূলত, যেহেতু একাধিক থ্রেড জুড়ে আপনার গণনাটি ঘটে তখন ভাষার আদি ব্যতিক্রম সমর্থনটি কার্যকর হয় না, সুতরাং প্রতিশ্রুতি বাস্তবায়নের ক্ষেত্রে একটি ত্রুটি-পরিচালনা ব্যবস্থা প্রদান করতে হবে, এবং এগুলি হ্যাস্কেলের Maybe/ Eitherপ্রকারের মতো সান্দ্র হতে পারে ।
হাস্কেল টাইপ সিস্টেমে ব্যবহারকারীকে একটি সম্ভাবনার স্বীকৃতি জানাতে হবে Nothing, যদিও প্রোগ্রামিং ভাষাগুলি প্রায়শই ব্যতিক্রম ধরা পড়ে না। এর অর্থ হ'ল সংকলনকালে আমরা জানব যে ব্যবহারকারী কোনও ত্রুটির জন্য পরীক্ষা করেছে।
throws NPEপ্রত্যেকটি স্বাক্ষর এবং catch(...) {throw ...} প্রতিটি একক পদ্ধতিতে একটি সংযুক্ত করতে হবে। তবে আমি বিশ্বাস করি যে একই রকম অর্থে চেক করার জন্য বাজার রয়েছে যেমন: হতে পারে: অকার্যকরতা alচ্ছিক এবং টাইপ সিস্টেমে ট্র্যাক।
সম্ভবত মোনাড মূলত মূলধারার ভাষার "নাল মানে ত্রুটি" পরীক্ষা করা (যা নালটি পরীক্ষা করার প্রয়োজন হয় তা বাদ দিয়ে) ব্যবহার করার মতো এবং এটির মূলত একই সুবিধা এবং অসুবিধা রয়েছে।
Maybeলেখা দ্বারা সংখ্যার a + b ছাড়া জন্য চেক করতে হবে None, এবং এর ফলে আবার একটি ঐচ্ছিক মান।
Maybe টাইপ , কিন্তু ব্যবহার Maybeএকটি একসংখ্যা যেমন সিনট্যাক্স চিনি যে প্রকাশ অনুমতি দেয় আরো অনেক এইরূপ সূচারূভাবে নাল পর যুক্তিবিজ্ঞান যোগ করা হয়েছে।
ব্যতিক্রম হ্যান্ডলিং ফ্যাক্টরিং এবং টেস্টিংয়ের জন্য সত্যিকারের ব্যথা হতে পারে। আমি জানি পাইথন সিঁটেক্সের সাথে দুর্দান্ত "উইথ" সরবরাহ করে যা আপনাকে কঠোর "চেষ্টা করুন ... ধরা" ব্লক ব্যতীত ব্যতিক্রমগুলিকে ফাঁদে ফেলতে দেয়। তবে জাভাতে, উদাহরণস্বরূপ, ক্যাচ ব্লকগুলি বড়, বয়লারপ্লেট, হয় ভার্বোস বা চূড়ান্ত ভার্বোস এবং বিরতিতে শক্ত। তার উপরে, জাভা চেক করা বনাম, চেক করা ব্যতিক্রমগুলির চারপাশে সমস্ত গোলমাল যুক্ত করে।
পরিবর্তে, যদি আপনার মোনাড ব্যতিক্রমগুলি ধরে ফেলে এবং এগুলিকে একজাতীয় স্থানের সম্পত্তি হিসাবে বিবেচনা করে (কিছু প্রক্রিয়াজাতকরণের পরিবর্তে) তবে আপনি যে স্থানটিতে নিক্ষেপ করেন বা ধরেন না কেন আপনি সেই স্থানটিতে মিশ্রিত এবং ফাংশনগুলি মেলাতে পারবেন।
যদি আরও ভাল হয় তবে আপনার মোনাড এমন পরিস্থিতিতে বাধা দেয় যেখানে ব্যতিক্রমগুলি ঘটতে পারে (যেমন নাল চেক করতে পারে সম্ভবত), যদি ... তবে চেষ্টা করার চেয়ে পরীক্ষার চেয়ে আরও বেশি ফ্যাক্টর এবং টেস্ট করা সহজ ...
আমি যা দেখেছি সেখান থেকে প্রতিটি ফাংশন প্রত্যাবর্তন করে (উত্তর, ত্রুটি) নির্দিষ্ট করে একই ধরণের পন্থা নিচ্ছে। এটি একটি মোনাডে ফাংশনটি "উত্তোলন" হিসাবে সমান, যেখানে মূল উত্তর ধরণের একটি ত্রুটির ইঙ্গিত দিয়ে সজ্জিত করা হয়, এবং কার্যকরভাবে পার্শ্ব-পদক্ষেপ নিক্ষেপ এবং ব্যতিক্রমী ধরা।