Vous venez de découvrir les principes SOLID.
Pour plonger au cœur du sujet et poser les fondations de notre code, appuyons-nous sur un patron de conception connu et éprouvé, qui applique à merveille les principes SOLID : MVC !
En quoi consiste MVC ?
MVC est un motif d'architecture logicielle. Il scinde les responsabilités du système en trois parties distinctes :
Modèle : le modèle contient les informations (données) utilisées par le système.
Vue : la vue est la façon dont ces informations sont affichées pour l’utilisateur.
Contrôleur : le contrôleur veille à ce que les demandes de l'utilisateur soient correctement exécutées, en modifiant les objets du modèle et en mettant à jour la vue.
Comment cela fonctionne-t-il en pratique ?
Imaginez votre prochain repas dans un restaurant. D'abord, une personne vous accueille à l'entrée et vous demande de patienter jusqu'à ce qu'une table soit disponible. Ensuite, elle vous guide jusqu'à votre siège. Un serveur prend votre commande. Le cuistot prépare la commande en cuisine, le serveur vous l’apporte à votre table et finalement, quelqu’un s'occupe du nettoyage après votre départ. Pour terminer, le plongeur nettoie tous les ustensiles de cuisine et la vaisselle.
Chaque personne a une responsabilité claire dans le déroulement de votre repas. Vous n'avez pas besoin d'interagir avec chaque personne impliquée dans cette organisation. Le plongeur ne sort pas de l'arrière-cuisine pour vous aider à vous installer. Et aucune personne ne doit exécuter à elle seule l’ensemble des tâches.
Sur la base de cet exemple, voici du code Java contraire aux principes SOLID :
class RestaurantWorker {
public void seatPatrons();
public void takeOrder();
public void cookOrder();
public void deliverOrder();
public void cleanTable();
public void washDishes();
};
Ce code propose qu’un seul objet (RestaurantWorker
) effectue tout le travail. Arghh !
SOLID nous préconise de répartir les responsabilités. Le motif modèle-vue-contrôleur (MVC) décrit cette répartition. Il s'agit de la base de l'architecture de votre système. Chaque classe du système appartient à l'une des trois catégories et a par conséquent un objectif spécifique.
Que contient le modèle (M) ?
Les informations d’état (données) sont contenues dans les classes de modèle. Il s'agit des informations affichées, manipulées et qui persistent dans le temps. Si vous deviez programmer le restaurant cité en exemple, certains objets de modèle seraient la commande d'un client, ou le nombre de kilos de pommes de terre disponibles dans la réserve :
class CustomerOrder {
List<MenuItems> selectedItems;
float baseCost;
float tax;
};
class PantryItem {
String name;
float currentInventoryLevel;
float reorderLevel;
};
Ou, si vous pensez à notre jeu, le modèle correspondrait aux informations qui racontent notre « histoire ». Combien y a-t-il de joueurs ? Quel joueur détient quelle carte ? Quelles sont les cartes restantes dans le jeu ? L'ensemble de toutes ces informations constitue l'état du jeu.
Que contient la vue (V) ?
La vue englobe la présentation et les interactions du modèle avec l'utilisateur. C'est ce qui est le plus susceptible de changer. Il faut vraiment distinguer la façon dont cette partie interagit avec le reste du système. Au restaurant, il s'agirait du menu, mais également du préposé à l'accueil, du personnel de service et de toute personne avec laquelle vous seriez en interaction directe. Si vous deviez élaborer une application, il s'agirait de votre interface utilisateur, ou UI. Vous pourriez concevoir l'une des vues de la façon suivante :
class Greeter {
public void askHowManyPeopleToSeat();
public void reportEstimatedWaitTime();
public void takeCustomersToTable();
}
Ce code correspond aux interactions possibles avec l'utilisateur.
Que contient le contrôleur (C) ?
Le contrôleur englobe la gestion du flux de l'application. Il est le chef d’orchestre des interactions entre l'utilisateur et le système. L'utilisateur interagit avec la vue, qui interagit ensuite avec le contrôleur. Le contrôleur prend les décisions : il apporte les modifications nécessaires aux objets du modèle, en crée de nouveaux ou supprime ceux qui ne sont plus utiles. Dans l'exemple du restaurant, le contrôleur correspondrait à l'ensemble des règles définies par le propriétaire pour s’occuper d'un client :
class ProcessCustomer {
public void customerGreeted();
public void customerSeated();
public void orderTaken();
public void orderDelivered();
public void patronSatisfactionChecked();
public void billPresented();
public void billPaid();
};
Il s'agirait ici du workflow ou du séquencement des étapes du parcours client.
Quels sont les avantages de l'approche MVC ?
En suivant cette approche, vous concevez un système dans lequel les responsabilités sont clairement définies. C'est en cela que MVC se conforme au principe S du système SOLID.
Bon, petit rappel, que signifie la lettre S ?
Single responsibility (responsabilité unique). Nous examinerons chaque responsabilité dans un instant. Ceci dit, l'idée principale est que les classes du modèle font une chose, alors que celles des vues ou des contrôleurs en font d'autres.
Quant aux autres principes, ils sont également appliqués. Par exemple, la vue étant séparée, il est facile d'ajouter de nouveaux éléments d'interface utilisateur sans avoir à modifier le modèle ou le contrôleur. Et de quel principe s'agit-il ici ?
Le principe ouvert/fermé ?
C'est exact !
En résumé
MVC suit le principe « S » du système SOLID en séparant les responsabilités.
Le modèle contient des informations d'état, les données.
La vue contient les éléments d'interactions avec l'utilisateur.
Le contrôleur veille à ce que l'enchaînement des étapes s'effectue correctement.
Dans le chapitre suivant, nous nous concentrerons sur la création des classes du modèle de notre jeu de cartes.