Возможно ли улучшить пример ISP? Написал код, иллюстрирующий принцип разделения интерфейсов(ISP). Скажите, всё ли понятно и наглядно получилось? Возможно ли его улучшить? Вот неправильный пример, здесь рабочий имеет возможность увеличивать себе зарплату:from abc import ABCMeta, abstractmethod class Person(metaclass=ABCMeta): def __init__(self, pay): self.pay = pay @abstractmethod def getPay(self): pass @abstractmethod def setPay(self): pass class Boss(Person): def getPay(self): print('i am boss. my pay is: ', self.pay) def setPay(self, pay): self.pay = pay class Worker(Person): def getPay(self): print('i am worker. my pay is: ', self.pay) def setPay(self, pay): self.pay = pay boss = Boss(100) boss.getPay() boss.setPay(120) boss.getPay() worker = Worker(10) worker.getPay() worker.setPay(20) worker.getPay() А вот правильный пример. Здесь рабочий не имеет возможности увеличивать себе зарплату потому что его класс реализует только соответствующий статусу интерфейс, а не все какие есть:from abc import ABCMeta, abstractmethod class Person(metaclass=ABCMeta): def __init__(self, pay): self.pay = pay @abstractmethod def getPay(self): pass class Person_(metaclass=ABCMeta): @abstractmethod def setPay(self): pass class Boss(Person, Person_): def getPay(self): print('i am boss. my pay is: ', self.pay) def setPay(self, pay): self.pay = pay class Worker(Person): def getPay(self): print('i am worker. my pay is: ', self.pay) boss = Boss(100) boss.getPay() boss.setPay(120) boss.getPay() worker = Worker(10) worker.getPay() worker.setPay(20) # error worker.getPay() Я пытался максимально сократить и упростить код примеров, но чтобы при этом не пострадала понятность материала. Получилось ли? Возможно, я сам не до конца понимаю принцип ISP. И объяснять кому-то ещё будет рановато...
Оба ваши примера демонстрируют принцип разделения интерфейсов (ISP) достаточно наглядно. В первом примере у класса Worker были не нужные методы, которые нарушали принцип ISP, а во втором примере вы разделили интерфейсы на два отдельных класса, что сделало структуру более явной и правильной.
Однако, возможно улучшить немного код, чтобы сделать его более понятным. Вместо использования двух разных классов интерфейсов, можно добавить абстрактные классы для каждого метода интерфейса:
from abc import ABCMeta, abstractmethod
class Payable(metaclass=ABCMeta): @abstractmethod def getPay(self): pass
class SettablePay(metaclass=ABCMeta): @abstractmethod def setPay(self, pay): pass
class Person(Payable, SettablePay): def init(self, pay): self.pay = pay
class Boss(Person): def getPay(self): print('I am boss. My pay is: ', self.pay)
Оба ваши примера демонстрируют принцип разделения интерфейсов (ISP) достаточно наглядно. В первом примере у класса Worker были не нужные методы, которые нарушали принцип ISP, а во втором примере вы разделили интерфейсы на два отдельных класса, что сделало структуру более явной и правильной.
Однако, возможно улучшить немного код, чтобы сделать его более понятным. Вместо использования двух разных классов интерфейсов, можно добавить абстрактные классы для каждого метода интерфейса:
from abc import ABCMeta, abstractmethod
class Payable(metaclass=ABCMeta):
@abstractmethod
def getPay(self):
pass
class SettablePay(metaclass=ABCMeta):
@abstractmethod
def setPay(self, pay):
pass
class Person(Payable, SettablePay):
def init(self, pay):
self.pay = pay
class Boss(Person):
def setPay(self, pay):def getPay(self):
print('I am boss. My pay is: ', self.pay)
self.pay = pay
class Worker(Person):
def getPay(self):
print('I am worker. My pay is: ', self.pay)
boss = Boss(100)
boss.getPay()
boss.setPay(120)
boss.getPay()
worker = Worker(10)
worker.getPay()
worker.setPay(20)
worker.getPay()
Этот код делает структуру более явной и помогает лучше понять, какие именно методы принадлежат к каждому интерфейсу.