Temps estimé: 15 minutes
Exercices préparatoires IV
Question 1
Identifier le(s) principe(s) SOLID violé(s) par le code ci-dessous
class HuntDog:
def fetchDucks(ducks: Duck[]):
...
// start runnning after each duck and try to grab it
...
class DuckHunt:
def startGame(dog: HuntDog, ducks: Duck[]):
print("Ducks in the wild:")
for each duck in ducks:
duck.display()
duck.fly()
fetchedDucks = dog.fetchDucks(ducks)
print("Fetched ducks:")
for each duck in fetchedDucks:
duck.quack()
duck.display()
abstract class Duck:
def abstract display
def quack():
print("quach")
def fly():
print("fly")
class WildDuck extends Duck:
def display():
print("Wild Duck")
class DirtyDuck extends Duck:
def display():
print("Dirty Duck")
def override quack():
print("burppppp")
class CityDuck extends Duck:
def display():
print("City Duck")
class RubberDuck extends Duck:
def display():
print("Rubber Duck")
def override fly():
throw NotImplementedError("Rubber Duck can't fly")
☑️ Solution
Il y a un problème de LSP dans la classe RubberDuck
Question 2
Dans vos mots, expliquer ce principe et décrivez ce qu'il nous permet de valider
☑️ Solution
- Loi de protection du polymorphisme (ou protection des plugins)
- partout où un client attend un type de base, on ne doit pas écrire les enfants de manière à ce que ça nous empêcherait de substituer T par n'importe lequel
- un client qui attend un type T ne doit pas être obligé de savoir qu'il existe ou pas des enfants de T
- Liskov nous permet de savoir lorsqu'une relation d'héritage est justifiée est valable entre différentes classes
Question 3
Proposer une solution afin de régler les violations détectées et qui permettrait de maintenir la relation d'héritage entre les différents canards
☑️ Solution
- C'est impossible.
- Si tu as un système qui représente des canards, c'est correct, mais il n'y a pas de chasse.
- Si tu as un système de chasse, alors le rubberduck n'a pas d'affaire là dedans et/ou l'interface Duck ne devrait pas exister.
- Du point de vu d'un système de chasse, il n'y a pas de rubberduck, tous les canards doivent savoir voler.
- Souvent avec le LSP, la réponse est "il ne devrait juste pas avoir d'abstraction entre les deux.
- Les canards à chasser c'est une chose et les rubber ducks c'est une autre, pas d'héritage.
Question 4
Expliquer le lien qui existe entre le LSP et la composition
☑️ Solution
Les violations du LSP seront souvent causées par une tentative maladroite d'utiliser l'héritage pour éviter la duplication de code
Il est donc préférable d'utiliser la composition pour arriver au même résultat sans tous les problèmes reliés aux violations du LSP
Voir: Composition over inheritance