Попытался написать код, иллюстрирующий Принцип Подстановки Лисков(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()