Inversion of Control and Dependency Injection

এই বস্তুটা গত কয়েক বছরে বেশি আলোচিত জিনিস ছিল এবং এখনো আছে। একদম নতুন যারা তাদের এই জিনিসটা বুঝতে অনেক অসুবিধা হয়। কিন্তু জিনিসটা খুব বেশি কঠিন না। সহজ কথায় বলি, আমারা যখন এপ্লিক্যাশান বানাই, কোডে অনেক অনেক অবজেক্ট তৈরি(instantiate) করতে হয়। এই কাজটা আমরা নিজেরা করে থাকি। কিন্তু যদি ব্যপারটা এমন হয়, আমরা শুধু কি টাইপ অবজেক্ট হবে তা বলে দেবো অর্থাৎ অবজেক্টের বর্ণনা দেবো, কিন্তু ক্রিয়েট করবো না, অন্য একটা বস্তু অবজেক্ট গুলো ক্রিয়েট করে দিবে প্রয়োজনের সময়। এই অন্য-বস্তুটিকে নাম দেই কনটেইনার। এই কন্টেইনার এর মধ্যে আমাদের অবজেক্ট গুলোর বর্ণনা রেখে দেবো, সে সুযোগ বুঝে, যখন যা দরকার নিজের মতো ক্রিয়েট করে নেবে। আমারা আমাদের এপ্লিকেশানে বিভিন্ন সার্ভিস এবং কম্পোনেন্ট গুলো সরাসরি কানেক্ট করবো না, বরং আমরা একটা কনফিগারেশন ফাইলে লিখে রাখবো কি কি কম্পোনেন্ট আর কি কি সার্ভিস লাগবে, এগুলো কেমন ইত্যাদি। আমাদের কনটেইনার যখন যে সার্ভিস এবং কম্পোনেন্ট লাগবে নিজেই কানেক্ট করে নিবে।  এইযে কন্ট্রোলটা আমরা একটা কনটেইনারের হাতে দিয়ে দিলাম, এই প্রক্রিয়াটাকে ইনভার্সন অব কন্ট্রোল বলে। ডিপেনডেন্সি ইনজেকশান তাহলে কি? উদাহরণ দেই, মনে করি, আমার একটা ক্লাস আছে, তার নাম ইউজার ডাও। ইউজারডাও অবজেক্টটি যখন কাজ করবে তখন তার ডাটাবেইজ এর কানেকশান লাগবে। এখন এই কানেকশানটি আমরা সাধারণত ইউজারডাও এর মধ্যে ক্রিয়েট করে রাখি। এই ইউজারডাও এ ডাটাবেইস কানেকশান একটি রিসোর্স বা ডিপেনডেন্সি। কারণ এ ছাড়া ইউজারডাও কাজ করবে না। এখন যদি আমরা ইউজারডাও এর মধ্যে কানেকশানটি তৈরি না করি, তাহলে কোনভাবে কানেকশানটি ইউজারডাও এর মধ্যে ঢুকিয়ে দিতে হবে। আমরা ইনভার্সন অব কন্ট্রোল যদি ব্যবহার করি, তাহলে আমরা  ইউজার ডাওটি এমন ভাবে লিখবো যে এর ভেতরে ঢুকিয়ে দেওয়ার একটা উপায় থাকে এবং এই ঢুকিয়ে দেওয়ার কাজটি করবে আমাদের কনটেইনার। তাহলে আমরা দেখলাম কানেকশান অবজেক্ট আমরা নিজেরা ক্রিয়েট না করে, তার ভেতর ঢুকিয়ে দিতে চাইছি, তারমানে এই কানেকশানটি ইউজারডাও এর ভেতরে ক্রিয়েট না করে বাইরে করছি এবং তারপর ইনজেক্ট করেছি। আগেই বলেছি এই কাজ করবে কনটেইনার, আমাদের চিন্তার কিছু নেই। এই যে বাইরে থেকে আমরা ডিপেনডেন্সি ইনজেক্ট করলাম, এই জন্য এই প্রক্রিয়াটাকে ডিপেনডেন্সি ইনজেকশান ও বলে। সুতরাং ইনভার্সন অব কন্ট্রোল এবং ডিপেনডেন্সি ইনজেকশান মূলত একি ব্যপার হলো। আসলে একি, কিন্তু তারপরেও যে সূক্ষ্ম পার্থক্যটি থাকে সেটি হলো, আমরা ইনভার্সন অব কন্ট্রোল achieve করতে চাই, আর এটি করতে হলে আমদের ডিপেনডেন্সি ইনজেক্ট করতে হয়।

এর বেশ কিছু সুবিধা আছে । এটি আমাদের অনেক কোড লেখা থেকে বাঁচিয়ে দেয়। যেহেতু আমাদের আইওসি(IOC) কনটেইনার আছে সুতরাং কিভাবে সার্ভিস কম্পোনেন্ট ক্রিয়েট হবে তা নিয়ে চিন্তা করতে হয় না। এবং খুব সহজেই ঝামেলা-ঝক্কি একটি কনফিগারেশন ফাইল এডিট করে আমরা নতুন একটা সার্ভিস এড করতে পারি। এতে যেহেতু সব কম্পোনেন্ট আলাদা আলাদা থাকে সুতরাং কোড আরও বেশি টেস্টএবল হয় এবং এতে করে সহজেই লুজ কাপলিং achieve করা যায়।

Inversion of Control and Dependency Injection: Part 2

 

Advertisements

5 Comments

  1. ভালো লেখা 🙂
    জিনিষটা সুডো কোড দিয়ে বুঝালে মনে হয় আরেকটু বুঝতে সুবিধা হবে।

    1. কোড দেওয়ার কথা চিন্তা করছিলাম… আচ্ছা দেবো, আমি চিন্তা করছিলাম niniject or Pico container or google-guice দিয়ে একটা প্রজেক্ট করবো। পরে দেবো, মাথায় আছে।

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s