উত্তর:
ব্যবহার 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
একটি একসংখ্যা যেমন সিনট্যাক্স চিনি যে প্রকাশ অনুমতি দেয় আরো অনেক এইরূপ সূচারূভাবে নাল পর যুক্তিবিজ্ঞান যোগ করা হয়েছে।
ব্যতিক্রম হ্যান্ডলিং ফ্যাক্টরিং এবং টেস্টিংয়ের জন্য সত্যিকারের ব্যথা হতে পারে। আমি জানি পাইথন সিঁটেক্সের সাথে দুর্দান্ত "উইথ" সরবরাহ করে যা আপনাকে কঠোর "চেষ্টা করুন ... ধরা" ব্লক ব্যতীত ব্যতিক্রমগুলিকে ফাঁদে ফেলতে দেয়। তবে জাভাতে, উদাহরণস্বরূপ, ক্যাচ ব্লকগুলি বড়, বয়লারপ্লেট, হয় ভার্বোস বা চূড়ান্ত ভার্বোস এবং বিরতিতে শক্ত। তার উপরে, জাভা চেক করা বনাম, চেক করা ব্যতিক্রমগুলির চারপাশে সমস্ত গোলমাল যুক্ত করে।
পরিবর্তে, যদি আপনার মোনাড ব্যতিক্রমগুলি ধরে ফেলে এবং এগুলিকে একজাতীয় স্থানের সম্পত্তি হিসাবে বিবেচনা করে (কিছু প্রক্রিয়াজাতকরণের পরিবর্তে) তবে আপনি যে স্থানটিতে নিক্ষেপ করেন বা ধরেন না কেন আপনি সেই স্থানটিতে মিশ্রিত এবং ফাংশনগুলি মেলাতে পারবেন।
যদি আরও ভাল হয় তবে আপনার মোনাড এমন পরিস্থিতিতে বাধা দেয় যেখানে ব্যতিক্রমগুলি ঘটতে পারে (যেমন নাল চেক করতে পারে সম্ভবত), যদি ... তবে চেষ্টা করার চেয়ে পরীক্ষার চেয়ে আরও বেশি ফ্যাক্টর এবং টেস্ট করা সহজ ...
আমি যা দেখেছি সেখান থেকে প্রতিটি ফাংশন প্রত্যাবর্তন করে (উত্তর, ত্রুটি) নির্দিষ্ট করে একই ধরণের পন্থা নিচ্ছে। এটি একটি মোনাডে ফাংশনটি "উত্তোলন" হিসাবে সমান, যেখানে মূল উত্তর ধরণের একটি ত্রুটির ইঙ্গিত দিয়ে সজ্জিত করা হয়, এবং কার্যকরভাবে পার্শ্ব-পদক্ষেপ নিক্ষেপ এবং ব্যতিক্রমী ধরা।