@zlodiak

Возможно ли улучшить пример 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. И объяснять кому-то ещё будет рановато...
  • Вопрос задан
  • 159 просмотров
Пригласить эксперта
Ответы на вопрос 2
longclaps
@longclaps
Возможно, питон - самый неподходящий язык для всякой фигни, завязанной на инкапсуляции. Ничто не мешает сделать так
worker.pay = 100500
или так
Boss.setPay(worker, 100500)
или даже так
worker = Worker(10)
worker.getPay()
worker.__class__.setPay = Boss.setPay #  мутим
worker.setPay(100500)                 #  мутим
del worker.__class__.setPay           #  мутим
worker.getPay()
worker.setPay(20)                     #  я не при делах!
worker.getPay()

Потуги это обойти - как шлагбаум в чистом поле )
Ответ написан
@MechanicZelenyy
Заменить Person_ на более походящее по смыслу.

Использовать property.

Использовать что-нибудь со статической типизацией.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы