• 4 heures
  • Facile

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 30/10/2024

« I » pour Interface Segregation, le principe de ségrégation des interfaces

Si vous vous sentez à l'aise avec le principe de la responsabilité unique, le principe de ségrégation des interfaces vous semblera évident. C'est la même logique, appliquée aux interfaces : 

Vous pouvez rencontrer les mêmes difficultés avec les interfaces qu'avec les classes. Vous ajoutez une nouvelle tâche (méthode) à une interface existante, plutôt que d'en créer une nouvelle. Conséquence : désormais, toutes les classes d'implémentation doivent prendre en compte cette nouvelle méthode.

Conserver des interfaces de taille réduite et de conception simple permet de réduire le couplage. Le couplage fait référence au degré de connexion entre deux éléments logiciels. Plus une interface définit d'éléments, plus une classe qui l’implémente devra faire de même. Cela rend cette classe moins facilement réutilisable.

Appliquez le principe de ségrégation des interfaces à votre code

Puisque vous souhaitez implémenter une GUI pour la vue, vous pouvez extraire une interface avec laquelle le contrôleur doit interagir. Pour cela, récupérez les méthodes actuellement situées dans la vue, et placez-les dans une nouvelle interface appelée GameViewable :

public interface GameViewable {

    void setController(GameController controller);

    void promptForPlayerName();

    void showPlayerName(int playerIndex, String name);

    void showFaceDownCardForPlayer(int playerIndex, String name);

    void promptForFlip();

    void showCardForPlayer(int playerIndex, String name, String rank, String suit);

    void showWinner (String winnerName);

    void promptForNewGame();

}

Ensuite, la vue CommandLineView implémente tout simplement les méthodes ! :soleil:

Ceci dit, il est facile d'ajouter des responsabilités à une interface alors qu'elles ne devraient pas y être. Dans ce cas, l'interface va perdre sa cohésion. Par exemple, notre GameViewable traite des commandes envoyées par le contrôleur à la vue (suite à une séparation MVC correcte). Si vous vouliez ajouter une commande pour quitter le jeu, il serait tentant de conclure, et ce de manière hâtive, que la vue peut s'en charger :

public interface GameViewable {
    
    // mauvais placement de cette idée
    
    public void restartGame() {
    
        // fait des choses sans qu'on lui demande
        exitGame();
    
    }
    
};

Mais maintenant, l'interface gère une opération sans demande provenant du contrôleur. :'(  Ce concept de quitter le jeu est une fonctionnalité qui devrait se trouver dans la classe GameController, et non dans l'interface GameViewable.

Faites l'expérience vous-même

À votre tour !  Ajoutez la fonctionnalité de fin du jeu (quitter le jeu) à la classe GameController afin de vous conformer au principe de ségrégation des interfaces. Pour la solution, consultez la vidéo ci-dessous.

Récapitulons !

  • La ségrégation des interfaces est le principe de responsabilité pour les interfaces.

  • Il s'agit d'un principe facile à enfreindre. La tentation consiste à ajouter une nouvelle méthode à une interface existante, car celle-ci existe déjà.

  • En cas de doute, il vaut mieux avoir deux interfaces présentant un nombre limité de méthodes à implémenter, plutôt qu'une seule disposant de nombreuses responsabilités.

Dans le chapitre suivant, nous veillerons à ce que nos implémentations de bas niveau ne pilotent pas les implémentations de niveau supérieur ! 

Exemple de certificat de réussite
Exemple de certificat de réussite