আপনার উদাহরণগুলি ইতিমধ্যে দেখায় যে, এই জাতীয় প্রতিটি ক্ষেত্রে পৃথকভাবে মূল্যায়ন করতে হবে এবং "ব্যতিক্রমী পরিস্থিতি" এবং "প্রবাহ নিয়ন্ত্রণ" এর মধ্যে ধূসর বর্ণের বর্ণালী রয়েছে, বিশেষত যদি আপনার পদ্ধতিটি পুনরায় ব্যবহারযোগ্য হিসাবে চিহ্নিত করা হয়, এবং এটি বেশ কয়েকটি ভিন্ন ধরণে ব্যবহৃত হতে পারে মূলত এটির জন্য ডিজাইন করা ছিল না। "অ-ব্যতিক্রমী" এর অর্থ কী তা নিয়ে আমাদের সবার একমত হওয়ার আশা এখানে করবেন না, বিশেষত যদি আপনি তা অবিলম্বে এটি প্রয়োগ করার জন্য "ব্যতিক্রম" ব্যবহারের সম্ভাবনাটি নিয়ে আলোচনা করেন।
কোডটি পড়ার এবং বজায় রাখার জন্য কী নকশাকে সহজতর করে তোলে আমরা তাতেও একমত হতে পারি না, তবে আমি ধরে নেব যে গ্রন্থাগারের ডিজাইনারের এটির একটি স্পষ্ট ব্যক্তিগত দৃষ্টিভঙ্গি রয়েছে এবং কেবল জড়িত অন্যান্য বিবেচনার তুলনায় এটির ভারসাম্য বজায় রাখা দরকার।
সংক্ষিপ্ত উত্তর
আপনি বেশ দ্রুততর পদ্ধতিগুলি ডিজাইন করার সময় এবং অপ্রত্যাশিত পুনরায় ব্যবহারের সম্ভাবনা আশা করা ব্যতীত আপনার অন্ত্রের অনুভূতিগুলি অনুসরণ করুন।
দীর্ঘ উত্তর
প্রতিটি ভবিষ্যতের কলার অবিচ্ছিন্নভাবে ত্রুটি কোড এবং ব্যতিক্রমগুলির মধ্যে যেমনটি উভয় দিকেই ইচ্ছে মতো অনুবাদ করতে পারে; এটি দুটি নকশাকে কার্যকারিতা, ডিবাগার-বন্ধুত্ব এবং কিছু সীমাবদ্ধ আন্তঃব্যবহারযোগ্যতা প্রসঙ্গ ব্যতীত প্রায় সমতুল্য করে তোলে। এটি সাধারণত পারফরম্যান্সে ফোটে, সুতরাং আসুন এতে মনোযোগ দিন।
থাম্বের নিয়ম হিসাবে, আশা করুন যে একটি ব্যতিক্রম ছোঁড়া নিয়মিত প্রত্যাবর্তনের চেয়ে 200x ধীর হয় (বাস্তবে, এর মধ্যে একটি উল্লেখযোগ্য বৈকল্পিক রয়েছে)।
থাম্বের অন্য নিয়ম হিসাবে, একটি ব্যতিক্রম নিক্ষেপ করা প্রায়শই যাদু মানগুলির ক্রুডেস্টের সাথে তুলনা করে অনেক ক্লিনার কোডকে মঞ্জুরি দিতে পারে, কারণ আপনি প্রোগ্রামারটির উপর নির্ভর করে ত্রুটি কোডটিকে অন্য একটি ত্রুটি কোডের সাথে অনুবাদ করেন না, কারণ এটি ক্লায়েন্ট কোডের একাধিক স্তরগুলির দিকে ভ্রমণ করে একটি বিন্দু যেখানে এটি নিয়মিত এবং পর্যাপ্ত উপায়ে পরিচালনা করার জন্য যথেষ্ট প্রসঙ্গ রয়েছে context (বিশেষ ক্ষেত্রে: null
অন্য যাদু মানগুলির তুলনায় এখানে আরও ভাল দামের ঝোঁক থাকে কারণ NullReferenceException
কিছু ত্রুটির ক্ষেত্রে স্বয়ংক্রিয়ভাবে নিজেকে অনুবাদ করার প্রবণতার কারণে সাধারণত ত্রুটিগুলির উত্সের খুব কাছাকাছি নয়, সাধারণত, তবে সবসময় নয় not )
তাহলে পাঠ কি?
কোনও অ্যাপ্লিকেশনটির (যেমন অ্যাপ্লিকেশন সূচনাকরণের) জীবদ্দশায় মাত্র কয়েকবার কল করা ফাংশনটির জন্য, এমন কোনও কিছু ব্যবহার করুন যা আপনাকে ক্লিনার, কোড বুঝতে সহজতর করে। পারফরম্যান্স উদ্বেগের বিষয় হতে পারে না।
নিক্ষেপ ফাংশনের জন্য এমন কোনও কিছু ব্যবহার করুন যা আপনাকে ক্লিনার কোড দেয়। তারপরে কিছু প্রোফাইলিং করুন (যদি প্রয়োজন হয় তবে) যদি তারা পরিমাপ বা সামগ্রিক প্রোগ্রাম কাঠামোর উপর ভিত্তি করে সন্দেহযুক্ত শীর্ষ বাধাগুলির মধ্যে থাকে তবে কোডগুলি ফেরত দেওয়ার ব্যতিক্রমগুলি পরিবর্তন করুন।
ব্যয়বহুল পুনরায় ব্যবহারযোগ্য ফাংশনের জন্য, এমন কোনও কিছু ব্যবহার করুন যা আপনাকে ক্লিনার কোড দেয়। আপনার যদি মূলত সর্বদা কোনও নেটওয়ার্ক রাউন্ডট্রিপটি কাটাতে হয় বা একটি অন ডিস্ক এক্সএমএল ফাইল বিশ্লেষণ করতে হয় তবে ব্যতিক্রম ছোঁড়ার ওভারহেড সম্ভবত নগণ্য। অতিরিক্ত ব্যর্থতার সাথে "অ-ব্যতিক্রমী ব্যর্থতা" থেকে ফিরে আসার চেয়ে দুর্ঘটনাক্রমে কোনও ব্যর্থতার বিবরণ না হারানো আরও গুরুত্বপূর্ণ।
একটি দুর্বল পুনরায় ব্যবহারযোগ্য ফাংশনটির জন্য আরও চিন্তাভাবনা প্রয়োজন। নিযুক্ত ব্যতিক্রম করে, আপনি হয় অত্যাচার কলারের যারা তাদের (অনেক) কল অর্ধেক উপর ব্যতিক্রম দেখতে পাবেন, যদি ফাংশন শরীরের খুব দ্রুত executes উপর মন্দীভূত একটি 100 বার ভালো কিছু। ব্যতিক্রমগুলি এখনও একটি নকশার বিকল্প, তবে কলারদের জন্য আপনাকে স্বল্প ওভারহেড বিকল্প সরবরাহ করতে হবে যারা এটি বহন করতে পারে না। আসুন একটি উদাহরণ তাকান।
আপনি Dictionary<,>.Item
আলগাভাবে কথা বলার পরে, নেট .1 1.1 এবং .NET 2.0 এর মধ্যে ফেরা null
মানগুলিতে পরিবর্তিত হয়ে এর দুর্দান্ত উদাহরণটি তালিকাভুক্ত করেন KeyNotFoundException
(কেবলমাত্র যদি আপনি এর Hashtable.Item
ব্যবহারিক অ-জেনেরিক অগ্রদূত হিসাবে বিবেচনা করতে চান তবেই )। এই "পরিবর্তন" এর কারণটি এখানে আগ্রহ ছাড়াই নেই। মান ধরণের পারফরম্যান্স অপ্টিমাইজেশন (আর বক্সিং নয়) আসল যাদু মানকে ( null
) একটি অ-বিকল্প হিসাবে তৈরি করেছে; out
প্যারামিটারগুলি পারফরম্যান্স ব্যয়ের একটি ছোট্ট অংশ আনবে। এই পরবর্তী কর্মক্ষমতা বিবেচনাটি একটি নিক্ষেপ করার ওভারহেডের সাথে তুলনায় সম্পূর্ণ নগণ্যKeyNotFoundException
, তবে ব্যতিক্রমের নকশাটি এখানে আরও উন্নত। কেন?
- রেফ / আউট প্যারামিটারগুলি প্রতিবার ব্যয় করে, কেবলমাত্র "ব্যর্থতা" ক্ষেত্রে নয়
- যে কেউ যত্ন
Contains
করে তা সূচককে কল করার আগে কল করতে পারে এবং এই প্যাটার্নটি সম্পূর্ণ প্রাকৃতিকভাবে পড়ে। যদি কোনও বিকাশকারী ফোন করতে চান তবে কল করতে ভুলে যায় Contains
, কোনও পারফরম্যান্সের সমস্যা ক্রাইপ করতে পারে না; KeyNotFoundException
লক্ষ্য করা এবং স্থির করতে যথেষ্ট জোরে।