Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

Chapitre 114 minIntermédiaire

Architecture logicielle : pourquoi séparer les responsabilités

Par Josselyn C., prof de BTS SIO. Mis à jour le .

À la fin de ce chapitre, tu sauras

  • dire ce qu'est l'architecture d'une application et ce qu'elle change au quotidien ;
  • repérer un code spaghetti et nommer ce qui ne va pas ;
  • expliquer la séparation des responsabilités, le couplage et la cohésion ;
  • distinguer style d'architecture, patron de conception et framework.

4 exercices corrigés

L'architecture logicielle d'une application est son organisation d'ensemble : les parties qui la composent, le rôle de chacune et les règles qui disent qui a le droit d'appeler qui. Une bonne architecture ne change pas ce que fait l'application ; elle change le temps qu'il faut pour la comprendre, la corriger et la faire évoluer. Ce chapitre part d'un code mal rangé pour arriver aux trois idées qui guident tout le cours : séparer les responsabilités, réduire le couplage, augmenter la cohésion.

Le point de départ : un fichier qui fait tout

Voici la première version de la page de réservation de ResaSalles, écrite d'un seul jet par un stagiaire. Elle fonctionne.

php
<?php
// reserver.php : tout dans un seul fichier (à NE PAS reproduire)
session_start();
$pdo = new PDO('mysql:host=localhost;dbname=resasalles;charset=utf8mb4', 'root', 'root');

$salle = $pdo->query('SELECT * FROM salle WHERE id = ' . $_GET['id'])->fetch();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $debut = $_POST['debut'];
    $fin = $_POST['fin'];
    if (strtotime($fin) - strtotime($debut) > 4 * 3600) {
        echo '<p style="color:red">4 heures maximum</p>';
    } elseif ($_POST['participants'] > $salle['capacite']) {
        echo '<p style="color:red">Salle trop petite</p>';
    } else {
        $pdo->exec("INSERT INTO reservation (salle_id, employe_id, debut, fin, objet, participants)
                    VALUES ({$salle['id']}, {$_SESSION['id']}, '$debut', '$fin', '{$_POST['objet']}', {$_POST['participants']})");
        echo '<p>Réservation enregistrée</p>';
    }
}
?>
<h1>Réserver la salle <?= $salle['nom'] ?></h1>
<form method="post">
  <input type="datetime-local" name="debut"> <input type="datetime-local" name="fin">
  <input name="objet"> <input type="number" name="participants">
  <button>Réserver</button>
</form>

Compte ce que fait ce fichier : il ouvre la connexion à la base, avec le mot de passe écrit en clair ; il lit les paramètres de la requête ; il applique deux règles de gestion ; il écrit du SQL ; il produit du HTML ; il affiche des messages. Six métiers différents dans trente lignes. C'est ce qu'on appelle du code spaghetti : tout est emmêlé, et tirer sur un fil fait bouger tout le reste.

Ce que ce code coûte

Le jour où il faut le modifier, les ennuis arrivent.

  • Trouver. La règle « 4 heures maximum » est enfouie au milieu du HTML. Sur un projet de 40 pages, où est la règle qui refuse les réservations le week-end ? Il faut tout relire.
  • Réutiliser. La direction veut une application mobile, ou un import des réservations depuis un fichier. Les règles sont coincées dans la page : il faudra les recopier, et les copies finiront par diverger.
  • Tester. Pour vérifier la règle des 4 heures, il faut démarrer un serveur web, une base, se connecter et remplir le formulaire. Personne ne le fait à chaque modification.
  • Sécuriser. Les valeurs saisies sont collées dans le SQL (injection SQL) et dans le HTML sans échappement (faille XSS). Quand le SQL est éparpillé dans 40 pages, il suffit d'un oubli pour ouvrir une faille (les injections).
  • Travailler à plusieurs. Deux développeurs qui modifient la même page, l'un le design, l'autre une règle, se retrouvent en conflit Git à chaque fusion.
  • Changer de technologie. Passer de MySQL à PostgreSQL, ou de pages HTML à une API JSON, oblige à réécrire chaque page.

La séparation des responsabilités

Le remède s'appelle la séparation des responsabilités (separation of concerns) : chaque partie du code s'occupe d'un seul sujet. Dans ResaSalles, on distingue au moins quatre sujets :

SujetQuestion à laquelle il répondExemple dans ResaSalles
PrésentationComment l'information s'affiche-t-elle et comment l'utilisateur agit-il ?Le formulaire de réservation, la liste des salles
CoordinationQuelle action l'utilisateur a-t-il demandée, et qui doit la traiter ?« Il a envoyé le formulaire : vérifier, enregistrer, puis réafficher »
Règles de gestionQu'est-ce qui est permis ou interdit dans l'entreprise ?4 heures au plus, pas plus de participants que de places, pas de chevauchement
Accès aux donnéesOù et comment les données sont-elles stockées ?Les requêtes SQL sur les tables salle et reservation

Chaque sujet change pour des raisons différentes : le design change quand on refait la charte graphique, les règles quand la direction change de politique, l'accès aux données quand on change de base. Si chaque sujet vit dans ses propres fichiers, chaque changement ne touche qu'un endroit.

L'analogie du restaurant aide à s'en souvenir. La salle (la présentation) accueille le client et lui présente la carte. Le serveur (la coordination) prend la commande, la transmet en cuisine, rapporte l'assiette. La cuisine (les règles et les données) connaît les recettes et les stocks. Le serveur ne cuisine pas ; le cuisinier ne vient pas en salle. On peut refaire la décoration de la salle sans changer les recettes.

Couplage et cohésion

Deux mots reviennent dans toutes les discussions d'architecture, et la commission d'E6 les apprécie quand ils sont bien employés.

Le couplage mesure à quel point une partie dépend des détails d'une autre. Le formulaire du stagiaire est fortement couplé à MySQL : il contient le nom des tables, le mot de passe, la syntaxe SQL. Un formulaire qui demande seulement « enregistre cette réservation » à une autre classe est faiblement couplé : il ignore comment elle s'y prend.

La cohésion mesure à quel point ce qui est rangé ensemble sert le même but. Un fichier ReservationRepository qui ne contient que les requêtes des réservations a une forte cohésion. Le fichier reserver.php du stagiaire a une faible cohésion : il mélange six sujets.

Couplage fort, cohésion faibleCouplage faible, cohésion forte
Changer une requête SQLChercher dans toutes les pagesModifier un seul fichier d'accès aux données
Tester la règle des 4 heuresLancer serveur, base et navigateurAppeler une méthode dans un test unitaire
Ajouter une application mobileRéécrire les règlesRéutiliser les règles, écrire une nouvelle interface
Comprendre un fichierLire 300 lignes de sujets mélangésUn fichier, un sujet, un nom qui le dit

Le principe de responsabilité unique (le S de SOLID, Single Responsibility Principle) dit la même chose à l'échelle d'une classe : une classe ne devrait avoir qu'une seule raison de changer. Si tu modifies une classe à la fois parce que le format d'affichage change et parce qu'une règle de gestion change, elle porte deux responsabilités. Les principes SOLID sont présentés dans le cours de programmation orientée objet (les principes SOLID).

Style d'architecture, patron de conception, framework

Ces mots se mélangent souvent dans les copies. Ils ne sont pas au même niveau.

TermeCe que c'estExemples
Style (ou modèle) d'architectureL'organisation d'ensemble d'une application ou d'un systèmeClient-serveur, 3 tiers, architecture en couches, microservices, architecture hexagonale
Patron de conception (design pattern)Une solution éprouvée à un problème de conception précis, à l'échelle de quelques classesRepository, DAO, Singleton, Observer, Strategy, Factory
Framework (cadre applicatif)Un ensemble de code prêt à l'emploi qui impose une organisation et appelle ton codeExpress, ASP.NET Core, Laravel, Symfony, Angular
BibliothèqueDu code que ton programme appelle quand il en a besoinPDO, mysql2, MySqlConnector, React

MVC est à la frontière : on l'appelle tantôt patron de conception (il est né à la fin des années 1970, au centre de recherche Xerox PARC, pour organiser les interfaces graphiques à l'échelle de quelques classes), tantôt patron d'architecture (il structure aujourd'hui des applications web entières). Les deux réponses sont acceptées si tu sais expliquer ce que MVC sépare.

La différence entre framework et bibliothèque tient en une phrase : tu appelles une bibliothèque, un framework t'appelle. C'est l'inversion de contrôle. Express appelle ta fonction quand une requête arrive sur une route ; toi, tu appelles PDO quand tu veux exécuter une requête.

Les qualités qu'une architecture recherche

On ne choisit pas une architecture pour faire joli : on la choisit pour obtenir des qualités. Ce sont les exigences non fonctionnelles, celles qui ne disent pas ce que fait l'application mais comment elle doit le faire.

QualitéQuestionCe qui l'améliore
MaintenabilitéCombien de temps pour comprendre et modifier ?Séparation des responsabilités, nommage, couches
TestabilitéPeut-on vérifier une règle sans tout démarrer ?Règles isolées dans des services, injection de dépendances
SécuritéCombien d'endroits faut-il protéger ?Un seul point d'accès aux données, contrôles centralisés
ÉvolutivitéPeut-on ajouter une interface ou une fonction sans tout casser ?Couplage faible, API
Performance et montée en chargeL'application tient-elle dix fois plus d'utilisateurs ?Tiers séparés, cache, plusieurs instances (répartition de charge)
SimplicitéUne personne seule peut-elle tout comprendre ?Le moins de pièces possible

La dernière ligne compte autant que les autres. Une architecture trop riche pour le besoin coûte cher elle aussi : dix microservices pour une application de réservation de salles, c'est dix déploiements à surveiller pour rien. Le chapitre 13 t'apprend à doser.

La place de l'architecture au BTS SIO

Dans le bloc 2 SLAM du référentiel, la compétence « Concevoir et développer une solution applicative » commence par l'analyse du besoin, puis par « Participer à la conception de l'architecture d'une solution applicative ». Concrètement, la commission de l'E6 attend que tu saches :

  • fournir, dans ton dossier, un schéma de l'architecture de chaque réalisation : ce qui tourne sur le poste de l'utilisateur, sur le serveur, dans la base ;
  • dire, quand tu analyses le besoin écrit par la commission, dans quelle couche se trouve la fonctionnalité à faire évoluer, et donc quels fichiers modifier ;
  • justifier tes choix : pourquoi une API, pourquoi un client lourd, pourquoi ce découpage ;
  • respecter l'organisation existante quand tu ajoutes du code pendant l'heure de réalisation.

Le cours Épreuve E6 SLAM détaille l'environnement technologique exigé. Il impose plusieurs situations d'exécution (poste fixe, navigateur, terminal mobile, serveur) et des appels à des services distants : ce sont des contraintes d'architecture, traitées au chapitre 13.

Exercices

Exercice 1 sur 4 Les responsabilités d'un fichier Réussi À revoir

Relis le fichier reserver.php du début du chapitre. Pour chacune de ces lignes, donne le sujet dont elle s'occupe (présentation, coordination, règle de gestion, accès aux données) :

  1. $pdo = new PDO('mysql:host=localhost;dbname=resasalles;charset=utf8mb4', 'root', 'root');
  2. if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  3. if (strtotime($fin) - strtotime($debut) > 4 * 3600) {
  4. $pdo->exec("INSERT INTO reservation …");
  5. <h1>Réserver la salle <?= $salle['nom'] ?></h1>
  6. elseif ($_POST['participants'] > $salle['capacite'])
Voir la réponseMasquer la réponse de l'exercice 1
  1. Accès aux données : l'ouverture de la connexion, avec en prime un mot de passe en clair dans le code, qui devrait venir de la configuration.
  2. Coordination : on regarde quelle action l'utilisateur a demandée (afficher le formulaire ou l'envoyer).
  3. Règle de gestion : une réservation dure 4 heures au plus.
  4. Accès aux données : l'écriture en base, avec une injection SQL possible, car les valeurs sont collées dans la requête.
  5. Présentation : l'affichage du titre, avec une faille XSS possible, car le nom n'est pas échappé.
  6. Règle de gestion : pas plus de participants que de places.

Six lignes, quatre sujets : c'est la définition d'une cohésion faible.

Tu avais trouvé ?

Exercice 2 sur 4 Couplage fort ou faible ? Réussi À revoir

Pour chaque situation, dis si le couplage est fort ou faible et pourquoi.

  1. Le formulaire WinForms de réservation contient new MySqlCommand("INSERT INTO reservation …").
  2. Le contrôleur Express appelle reservationService.reserver(demande) sans savoir si les données sont dans MySQL ou dans un fichier.
  3. La vue HTML de la liste des salles lit directement $_SESSION['id'] et exécute une requête pour savoir si l'utilisateur est administrateur.
  4. Le service de réservation reçoit dans son constructeur un objet qui sait chercher les réservations d'une salle.
Voir la réponseMasquer la réponse de l'exercice 2
  1. Fort : l'interface connaît le SGBD, le nom des tables et la syntaxe SQL. Changer de base oblige à modifier le formulaire.
  2. Faible : le contrôleur ne connaît que le nom de l'opération. On peut changer le stockage sans le toucher.
  3. Fort : la vue dépend de la session et de la base. Elle devrait recevoir une simple information (estAdmin) préparée par le contrôleur.
  4. Faible : le service dépend d'une capacité (« chercher les réservations »), pas d'une technologie. C'est l'injection de dépendances du chapitre 7.

Tu avais trouvé ?

Exercice 3 sur 4 Style, patron ou framework ? Réussi À revoir

Classe chaque terme : style d'architecture, patron de conception, framework ou bibliothèque. Express, architecture 3 tiers, Repository, PDO, microservices, Observer, ASP.NET Core, React, architecture en couches, DAO.

Voir la réponseMasquer la réponse de l'exercice 3
  • Styles d'architecture : architecture 3 tiers, microservices, architecture en couches.
  • Patrons de conception : Repository, Observer, DAO.
  • Frameworks : Express, ASP.NET Core.
  • Bibliothèques : PDO, React.

React se présente lui-même comme une bibliothèque pour construire des interfaces : c'est ton code qui l'appelle pour afficher des composants. Combiné à un routeur et à un outil de construction, il sert de base à des frameworks (React Router en mode framework, Next.js), d'où les débats ; à l'examen, « bibliothèque » est la réponse attendue.

Tu avais trouvé ?

Exercice 4 sur 4 Les qualités en jeu Réussi À revoir

La direction de Brévent Industrie formule quatre demandes. Pour chacune, quelle qualité d'architecture est en jeu ?

  1. « Le prestataire qui reprendra l'application l'an prochain doit pouvoir la modifier sans vous appeler. »
  2. « Le site doit tenir le jour de l'inscription au séminaire annuel, où 120 personnes réservent en même temps. »
  3. « Les salariés en déplacement doivent pouvoir réserver depuis leur téléphone. »
  4. « Il faut prouver que les règles de réservation fonctionnent après chaque modification. »
Voir la réponseMasquer la réponse de l'exercice 4
  1. Maintenabilité : code organisé, documenté, découpé en responsabilités claires.
  2. Performance et montée en charge, et cohérence des données : deux personnes peuvent viser le même créneau au même instant.
  3. Évolutivité : ajouter un nouveau client (mobile) sans réécrire les règles, ce qui pousse vers une API (chapitre 10).
  4. Testabilité : des règles isolées dans un service et testées automatiquement à chaque modification (chapitre 7).

Tu avais trouvé ?

Chapitre terminé !

Fais les 4 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Le modèle MVC : modèle, vue, contrôleurRevoir le sommaire du cours