python-basic

⌘K
  1. Home
  2. python-basic
  3. OOP
  4. Dependency Inversion Principle (DIP)

Dependency Inversion Principle (DIP)

গল্প:

একটা ছোট শহরে ছিল সারা এবং তার বন্ধু জীবন। সারা খুব ভালো রাঁধুনী এবং সে সব সময় তার রান্নার জন্য নতুন নতুন রেসিপি খুঁজত। জীবন ছিল একজন লেখক, এবং সে সারার রেসিপিগুলো নিয়ে বই লেখার পরিকল্পনা করছিল।

সারা একটি বিশেষ রেসিপি তৈরি করে ফেললো, কিন্তু তাকে খুব দ্রুত একটা কুক বইয়ে লেখার জন্য সেই রেসিপিটি জীবনের কাছে দিতে হলো। সারা যখন জীবনের কাছে রেসিপিটি দিলো, তখন জীবন বলল, “আমি তো রান্নার কাজ জানি না, আমি এটা কিভাবে লিখব?”

এখন, সারা চিন্তা করতে লাগলো, “কিভাবে জীবনকে রেসিপি লেখায় সাহায্য করা যায়, যাতে সে রান্নার বিষয়ে কোনো ধারণা না থাকলেও রেসিপিটি লিখতে পারে?”

সে তখন ভাবল, “আমার উচিত হবে আমার রেসিপিগুলোকে এমনভাবে উপস্থাপন করা, যাতে জীবন তার নিজের মতো করে এগুলো ব্যবহার করতে পারে।”

তাহলে সারা তার রেসিপিগুলোকে এমনভাবে তৈরি করলো যাতে শুধু উপকরণ ও পরিমাণ উল্লেখ থাকে, এবং রান্নার প্রক্রিয়া আলাদাভাবে দিতে পারে। এর ফলে, জীবন সহজেই রেসিপি লিখতে পারলো।

এই গল্প থেকে আমরা কী শিখলাম?

এই গল্পটা “Dependency Inversion Principle (DIP)” এর উদাহরণ।

DIP বলে, উচ্চ স্তরের মডিউলগুলোকে নিম্ন স্তরের মডিউলগুলোর উপর নির্ভর না করে, উভয়কেই একটি অভ্যন্তরীণ ইন্টারফেসের মাধ্যমে সংযুক্ত করা উচিত। অর্থাৎ, আমাদের মূল কোড (উচ্চ স্তরের) এবং বাইরের উপাদান (নিম্ন স্তরের) আলাদা করতে হবে, যাতে উভয়টা স্বাধীনভাবে কাজ করতে পারে।

উদাহরণ

ধরি, আমাদের একটি রান্নার ক্লাস আছে, যেখানে সারা রান্নার কাজ করে:

class Recipe:
    def cook(self):
        return "Cooking recipe"

এখন, যদি জীবন রান্নার কাজের জন্য সরাসরি Recipe ক্লাসের উপর নির্ভর করে, তাহলে তা DIP এর বিরুদ্ধে।

DIP অনুসারে আমাদের কোড হবে:

আমরা একটি ইন্টারফেস তৈরি করবো এবং সারাকে এবং জীবনের কাজকে আলাদা করবো:

class CookingInterface:
    def cook(self):
        pass


class Recipe(CookingInterface):
    def cook(self):
        return "Cooking recipe"


class Chef:
    def __init__(self, recipe: CookingInterface):
        self.recipe = recipe

    def prepare(self):
        return self.recipe.cook()

এখন, জীবন সরাসরি Recipe ক্লাসের উপর নির্ভর না করে, বরং CookingInterface এর মাধ্যমে রান্না করছে।

এখন জীবন সহজেই নতুন রেসিপি যোগ করতে পারবে, কারণ সে শুধু নতুন Recipe ক্লাস তৈরি করবে এবং সেই ক্লাসকে Chef ক্লাসে ব্যবহার করবে।

সুবিধা:

  • স্বাধীনতা: উচ্চ স্তরের ক্লাস নিম্ন স্তরের ক্লাসের পরিবর্তে ইন্টারফেসের উপর নির্ভর করে, ফলে পরিবর্তন করা সহজ।
  • সাবালকতা: যখন নতুন ক্লাস যোগ করতে হবে, তখন পুরোনো কোডে কোনো পরিবর্তন করার প্রয়োজন হবে না।
  • পরিবর্তনশীলতা: নতুন রান্নার ক্লাস তৈরি করলেই পুরোনো ব্যবস্থায় কোনো সমস্যা হবে না, এবং সিস্টেম সহজে সম্প্রসারিত হতে পারে।

এভাবে Dependency Inversion Principle (DIP) আমাদের কোডকে আরও মজবুত এবং পরিবর্তনশীল করে তোলে।

How can we help?