Задать вопрос
@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()
  • Вопрос задан
  • 137 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
vt4a2h
@vt4a2h
Senior software engineer (C++/Qt/boost)
Тут есть проблема: во втором примере оба класса наследника абсолютно одинаковые. Т.е. пример ничего не показывает.

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

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

Похожие вопросы
от 200 000 до 300 000 ₽
Greenway Global Новосибирск
от 150 000 ₽
Akronix Санкт-Петербург
от 150 000 до 200 000 ₽
31 янв. 2025, в 09:57
250000 руб./за проект
31 янв. 2025, в 09:18
10000 руб./за проект
31 янв. 2025, в 08:29
1000 руб./в час