python-basic

⌘K
  1. Home
  2. python-basic
  3. OOP
  4. Interface Segregation Principle (ISP)

Interface Segregation Principle (ISP)

গল্প:

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

এবার তারা একসাথে একটা নতুন সার্ভিসের পরিকল্পনা করল, যেখানে গাড়ি, বাইক এবং স্কুটার সবকিছুর জন্য সার্ভিস দেয়া হবে। কিন্তু তারা একটি সমস্যা ফেস করলো: তাদের সার্ভিস কার্ডে এতগুলো কাজ একসাথে যুক্ত করা হচ্ছে, যে অনেক সময় আকাশকে বাইকের কাজ করতে বললে সে সঠিকভাবে করতে পারে না, কারণ তার মেকানিক্যাল সার্ভিস কার্ডে বাইকের কিছু কাজের তথ্য নেই।

আকাশ বলল, “রবিন, আমাদের সার্ভিস কার্ডে আলাদা আলাদা বিভাগের কাজ লিখতে হবে। আমি গাড়ির কাজ জানি, তুমি বাইকের, আর যদি স্কুটারের কোনো কাজ থাকে, তাহলে সেটার জন্য আলাদা বিভাগ তৈরি করতে হবে।”

রবিন রাজি হলো। তারা প্রতিটি কাজের জন্য আলাদা আলাদা সার্ভিস কার্ড তৈরি করলো, এবং এখন তারা শুধু তাদের নিজের কাজের জন্য প্রয়োজনীয় তথ্য পায়।

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

এই গল্পটা “Interface Segregation Principle (ISP)” এর উদাহরণ।

ISP বলে, একটি ক্লাস বা ইন্টারফেসের মধ্যে শুধুমাত্র প্রয়োজনীয় মেথড থাকতে হবে। অর্থাৎ, একটি ক্লাসে বিভিন্ন কাজ না রেখে, প্রয়োজনীয় কাজগুলোর জন্য আলাদা ইন্টারফেস তৈরি করতে হবে, যাতে ক্লাসগুলো নিজের জন্য প্রয়োজনীয় মেথডগুলো ব্যবহার করতে পারে।

প্রোগ্রাম উদাহরণ

ধরা যাক, আমাদের একটি গাড়ির সার্ভিস ইন্টারফেস আছে:

class VehicleService:
    def repair(self):
        pass

    def change_oil(self):
        pass

    def fix_bike(self):
        pass

    def clean(self):
        pass

এখন, যদি কেউ একটি CarService ক্লাস তৈরি করে, তবে তাকে সবগুলো মেথড বাস্তবায়ন করতে হবে, কিন্তু বাইক সার্ভিসের কোনো প্রয়োজন নেই। এটি ISP এর বিরুদ্ধে।

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

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

class CarService:
    def repair(self):
        print("Repairing the car")

    def change_oil(self):
        print("Changing oil for the car")

    def clean(self):
        print("Cleaning the car")


class BikeService:
    def repair(self):
        print("Repairing the bike")

    def fix_bike(self):
        print("Fixing the bike")

    def clean(self):
        print("Cleaning the bike")

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

class ScooterService:
    def repair(self):
        print("Repairing the scooter")

    def clean(self):
        print("Cleaning the scooter")

সুবিধা:

  • ক্লাসগুলো ছোট হয়: প্রত্যেকটি ক্লাসের মাত্র কয়েকটি কাজ থাকে, ফলে তা সহজে বোঝা যায়।
  • সহজ পরিবর্তন: যদি ভবিষ্যতে নতুন সার্ভিস যুক্ত করতে হয়, তখন পুরনো কোডে কোনো পরিবর্তন করার প্রয়োজন নেই।
  • প্রয়োজনীয় মেথড: প্রত্যেকটি ক্লাস তার জন্য প্রয়োজনীয় কাজগুলো বাস্তবায়ন করে, ফলে তা আরও কার্যকরী হয়ে ওঠে।

এভাবেই Interface Segregation Principle (ISP) আমাদের কোডকে আরও পরিষ্কার এবং কার্যকর করে তুলতে সাহায্য করে।

How can we help?