Возможно ли улучшить пример 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. И объяснять кому-то ещё будет рановато...

21 Авг 2019 в 06:58
256 +1
0
Ответы
1

Оба ваши примера демонстрируют принцип разделения интерфейсов (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)

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)
worker.getPay()

Этот код делает структуру более явной и помогает лучше понять, какие именно методы принадлежат к каждому интерфейсу.

20 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир