@zlodiak

Возможно ли улучшить пример LSP?

Попытался написать код, иллюстрирующий Принцип Подстановки Лисков(LSP). Скажите пожалуйста, достаточно ли наглядно получилось, можно ли улучшить пример?

Сначала привожу пример неправильного кода. Допустим существует класс Clock, у которого есть метод для вывода времени в unix-формате. Как видите, программист во втором инстансе переопределил содержимое этого метода. при этом пользователь класса не ожидает нового поведения. Это пример нарушения LSP.

#!/usr/bin/env python3

from abc import ABCMeta, abstractmethod
import time
import datetime

class Clock(metaclass=ABCMeta):
  @abstractmethod
  def displayUnix(self):
    pass

class Clock1(Clock):
  def displayUnix(self):
    print('i am display UNIX: ', time.time())

class Clock2(Clock):
  def displayUnix(self):
    print('but i am display ISO: ', datetime.datetime.now().isoformat())    

clock1 = Clock1()
clock1.displayUnix()

clock2 = Clock2()
clock2.displayUnix()


Далее привожу код, который исправляет эту возможную ситуацию. Он полностью соответствует LSP:

#!/usr/bin/env python3

from abc import ABCMeta, abstractmethod
import time
import datetime

class Clock(metaclass=ABCMeta):
  @abstractmethod
  def displayUnix(self):
    pass

class Clock_(metaclass=ABCMeta):
  @abstractmethod
  def displayIso(self):
    pass

class Clock1(Clock, Clock_):
  def displayUnix(self):
    print('i am display UNIX: ', time.time())

  def displayIso(self):
    print('i am display ISO: ', datetime.datetime.now().isoformat())     

class Clock2(Clock, Clock_):
  def displayUnix(self):
    print('i am display UNIX: ', time.time())

  def displayIso(self):
    print('i am display ISO: ', datetime.datetime.now().isoformat())      

clock1 = Clock1()
clock1.displayUnix()
clock1.displayIso()

clock2 = Clock2()
clock2.displayUnix()
clock2.displayIso()
  • Вопрос задан
  • 135 просмотров
Пригласить эксперта
Ответы на вопрос 2
vt4a2h
@vt4a2h
Senior software engineer (C++/Qt/boost)
Тут есть проблема: во втором примере оба класса наследника абсолютно одинаковые. Т.е. пример ничего не показывает.

Хорошим примером неправильного использования будет когда, например, один наследник кидает исключение, а другой нет. Ну и правильного, когда это не так. Ну или там усиление precondition покажите. Можете ещё показать проблему с бросанием разных типов исключений.
Ответ написан
Комментировать
@MechanicZelenyy
Пример не очень, так как во втором классе метод просто не правильно работает --- ошибки в алгоритме, это не ошибки в проектировании.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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