Substitution de Liskov
Leçon 24 sur 28 du cours Clean Code - Écrire un meilleur code avec Python de Coddy.
"Les fonctions qui utilisent des pointeurs ou des références à des classes de base doivent pouvoir utiliser des objets de classes dérivées sans le savoir."
Ce principe stipule qu'une classe enfant doit pouvoir être substituée à sa classe parente.
Par exemple,
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}')Comme vous pouvez le voir, SMS et Email héritent tous deux de Notification, mais l'un envoie à email et l'autre à phone, la classe SMS n'est pas substituable à sa parente Notification !
Défi
MoyenCorrigez le code donné pour appliquer le principe de substitution de Liskov -
- la fonction notify ne doit recevoir que message comme argument.
- Email et SMS doivent chacun avoir un constructeur qui initialisera email et phone en conséquence.
- modifiez le code pour appliquer les changements
Ceci n'est qu'une solution suggérée pour appliquer le principe de Liskov, il en existe d'autres qui fonctionneront !
Essayez vous-même
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)