Возможно ли улучшить пример 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()

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

Действительно, пример улучшен. Теперь у нас есть два интерфейса Clock и Clock_, которые имплементируют два разных метода displayUnix и displayIso. Классы Clock1 и Clock2 теперь наследуются от обоих интерфейсов и имплементируют нужные методы. Это позволяет избежать ситуации, когда один класс переопределяет метод другого класса, нарушая LSP.

Однако, можно еще дополнительно улучшить пример, разделив интерфейсы на два разных класса вместо объединения их в один. Такой подход будет более гибким и позволит иметь различные реализации для разных методов. Также стоит добавить проверку в коде на имплементацию всех методов интерфейсов в классах, чтобы избежать ошибок.

Таким образом, можно считать, что пример в целом наглядно иллюстрирует Принцип Подстановки Лисков и можно его считать удачным.

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