GLO-4002 - Site du cours 2023

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")

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

  • 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

  • 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

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