সিলেটলেটস । প্রায় 10-15 বছর আগে, সিলেটলেটগুলি জানার জন্য বড় ডিজাইন-প্যাটার্ন ছিল। যাইহোক, আজকাল তাদের দিকে তাকাতে হয়। এগুলি মাল্টি-থ্রেডে অনেক সহজ, তবে আপনাকে অবশ্যই তাদের ব্যবহার একবারে একটি থ্রেডের মধ্যে সীমাবদ্ধ করতে হবে যা আপনি যা চান তা সর্বদা নয়। লাইফটাইম ট্র্যাক করা বৈশ্বিক ভেরিয়েবলের মতোই কঠিন।
একটি সাধারণ সিঙ্গলটন ক্লাস এর মতো দেখতে পাবেন:
class MyClass
{
private:
static MyClass* _instance;
MyClass() {} //private constructor
public:
static MyClass* getInstance();
void method();
};
...
MyClass* MyClass::_instance = NULL;
MyClass* MyClass::getInstance()
{
if(_instance == NULL)
_instance = new MyClass(); //Not thread-safe version
return _instance;
//Note that _instance is *never* deleted -
//it exists for the entire lifetime of the program!
}
নির্ভরতা ইনজেকশন (ডিআই) । এটি কেবল কনস্ট্রাক্টর প্যারামিটার হিসাবে পরিষেবাটি পাস করার অর্থ। কোনও ক্লাসে পাস করার জন্য একটি পরিষেবা ইতিমধ্যে বিদ্যমান থাকতে হবে, সুতরাং দুটি পরিষেবা একে অপরের উপর নির্ভর করার উপায় নেই; 98% ক্ষেত্রে, আপনি এটি চান (এবং অন্যান্য 2% এর জন্য, আপনি সর্বদা একটি setWhatever()
পদ্ধতি তৈরি করতে পারেন এবং পরে পরিষেবাতে পাস করতে পারেন ) । এ কারণে, ডিআই-র অন্যান্য বিকল্পগুলির মতো একই সংযোগের সমস্যা নেই। এটি মাল্টিথ্রেডিংয়ের সাথে ব্যবহার করা যেতে পারে, কারণ প্রতিটি থ্রেডে প্রতিটি পরিষেবায় কেবল নিজের নিজস্ব দৃষ্টান্ত থাকতে পারে (এবং কেবল এটির ভাগ করে নিতে হবে)। এটি কোডকে ইউনিট-টেস্টেবল করে তোলে, যদি আপনি সে সম্পর্কে যত্নবান হন।
নির্ভরতা ইনজেকশন সহ সমস্যাটি এটি আরও বেশি স্মৃতি গ্রহণ করে; এখন কোনও শ্রেণীর প্রতিটি উদাহরণের জন্য এটি ব্যবহার করা প্রতিটি পরিষেবাদির উল্লেখ প্রয়োজন। এছাড়াও, যখন আপনার অনেকগুলি পরিষেবা থাকে এটি ব্যবহার করতে বিরক্ত হয়; এমন ফ্রেমওয়ার্ক রয়েছে যা অন্যান্য ভাষায় এই সমস্যাটি প্রশমিত করে, তবে সি ++ এর প্রতিবিম্বের অভাবের কারণে সি ++ এ ডিআই ফ্রেমওয়ার্কগুলি কেবল ম্যানুয়ালি না করেই আরও বেশি কাজ করার প্রবণতা রয়েছে।
//Example of dependency injection
class Tower
{
private:
MissileCreationService* _missileCreator;
CreepLocatorService* _creepLocator;
public:
Tower(MissileCreationService*, CreepLocatorService*);
}
//In order to create a tower, the creating-class must also have instances of
// MissileCreationService and CreepLocatorService; thus, if we want to
// add a new service to the Tower constructor, we must add it to the
// constructor of every class which creates a Tower as well!
//This is not a problem in languages like C# and Java, where you can use
// a framework to create an instance and inject automatically.
দেখুন এই পৃষ্ঠার আরেকটি উদাহরণ জন্য (Ninject, একটি সি # দ্বি ফ্রেমওয়ার্ক জন্য নথিপত্র থেকে)।
নির্ভরতা ইনজেকশন হ'ল এই সমস্যার স্বাভাবিক সমাধান এবং এটিই উত্তর যা আপনি স্ট্যাকওভারফ্লো.কম এ এই জাতীয় প্রশ্নগুলিতে সর্বাধিক উত্সাহিত দেখতে পাবেন। ডিআই হ'ল এক ধরণের ইনভার্শন অফ কন্ট্রোল (আইওসি)।
পরিষেবা লোকেটার । মূলত, কেবল একটি শ্রেণি যা প্রতিটি পরিষেবার একটি উদাহরণ রাখে। আপনি এটি প্রতিবিম্ব ব্যবহার করে করতে পারেন বা আপনি যখনই কোনও নতুন পরিষেবা তৈরি করতে চান প্রতিবার এটিতে একটি নতুন উদাহরণ যুক্ত করতে পারেন। আপনার এখনও আগের মতো একই সমস্যা রয়েছে - ক্লাসগুলি কীভাবে এই লোকেটারটি অ্যাক্সেস করতে পারে? - যা উপরের যে কোনও উপায়ে সমাধান করা যেতে পারে, তবে এখন আপনার ServiceLocator
কয়েক ডজন পরিষেবাদি না করে কেবল আপনার ক্লাসের জন্য এটি করা দরকার । আপনি যদি এই ধরণের জিনিসটির বিষয়ে চিন্তা করেন তবে এই পদ্ধতিটিও ইউনিট-টেস্টেবল।
ইনভার্সন অফ কন্ট্রোল (আইওসি) এর অন্য রূপ হ'ল সার্ভিস লোকেটারগুলি। সাধারণত, ফ্রেমওয়ার্কগুলি যা স্বয়ংক্রিয়ভাবে নির্ভরতা ইনজেকশনটি করে সেগুলিতে একটি পরিষেবা লোকেটারও থাকবে।
এক্সএনএ (মাইক্রোসফ্টের সি # গেম প্রোগ্রামিং ফ্রেমওয়ার্ক) এর মধ্যে একটি সার্ভিস লোকেটার অন্তর্ভুক্ত রয়েছে; এটি সম্পর্কে আরও জানতে, এই উত্তরটি দেখুন ।