Возможно ли улучшить пример 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
230 +2
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 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 493 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир