একাধিক উত্তরাধিকার ভারী ব্যবহারের জন্য ডিজাইন করা কোড থেকে এমন সাধারণ সমস্যাগুলির ধরণগুলি কী কী?
এটি কেবল একটি উদাহরণ তবে একটি আমি সুরক্ষার উন্নতি করতে এবং কলার বা উপশ্রেণী উভয়কেই ক্যাসকেডিং পরিবর্তনগুলি প্রয়োগ করার প্রলোভনগুলি প্রশমিত করতে অমূল্য বলে মনে করি।
যেখানে আমি একাধিক উত্তরাধিকারকে এমনকি সবচেয়ে বিমূর্তের জন্য অবিশ্বাস্যভাবে দরকারী বলে খুঁজে পেয়েছি, স্টেটলেস ইন্টারফেসগুলি হল সি ++ এর নন-ভার্চুয়াল ইন্টারফেস আইডিয়ম (এনভিআই)।
তারা এমনকি সত্যিকারের অ্যাবস্ট্রাক্ট বেস ক্লাসগুলি এতটা ইন্টারফেসের মতো নয় যেগুলি তাদের চুক্তির সার্বজনীন দিকগুলি বাস্তবায়নের জন্য তাদের কাছে প্রয়োগের সামান্য কিছুটা আছে, কারণ তারা চুক্তির সাধারণত্বকে এতটা আরও ভালভাবে প্রয়োগ করার মতো সংকীর্ণ করছে না as ।
সাধারণ উদাহরণ (কেউ কেউ পরীক্ষা করতে পারে যে কোনও ফাইল হ্যান্ডেল পাস হয়েছে তা খোলা আছে বা এরকম কিছু):
// Non-virtual interface (public methods are nonvirtual/final).
// Since these are modeling the concept of "interface", not ABC,
// multiple will often be inherited ("implemented") by a subclass.
class SomeInterface
{
public:
// Pre: x should always be greater than or equal to zero.
void f(int x) /*final*/
{
// Make sure x is actually greater than or equal to zero
// to meet the necessary pre-conditions of this function.
assert(x >= 0);
// Call the overridden function in the subtype.
f_impl(x);
}
protected:
// Overridden by a boatload of subtypes which implement
// this non-virtual interface.
virtual void f_impl(int x) = 0;
};
এই ক্ষেত্রে, সম্ভবত f
কোডবেসে এক হাজার জায়গা দ্বারা ডাকা হয়, যখন f_impl
একশত সাবক্লাস দ্বারা ওভাররাইড করা হয়।
কল করা সমস্ত 1000 জায়গায় f
বা ওভাররাইড করা সমস্ত 100 টি স্থানে এই ধরণের সুরক্ষা চেক করা কঠিন হবে f_impl
।
কার্যকারিতা অ-ভার্চুয়ালকে কেবল এই এন্ট্রি পয়েন্টটি তৈরি করে, এটি আমাকে এই চেকটি সম্পাদন করার জন্য একটি কেন্দ্রীয় জায়গা দেয়। এবং এই চেকটি সামান্যতম মধ্যে বিমূর্তি হ্রাস করছে না, কারণ এটি কেবল এই ফাংশনটি কল করার জন্য প্রয়োজনীয় পূর্বশর্ত জোর দিয়ে দিচ্ছে। এক অর্থে, এটি যুক্তিযুক্তভাবে ইন্টারফেসের সরবরাহিত চুক্তিটিকে শক্তিশালী করছে এবং x
এটি ওভাররাইড করে এমন 100 টি স্থানে বৈধ পূর্বশর্ত মেনে চলছে কিনা তা নিশ্চিত করার জন্য ইনপুটটি পরীক্ষা করার বোঝা থেকে মুক্তি পাচ্ছে ।
এটি এমন একটি জিনিস যা আমি চাই প্রতিটি ভাষারই ছিল এবং ইচ্ছাও ছিল, এমনকি সি ++ তেও যে এটি স্থানীয় ধারণা থেকে কিছুটা বেশি ছিল (যেমন: আমাদের ওভাররাইডের জন্য পৃথক ফাংশন সংজ্ঞায়নের প্রয়োজন হয় না)।
এটি অত্যন্ত কার্যকর যদি আপনি এই কাজটি আগে থেকে না করেন assert
এবং বুঝতে পেরেছিলেন যে পরে কোডবেজে কিছু এলোমেলো জায়গাগুলি নেতিবাচক মানগুলির সাথে সংঘটিত হচ্ছে f
।