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 vers 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 class 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 constater, SMS et Email héritent tous deux de Notification, mais l’un envoie vers email et l’autre vers phone ; la class SMS ne peut donc pas être substituée à sa class parente Notification !
Défi
MoyenCorrigez le code fourni afin d’appliquer le principe de substitution de Liskov -
- La fonction notify doit uniquement recevoir message comme argument.
- Email et SMS doivent chacun avoir un constructeur qui initialisera respectivement email et phone.
- modifiez le code pour appliquer ces changements
Il ne s’agit que d’une solution possible pour appliquer le principe de Liskov ; d’autres solutions fonctionneront également !
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)
Toutes les leçons de Clean Code - Écrire un meilleur code avec Python
Entraînez-vous par vous-même : Compilateur Python en ligne