Til: English O’zbek
Interface Segregation Principle (ISP)
Klientlar o’zlari ishlatmaydigan interfeyslarga bog’liq bo’lmasligi kerak.
Katta, bir butun interfeyslarni kichik va aniq interfeyslarga ajratish lozim. Har bir klass faqat o’ziga tegishli metodlarni implement qilishi kerak.
Diagramma
Noto’g’ri yondashuv
violation.py dagi bitta katta Worker interfeysi uni implement qiluvchi barcha klasslarni work(), eat() va sleep() metodlarini yozishga majbur qiladi:
class Worker(ABC):
@abstractmethod
def work(self) -> str: ...
@abstractmethod
def eat(self) -> str: ...
@abstractmethod
def sleep(self) -> str: ...
Robot ovqatlanmaydi va uxlamaydi, lekin interfeys uni bu metodlarni yozishga majbur qiladi:
class Robot(Worker):
def eat(self) -> str:
raise NotImplementedError("Robots don't eat")
def sleep(self) -> str:
raise NotImplementedError("Robots don't sleep")
To’g’ri yondashuv
correct.py da esa katta interfeys uchta kichik interfeysga ajratilgan:
| Interfeys | Metod |
|---|---|
Workable | work() |
Eatable | eat() |
Sleepable | sleep() |
Har bir klass faqat o’ziga kerakli interfeyslarni implement qiladi:
class Human(Workable, Eatable, Sleepable):
...
class Robot(Workable): # eat() va sleep() talab qilinmaydi
def work(self) -> str:
return f"Robot {self.model} is working"
Faqat ishchi kerak bo’lgan funksiya Workable interfeysini qabul qiladi — keraksiz eat() yoki sleep() metodlariga bog’liq bo’lmaydi.