GLO-4002 - Site du cours 2023

Temps estimé: 15 minutes

Introduction au TDA

Mise en contexte

Reprenons le code de l'exercice sur l'application de rencontre vu lors de la semaine 2:

public class Phone {

    private final DatingApp datingApp;

    public Phone(DatingApp datingApp) {
        this.datingApp = datingApp;
    }

    public void swipeRight() {
        datingApp.swipeRight();
    }

    public String swipeLeft() throws Exception {
        if (!datingApp.canSwipeLeft()) {
            throw new Exception("User no swiping!");
        }

        return "General Kenobi";
    }
}
public class DatingApp {

    private boolean hasSwipedRight = false;

    public void swipeRight() {
        hasSwipedRight = true;
    }

    public boolean canSwipeLeft() {
        return this.hasSwipedRight;
    }
}

Exercice

Après réflexion, ce n'est pas le téléphone qui devrait répondre "General Kenobi", c'est la responsabilité de l'application de rencontre! Corrigez cette erreur en déléguant l'action de "swiper" vers la gauche à la classe "DatingApp".

public class Phone {

    private final DatingApp datingApp;

    public Phone(DatingApp datingApp) {
        this.datingApp = datingApp;
    }

    public void swipeRight() {
        datingApp.swipeRight();
    }

    public String swipeLeft() throws Exception {
        return datingApp.swipeLeft();
    }
}
public class DatingApp {

    private boolean hasSwipedRight = false;

    public void swipeRight() {
        hasSwipedRight = true;
    }

    // La méthode "canSwipeLeft" est supprimée car elle ne sert plus à rien.

    // La vérification du "canSwipeLeft a été déplacée dans l'application de rencontre car c'est elle qui a l'information.
    public String swipeLeft() throws Exception {
        if (!this.hasSwipedRight) {
            throw new Exception("User no swiping!");
        }

        return "General Kenobi";
    }
}

L'important ici est de comprendre que ce n'est pas la responsabilité du téléphone de gérer le "canSwipeLeft" de l'application, car ça crée des va-et-viens inutiles entre les deux classes:

  • Phone: Demande à l'application si elle peut "swiper" vers la gauche.
  • DatingApp: Répond "oui" ou "non".
  • Phone: Si oui, demande à l'application de "swiper" vers la gauche.
  • DatingApp: "Swipe" vers la gauche.

En d'autres mots, on prend à l'extérieur de la classe DatingApp une décision en lien avec son état interne.

Réflexion

Comme défi supplémentaire, remplacer les "mocks-à-bras" par Mockito et assurez-vous que tous les tests passent encore!

Voici les tests attendus:

  • Phone : delegate swipe right.
  • Phone: delegate swipe left.
  • App : swipe right then left.
  • App : swipe left only.

Les tests qui ne sont plus nécessaires:

  • Phone : if can't swipe left.
  • Phone : if can swipe left.
  • App : swipe right then can swipe left.
  • App: cannot swipe left.

Notez que le nombre de test requis à diminué. C'est souvent ça qui arrive lorsqu'on respecte le TDA.