Podstawienie Liskov
Lekcja 24 z 28 w kursie Czysty kod — pisz lepszy kod w Pythonie w Coddy.
„Funkcje, które używają wskaźników lub referencji do klas bazowych, muszą móc korzystać z obiektów klas pochodnych bez wiedzy o tym.”
Ta zasada mówi, że klasa potomna musi być zastępowalna przez swoją klasę nadrzędną.
Na przykład:
class Notification(ABC):
@abstractmethod
def notify(self, message, email):
pass
class Email(Notification):
def notify(self, message, email):
print(f'Send {message} to {email}')
class SMS(Notification):
def notify(self, message, phone):
print(f'Send {message} to {phone}')Jak widać, zarówno SMS, jak i Email dziedziczą po Notification, ale jedna wysyła wiadomość na email, a druga na phone. Klasa SMS nie jest zastępowalna przez swoją klasę nadrzędną Notification!
Wyzwanie
ŚredniPopraw podany kod, aby zastosować zasadę podstawienia Liskov -
- funkcja notify powinna przyjmować tylko argument message.
- klasy Email i SMS powinny mieć konstruktory, które będą inicjować odpowiednio email i phone.
- edytuj kod, aby wprowadzić zmiany
To tylko jedno z proponowanych rozwiązań wykorzystujących zasadę Liskov — istnieje więcej działających rozwiązań!
Spróbuj swoich sił
from abc import ABC, abstractmethod
class Notification(ABC):
@abstractmethod
def notify(self, message, email):
pass
class Email(Notification):
def notify(self, message, email):
print(f'Send {message} to {email}')
class SMS(Notification):
def notify(self, message, phone):
print(f'Send {message} to {phone}')
if __name__ == '__main__':
email = input()
phone = input()
message = input()
notification1 = Email()
notification2 = SMS()
notification1.notify(message, email)
notification2.notify(message, phone)
Wszystkie lekcje w sekcji Czysty kod — pisz lepszy kod w Pythonie
Poćwicz samodzielnie: Kompilator Python online