আপনি যদি এড়াতে পারেন তবে তা ব্যবহার করবেন না। কোনও বিকল্প ধরণ, একটি টিপল বা ডেডিকেটেড সমষ্টি প্রকার ফেরত ফ্যাক্টরি ফাংশন ব্যবহার করুন। অন্য কথায়, কোনও গ্যারান্টিযুক্ত-না-না-মান-খেলাপী মান থেকে আলাদা ধরণের একটি সম্ভাব্য-খেলাপি মান উপস্থাপন করুন।
প্রথমে দেশটির তালিকা তৈরি করা যাক এরপরে আমরা কীভাবে কয়েকটি ভাষায় এটি প্রকাশ করতে পারি সে সম্পর্কে ভাবুন (সি ++, ওক্যামেল, পাইথন)
- সংকলনের সময় কোনও ডিফল্ট অবজেক্টের অযাচিত ব্যবহার ধরা।
- কোডটি পড়ার সময় প্রদত্ত মানটি সম্ভাব্য-খেলাপি আছে কিনা তা সুস্পষ্ট করুন।
- আমাদের বুদ্ধিমান ডিফল্ট মান চয়ন করুন, যদি প্রযোজ্য হয়, প্রতি টাইপ একবার । অবশ্যই প্রতিটি কল সাইটে একটি সম্ভাব্য ভিন্ন ডিফল্ট চয়ন করবেন না ।
- স্থিতিশীল বিশ্লেষণ সরঞ্জামগুলি বা কোনও মানুষের
grep
পক্ষে সম্ভাব্য ভুলগুলির জন্য অনুসন্ধান করা সহজ করে দিন।
- কিছু অ্যাপ্লিকেশনের জন্য , অপ্রত্যাশিতভাবে একটি ডিফল্ট মান দেওয়া হলে প্রোগ্রামটি স্বাভাবিকভাবে চলতে হবে। অন্যান্য অ্যাপ্লিকেশনগুলির জন্য , আদর্শভাবে তথ্যমূলক উপায়ে কোনও ডিফল্ট মান দেওয়া হলে প্রোগ্রামটি তত্ক্ষণাত থামানো উচিত।
আমি মনে করি নাল অবজেক্ট প্যাটার্ন এবং নাল পয়েন্টারগুলির মধ্যে উত্তেজনা (5) থেকে এসেছে। আমরা যদি প্রাথমিক পর্যায়ে ত্রুটিগুলি সনাক্ত করতে পারি তবে, (5) মোট হয়ে যায়।
আসুন ভাষা দ্বারা এই ভাষাটি বিবেচনা করুন:
সি ++
আমার মতে, একটি সি ++ শ্রেণি সাধারণত ডিফল্ট-গঠনমূলক হওয়া উচিত কারণ এটি গ্রন্থাগারগুলির সাথে মিথস্ক্রিয়া সহজ করে এবং পাত্রে ক্লাসটি ব্যবহার করা আরও সহজ করে তোলে। এটি উত্তরাধিকারকেও সহজতর করে যেহেতু কোন সুপারক্লাস নির্মাণকারীকে কল করতে হবে তা ভেবে দেখার দরকার নেই।
তবে এর অর্থ MyClass
হ'ল ধরণের মান "ডিফল্ট অবস্থায়" আছে কিনা তা আপনি নিশ্চিতভাবে জানতে পারবেন না। bool nonempty
রানটাইমে ডিফল্ট-নেস পৃষ্ঠের উপর কোনও অনুরূপ ক্ষেত্র স্থাপনের পাশাপাশি, আপনি সবচেয়ে ভাল যা করতে পারেন তা হল এমন MyClass
কোনও উপায়ে নতুন উদাহরণ তৈরি করা যা ব্যবহারকারীকে এটি পরীক্ষা করতে বাধ্য করে ।
আমি একটি ফ্যাক্টরি ফাংশন ব্যবহার করার পরামর্শ দেব যা সম্ভব হলে কোনও std::optional<MyClass>
, std::pair<bool, MyClass>
বা একটি-আর-রেফারেন্স দেয় std::unique_ptr<MyClass>
।
যদি আপনি চান কারখানার ফাংশনটি কোনও ধরণের "প্লেসহোল্ডার" রাজ্যকে একটি ডিফল্ট-নির্মিত-নির্ধারিত থেকে পৃথক MyClass
করতে চায় তবে একটি ব্যবহার করুন std::pair
এবং আপনার ফাংশনটি এটি করে যে ডকুমেন্ট করতে ভুলবেন না।
যদি কারখানার ফাংশনটির একটি অনন্য নাম থাকে grep
তবে নামটির পক্ষে এটি সহজ এবং opালু সন্ধান করুন। যাইহোক, grep
প্রোগ্রামার কারখানার ফাংশনটি ব্যবহার করা উচিত ছিল তবে সে ক্ষেত্রে এটি করা কঠিন ।
OCaml
আপনি যদি ওসিএএমএল এর মতো ভাষা ব্যবহার করে থাকেন তবে আপনি কেবল একটি option
প্রকার (ওসিএএমএল স্ট্যান্ডার্ড লাইব্রেরিতে) বা একটি either
প্রকার (স্ট্যান্ডার্ড লাইব্রেরিতে নয়, তবে নিজের নিজস্ব রোল করা সহজ) ব্যবহার করতে পারেন। বা একটি defaultable
প্রকার (আমি শব্দটি তৈরি করছি defaultable
)।
type 'a option =
| None
| Some of 'a
type ('a, 'b) either =
| Left of 'a
| Right of 'b
type 'a defaultable =
| Default of 'a
| Real of 'a
একটি defaultable
কারণ ব্যবহারকারী আবশ্যক প্যাটার্ন ম্যাচ বের করে আনতে উপরে দেখানো একজোড়া বেশী ভালো 'a
কেবল যুগল প্রথম উপাদান উপেক্ষা করতে পারেন না।
defaultable
উপরের মত উল্লিখিত ধরণের সমতুল্য std::variant
একই ধরণের দুটি উদাহরণ সহ সি ++ এ ব্যবহার করা যেতে পারে std::variant
তবে উভয় প্রকারের মত একই থাকলে এপিআইয়ের অংশগুলি ব্যবহারযোগ্য নয়। std::variant
এটির ধরণের নির্মাতারা নামবিহীন হওয়ায় এটি একটি অদ্ভুত ব্যবহার ।
পাইথন
পাইথনের জন্য আপনি কোনও কম্পাইল-টাইম চেকিং পাবেন না। তবে, গতিশীলভাবে টাইপ করা হচ্ছে, সাধারণত এমন পরিস্থিতি হয় না যেখানে সংকলকটি প্ল্যাকেট করার জন্য আপনার কোনও ধরণের স্থানধারক উদাহরণ প্রয়োজন।
আপনি যখন কোনও ডিফল্ট উদাহরণ তৈরি করতে বাধ্য হন তখন আমি কেবল একটি ব্যতিক্রম ছুঁড়ে ফেলার পরামর্শ দেব।
যদি তা গ্রহণযোগ্য না হয় তবে আমি প্রস্তাব দিচ্ছি যে এটি একটি DefaultedMyClass
উত্তরাধিকার সূত্রে তৈরি হোক MyClass
এবং এটি আপনার কারখানার ফাংশন থেকে ফিরে আসবে। এটি আপনার প্রয়োজন হলে ডিফল্ট উদাহরণগুলিতে কার্যকারিতা "স্টাব্বিং" এর ক্ষেত্রে আপনাকে নমনীয়তা ক্রয় করে।