Sostituzione di Liskov
Lezione 24 di 28 del corso Codice pulito - Scrivi codice migliore con Python di Coddy.
"Le funzioni che usano puntatori o riferimenti alle classi base devono poter utilizzare oggetti delle classi derivate senza saperlo."
Questo principio afferma che una classe figlia deve poter essere sostituita alla sua classe genitore.
Per esempio,
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}')Come puoi vedere, sia SMS sia Email ereditano da Notification, ma una invia a email e l'altra a phone: la classe SMS non può sostituire la sua classe genitore Notification!
Sfida
MedioCorreggi il codice dato per applicare il principio di sostituzione di Liskov -
- la funzione notify dovrebbe ricevere solo message come argomento.
- Email e SMS dovrebbero avere ciascuna un costruttore che inizializzi rispettivamente email e phone.
- modifica il codice per applicare i cambiamenti
Questa è solo una possibile soluzione per applicare il principio di Liskov; ce ne sono altre che funzionano!
Provalo tu
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)
Tutte le lezioni di Codice pulito - Scrivi codice migliore con Python
Esercitati da solo: Compilatore Python online