বলুন আমার একটি শ্রেণি রয়েছে Foobarযা ব্যবহার করে (নির্ভর করে) Widget। ভাল Widgetওল' -এর দিনগুলিতে, ওলিউডকে ক্ষেত্র হিসাবে ঘোষণা করা যেতে পারে Foobar, বা পলিমারফিক আচরণ প্রয়োজন হলে স্মার্ট পয়েন্টার হিসাবে ঘোষণা করা যেতে পারে, এবং এটি নির্মাণকারীতে শুরু করা হবে:
class Foobar {
Widget widget;
public:
Foobar() : widget(blah blah blah) {}
// or
std::unique_ptr<Widget> widget;
public:
Foobar() : widget(std::make_unique<Widget>(blah blah blah)) {}
(…)
};
এবং আমরা সব প্রস্তুত এবং সম্পন্ন করা চাই। দুর্ভাগ্যক্রমে, আজ জাভা বাচ্চারা এটি দেখার পরে এবং ঠিকই এটি দম্পতিরা Foobarএবং Widgetএকসাথে দেখে হাসবে will সমাধানটি আপাতদৃষ্টিতে সহজ: Foobarক্লাসের বাইরে নির্ভরতা নির্মাণের জন্য নির্ভরতা ইনজেকশন প্রয়োগ করুন । তবে তারপরে, সি ++ আমাদের নির্ভরতাগুলির মালিকানা সম্পর্কে চিন্তা করতে বাধ্য করে। তিনটি সমাধান মাথায় আসে:
অনন্য পয়েন্টার
class Foobar {
std::unique_ptr<Widget> widget;
public:
Foobar(std::unique_ptr<Widget> &&w) : widget(w) {}
(…)
}
FoobarWidgetএটির একমাত্র মালিকানা দাবি করা হয়েছে। এর নিম্নলিখিত সুবিধা রয়েছে:
- পারফরম্যান্সের উপর প্রভাব নগণ্য।
- এটি নিরাপদ, যেমনটি
Foobarআজীবন নিয়ন্ত্রণ করেWidget, তাই এটি নিশ্চিত করে তোলে যেWidgetহঠাৎ অদৃশ্য হয়ে যাবে না। - এটি নিরাপদ যা
Widgetফাঁস হবে না এবং যখন প্রয়োজন হবে না তখন সঠিকভাবে ধ্বংস হয়ে যাবে।
তবে, এটি ব্যয় করে আসে:
- এটি কীভাবে
Widgetদৃষ্টান্তগুলি ব্যবহার করা যায় তার উপর বিধিনিষেধ স্থাপন করে , যেমন কোনও স্ট্যাক-বরাদ্দWidgetsব্যবহার করা যায় না,Widgetভাগ করা যায় না।
ভাগ করা পয়েন্টার
class Foobar {
std::shared_ptr<Widget> widget;
public:
Foobar(const std::shared_ptr<Widget> &w) : widget(w) {}
(…)
}
এটি সম্ভবত নিকটতম সমতুল্য ও জাভা এবং অন্যান্য আবর্জনা সংগ্রহ করা ভাষা। সুবিধাদি:
- আরও সার্বজনীন, কারণ এটি ভাগ করে নেওয়ার নির্ভরতা।
- সমাধানের সুরক্ষা (পয়েন্ট 2 এবং 3) বজায় রাখে
unique_ptr।
অসুবিধা:
- কোনও ভাগীকরণ জড়িত না হলে সম্পদ অপচয় করে।
- তবুও গাদা বরাদ্দ প্রয়োজন এবং স্ট্যাক-বরাদ্দ বস্তুগুলি নিষ্ক্রিয় করে।
সরল ওল 'পর্যবেক্ষণ পয়েন্টার
class Foobar {
Widget *widget;
public:
Foobar(Widget *w) : widget(w) {}
(…)
}
শ্রেণীর ভিতরে কাঁচা পয়েন্টার রাখুন এবং মালিকানার বোঝা অন্য কারও কাছে স্থানান্তর করুন। পেশাদাররা:
- এটি পেতে পারেন হিসাবে সহজ।
- সর্বজনীন, কেবল যে কোনও গ্রহণ করে
Widget।
কনস:
- আর নিরাপদ নয়।
- অন্য সত্তা উভয় মালিকানা জন্য দায়ী প্রবর্তন
FoobarএবংWidget।
কিছু ক্রেজি টেম্পলেট রূপান্তরকারী
কেবলমাত্র আমি যে সুবিধাটি ভাবতে পারি তা হ'ল আমি আমার সমস্ত সফটওয়্যার ফুটে উঠার সময় খুঁজে পেলাম না books সমস্ত বই পড়তে;
আমি তৃতীয় সমাধানের দিকে ঝুঁকেছি, কারণ এটি সর্বজনীন, কিছু কিছু হলেও পরিচালিত Foobarsকরতে হয়, তাই পরিচালন Widgetsকরা সহজ পরিবর্তন। তবে, কাঁচা পয়েন্টার ব্যবহার করা আমাকে বিরক্ত করে, অন্যদিকে স্মার্ট পয়েন্টার সমাধানটি আমার কাছে ভুল অনুভব করে, কারণ তারা নির্ভরতার গ্রাহককে সেই নির্ভরতা কীভাবে তৈরি করা হয় তা সীমাবদ্ধ করে দেয়।
আমি কিছু অনুপস্থিত করছি? অথবা সি ++ তে কেবল নির্ভরতা ইনজেকশন তুচ্ছ নয়? শ্রেণীর নিজস্ব নির্ভরতা থাকা উচিত বা কেবল সেগুলি পর্যবেক্ষণ করা উচিত?
Foobarএকমাত্র মালিক? পুরানো ক্ষেত্রে এটি সহজ। তবে ডিআই-র সমস্যাটি যেমনটি আমি দেখছি, এটি নির্ভরশীলতা তৈরির ফলে শ্রেণিকে যেমন হ্রাস করে, তেমনি এগুলি নির্ভরতাগুলির মালিকানা থেকেও decouples (যেমন মালিকানা নির্মাণের সাথে আবদ্ধ)। জাভা হিসাবে জঞ্জাল সংগ্রহ করা পরিবেশে, এটি কোনও সমস্যা নয়। সি ++ এ, এটি।
std::unique_ptrহল উপায়। আপনিstd::move()কোনও সংস্থার মালিকানা উচ্চ শ্রেণি থেকে শ্রেণিতে স্থানান্তর করতে ব্যবহার করতে পারেন ।