|
| 1 | +# ডিপেন্ডেন্সি ইনজেকশন ডিজাইন প্যাটার্নঃ |
| 2 | + |
| 3 | +ডিপেন্ডেন্সি ইনজেকশন স্ট্রাকচারাল ডিজাইন প্যাটার্নের মধ্যে পরে। এইটা এমন একটা ডিজাইন প্যাটার্ন যা কোন ক্লাসের ডিপেন্ডেন্সি অর্থাৎ প্রয়োজনীয় অবজেক্ট গুলোকে রান টাইম কিংবা কম্পাইল টাইমে সহজে পরিবর্তনে সহায়তা করে। |
| 4 | + |
| 5 | +এই প্যাটার্নের মূল উদ্দেশ্যই হল লুজলি কাপল আর্কিটেকচার ইমপ্লিমেন্ট করা যাতে করে একটা ভাল মানের অ্যাপ তৈরি করা যায়। |
| 6 | + |
| 7 | +ডিপেন্ডেন্সি ইনজেকশন ডিজাইন প্যাটার্ন হল ```S.O.L.I.D Principle``` এর ```D``` যার পূর্ণ অর্থ ```Dependency Inversion Principle (DIP)``` যেটি ```Inversion of Control (IoC)``` কে অনুসরণ করে। |
| 8 | + |
| 9 | +এখানে ```Dependency Inversion Principle``` বলতে ```Decoupling``` করাকে বুঝানো হয় আর ```Inversion of Control``` বলতে কিভাবে ডিপেন্ডেন্সি রিজল্ভ করা হবে সেটিকে বুঝায়। ডিপেন্ডেন্সি রিজল্ভ করতে ```Dependency Injection (DI) Container``` বা ```Inversion of Control (IoC) Container``` ব্যাবহৃত হয়ে থাকে। |
| 10 | + |
| 11 | +আমরা সাধারণত একটি ক্লাসে অন্য ক্লাসের অবজেক্ট ব্যাবহার করলে নিচের মত করে হার্ডকোড করি যা হাইলি কাপল্ড থাকে। |
| 12 | + |
| 13 | +```php |
| 14 | +class Database |
| 15 | +{ |
| 16 | + protected $adapter; |
| 17 | + |
| 18 | + public function __construct() |
| 19 | + { |
| 20 | + $this->adapter = new MySqlAdapter; |
| 21 | + } |
| 22 | +} |
| 23 | + |
| 24 | +class MysqlAdapter |
| 25 | +{ |
| 26 | + |
| 27 | +} |
| 28 | +``` |
| 29 | + |
| 30 | +আর ডিপেন্ডেন্সি ইনজেকশন ডিজাইন প্যাটার্নে কোন ক্লাস কিংবা ইন্টারফেইসকে টাইপ হিন্ট করে কনস্ট্রাক্টর কিংবা মেথডে ইঞ্জেক্ট করতে হয় নিচের মত করে। |
| 31 | + |
| 32 | +```php |
| 33 | +class Database |
| 34 | +{ |
| 35 | + protected $adapter; |
| 36 | + |
| 37 | + public function __construct(MySqlAdapter $adapter) |
| 38 | + { |
| 39 | + $this->adapter = $adapter; |
| 40 | + } |
| 41 | +} |
| 42 | + |
| 43 | +class MysqlAdapter |
| 44 | +{ |
| 45 | + |
| 46 | +} |
| 47 | +``` |
| 48 | + |
| 49 | +উপরে ```MySqlAdapter``` ক্লাসকে ডিপেন্ডেন্সি হিসেবে রাখা হয়েছে। আর এই ডিপেন্ডেন্সি রিজল্ভ করতে হলে অবশ্যই ```MySqlAdapter``` এর অবজেক্ট কন্সট্রাক্টরের প্যারামিটারে দিতে হবে। |
| 50 | + |
| 51 | +যেমনঃ |
| 52 | +```php |
| 53 | +$mysqlAdapter = new MysqlAdapter; |
| 54 | +$database = new Database($mysqlAdapter); |
| 55 | +``` |
| 56 | + |
| 57 | +ডিপেন্ডেন্সি প্রধানত তিন ভাবে ইনজেক্ট করা যায়। |
| 58 | + |
| 59 | +## ১. কন্সট্রাক্টর ইনজেকশনঃ |
| 60 | +যা কনস্ট্রাক্টরের মাধ্যমে ইঞ্জেক্ট করা হয়। |
| 61 | + |
| 62 | +```php |
| 63 | +public function __construct(MySqlAdapter $adapter) |
| 64 | +{ |
| 65 | + $this->adapter = $adapter; |
| 66 | +} |
| 67 | +``` |
| 68 | + |
| 69 | +## ২. সেটার ইনজেকশনঃ |
| 70 | +যা কোন মেথডের প্যারামিটারে ইঞ্জেক্ট করা হয়। |
| 71 | + |
| 72 | +```php |
| 73 | +public function setterMethod(MySqlAdapter $adapter) |
| 74 | +{ |
| 75 | + $this->adapter = $adapter; |
| 76 | +} |
| 77 | +``` |
| 78 | + |
| 79 | +## ৩. ইন্টারফেইস ইনজেকশনঃ |
| 80 | +ইন্টারফেইসকে কোন কনস্ট্রাক্টরে অথবা সেটার মেথডে ইঞ্জেক্ট করা হয়। |
| 81 | + |
| 82 | +```php |
| 83 | +public function __construct(AdapterInterface $adapter) |
| 84 | +{ |
| 85 | + $this->adapter = $adapter; |
| 86 | +} |
| 87 | +``` |
| 88 | + |
| 89 | +আমরা আমাদের প্রজেক্টে ডিপেন্ডেন্সি গুলোকে স্বয়ংক্রিয় ভাবে ইঞ্জেক্ট কিংবা রিজল্ভ করতে ডিপেন্ডেন্সি ইনজেকশন কন্টেইনার ব্যাবহার করব যা আগেই উল্লেখ করেছি। |
| 90 | +অনেক ফ্রেমওয়ার্কে এই কন্টেইনার সাধারণত বিল্ট-ইন দেয়া থাকে যেমনঃ ```Symfony```, ```Laravel```, ```Yii``` |
| 91 | + |
| 92 | +আমরা সাধারণ প্রজেক্টের ক্ষেত্রে ```Pimple``` নামে কন্টেইনারটি ব্যাবহার করতে পারি। |
| 93 | +আবার আমি আমার কাজের জন্য খুব সহজ এবং অপ্টিমাইজ একটা কন্টেইনার বানিয়েছিলাম আপনারা চাইলে সেটি দেখতে পারেন [এই লিঙ্ক](https://github.com/appzcoder/container) থেকে। আশাকরি সোর্স কোড ও ডকুমেন্টেশন থেকে আপনারা ভাল ধারণা পাবেন। |
| 94 | + |
| 95 | +এই চ্যাপ্টারের সোর্স কোডটি [এই লিঙ্ক](https://github.com/sohelamin/php-design-patterns) থেকে পাবেন। |
0 commit comments