Chapitre 1213 minIntermédiaire
UML à l'examen : E6 et E7 SLAM, méthode et pièges
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- repérer où et comment UML intervient à l'E6 et à l'E7 ;
- lire un diagramme de classes fourni pour écrire du code ;
- justifier tes choix de conception devant une commission ;
- éviter les erreurs de notation qui coûtent des points.
3 exercices corrigés
Au BTS SIO SLAM, UML intervient à deux épreuves : à l'E6 (conception et développement d'applications, bloc 2), où tes diagrammes figurent dans le dossier de tes réalisations et où tu dois modéliser l'évolution que la commission te demande ; et à l'E7 (cybersécurité des services informatiques, écrit de 4 heures), où le dossier documentaire fournit des diagrammes, le plus souvent un diagramme de classes, à lire pour écrire ou corriger du code. Ce chapitre décrit les types de questions, la méthode pour lire un diagramme fourni, les règles pour en dessiner un à la main et les erreurs qui coûtent des points.
Où UML intervient
| Épreuve | Ce qu'on te demande | Diagrammes concernés |
|---|---|---|
| E6 SLAM, dossier | Les éléments techniques de tes deux réalisations : la commission y lit ton besoin et ta conception | Cas d'utilisation, classes, éventuellement déploiement |
| E6 SLAM, phase 1 (30 min de préparation, 20 min d'entretien) | Analyser l'expression des besoins et proposer des spécifications techniques : les classes, associations ou cas d'utilisation que l'évolution ajoute ou modifie, et les justifier | Classes, cas d'utilisation, parfois séquence |
| E6 SLAM, phase 2 (1 h) et recette | Réaliser l'évolution, mettre le diagramme à jour si elle touche la conception, l'expliquer pendant l'entretien d'explicitation | Classes surtout |
| E7 SLAM, écrit | Lire les classes métier fournies pour écrire, compléter ou corriger des méthodes ; parfois compléter un diagramme pour une évolution | Classes surtout, parfois séquence |
À l'E6, le référentiel évalue notamment la compétence « Modéliser une solution applicative » : la commission attend une modélisation conforme au besoin et cohérente avec ton code. Le détail des compétences est dans le cours Épreuve E6 SLAM.
À l'E7, les sujets donnent régulièrement un diagramme des classes métier de l'application étudiée, accompagné d'un extrait de leur code : le sujet de la session 2025, par exemple, fournissait un extrait du diagramme des classes métier d'une application Java et le code de ces classes. Le diagramme n'est pas une fin en soi : c'est la carte qui te permet d'écrire du code juste. Les annales classées par thème sont dans le cours Épreuve E7 SLAM.
Les types de questions
| Verbe de la consigne | Ce qu'on attend | Exemple |
|---|---|---|
| Expliquer, interpréter | Traduire une partie du diagramme en phrases, avec les multiplicités | « Expliquez la relation entre Commande et LigneCommande. » |
| Justifier | Donner la raison d'un choix de conception | « Pourquoi l'attribut solde est-il privé ? », « Pourquoi Utilisateur est-elle abstraite ? » |
| Compléter, faire évoluer | Ajouter les classes, attributs, associations et multiplicités qu'exige un nouveau besoin | « Complétez le diagramme pour gérer les remboursements partiels. » |
| Écrire, coder | Écrire une méthode en suivant les associations du diagramme | « Écrivez la méthode getMontantTotal() de la classe Facture. » |
| Corriger | Trouver l'erreur dans un code ou un diagramme, et la corriger | « Le test échoue : identifiez l'anomalie. » |
| Représenter, modéliser | Produire un diagramme à partir d'un texte | « Représentez les cas d'utilisation du nouveau module. » |
Quand le sujet te laisse choisir le formalisme, tu peux répondre en UML ou en Merise, ou par un schéma relationnel textuel pour une base de données. Choisis celui que tu maîtrises le mieux et respecte-le jusqu'au bout.
Lire un diagramme de classes fourni
Avant toute question de code, prends cinq minutes pour lire le diagramme. Elles te feront gagner bien plus.
- Repère les classes centrales : celles qui ont le plus d'associations. C'est le cœur du métier (dans AppliFrais,
FicheFrais). - Lis chaque association en deux phrases, une dans chaque sens, avec les multiplicités : « une fiche a un visiteur ; un visiteur a zéro ou plusieurs fiches ».
- Repère les héritages et les classes abstraites : une méthode écrite dans la mère s'applique aux filles ; une méthode abstraite est redéfinie dans chaque fille.
- Note la façon dont les associations sont implémentées dans le code fourni :
getLesFiches()renvoie une liste,getVisiteur()un objet. C'est ce que tu utiliseras dans ton code, avec exactement ces noms. - Annote le diagramme sur le sujet : entoure les classes et les méthodes dont tu auras besoin pour chaque question.
Dessiner à la main
À l'écrit de l'E7 comme sur ton brouillon pendant la préparation de la phase 1 de l'E6, tu dessines souvent sans outil de modélisation.
- Fais propre et grand. Une règle, un crayon, puis le stylo. Laisse de la place entre les classes pour les multiplicités et les noms d'associations.
- Écris ce que l'italique ne montre pas :
{abstract}à côté d'une classe ou d'une opération abstraite,«interface»au-dessus du nom d'une interface. - Mets les multiplicités aux deux bouts de chaque association. Une multiplicité oubliée est une information perdue, et le correcteur ne la devinera pas.
- Soigne les symboles qui changent le sens : triangle creux (héritage), losange plein ou creux (du côté du tout), pointillé (réalisation, dépendance,
«include»,«extend»). Un losange placé du mauvais côté inverse la relation. - Ne recopie pas tout quand on te demande de compléter : redessine les classes concernées par l'évolution, et indique « (classes existantes inchangées) ».
- Ajoute une phrase d'explication sous un diagramme d'évolution : « Une classe
Remboursementest ajoutée car une fiche peut être remboursée en plusieurs fois ; elle porte la date et le montant de chaque versement. » Elle montre ton raisonnement et rattrape une notation maladroite.
Les erreurs qui coûtent des points
| Erreur | Diagramme | Comment l'éviter |
|---|---|---|
| Multiplicités recopiées d'un MCD sans les déplacer | Classes | Relire chaque association en phrases |
Clés étrangères (idClient) comme attributs | Classes | Une association, pas une clé |
| Attribut et association pour le même lien | Classes | Garder l'association seule |
| Losange du côté de la partie | Classes | Le losange est collé au tout |
| Héritage utilisé pour « récupérer des attributs » | Classes | Test du « est un », sinon association |
| Attributs publics sans raison | Classes | Attributs privés, opérations publiques |
| Base de données comme acteur | Cas d'utilisation | Seuls les systèmes extérieurs sont acteurs |
«extend» du cas de base vers l'extension | Cas d'utilisation | La flèche part de l'option |
| Cas d'utilisation trop fins (« cliquer sur… ») | Cas d'utilisation | Un objectif de l'acteur |
| Message vers une opération absente du diagramme de classes | Séquence | Vérifier chaque message |
| Jonction (barre) après une décision | Activité | Une fusion (losange) |
| Transition vers un état d'où l'objet ne devrait pas pouvoir revenir | États-transitions | Relire les règles de gestion |
À l'E6 : ta conception dans le dossier et pendant l'épreuve
Pour chacune de tes réalisations, ton dossier gagne à contenir :
- un diagramme de cas d'utilisation, qui montre en une image ce que fait ton application et pour qui ;
- un diagramme de classes (métier, pas forcément exhaustif), cohérent avec ton code et, si tu as une base de données, avec ton schéma relationnel ;
- si l'application a un scénario délicat (une authentification, un appel d'API, un traitement en plusieurs étapes), un diagramme de séquence de ce scénario ;
- éventuellement un diagramme de déploiement, pour montrer où tourne chaque partie.
La commission ne te demande pas les 14 diagrammes. Pendant les deux entretiens, elle te demande de justifier tes choix : « pourquoi une composition ici ? », « que se passe-t-il si la fiche est déjà validée ? ». Un diagramme que tu ne sais pas expliquer fait plus de mal que de bien.
En phase 1, l'expression des besoins porte sur l'une de tes réalisations. Repère d'abord, sur ton propre diagramme de classes, les classes que l'évolution touche, puis esquisse ce qui change : une classe, un attribut, une association avec ses multiplicités, un cas d'utilisation. Cette esquisse est une spécification technique que tu présentes et justifies pendant l'entretien (analyser l'expression des besoins). En phase 2, pendant la réalisation de l'évolution, si elle ajoute une classe ou une association, mets le diagramme à jour : c'est une preuve de méthode, que tu peux montrer à la recette (épreuve E6 SLAM : les évolutions types).
La checklist finale
Avant de rendre un diagramme, vérifie :
- Classes : noms au singulier ; attributs typés et privés ; opérations avec paramètres et type de retour ; multiplicités aux deux bouts de chaque association ; pas de clé étrangère ;
{abstract}et«interface»visibles ; losanges du côté du tout. - Cas d'utilisation : acteurs hors du cadre ; cas nommés « verbe + complément » ; flèches
«include»et«extend»dans le bon sens ; pas d'ordre d'étapes. - Séquence : chaque message correspond à une opération ; fragments avec leurs gardes ; l'acteur ne parle qu'à l'interface.
- Activité : un nœud initial, au moins un nœud final ; gardes exclusives et complètes ; fusion après une décision, jonction après une bifurcation.
- États-transitions : état initial ; chaque transition porte son événement ; les transitions interdites n'existent pas ; cohérence avec les opérations de la classe.
Exercices
Exercice 1 sur 3 Justifier des choix de conception Réussi À revoir
À propos du diagramme de classes d'AppliFrais (chapitre 5), réponds en deux ou trois phrases chacune, comme à l'entretien d'E6.
- Pourquoi
Utilisateurest-elle une classe abstraite ? - Pourquoi la relation entre
FicheFraisetLigneFraisHorsForfaitest-elle une composition, et celle entreRegionetVisiteurune agrégation ? - Pourquoi la quantité est-elle dans
LigneFraisForfaitet pas dansFicheFraisouFraisForfait? - Pourquoi
montantValidea-t-il la multiplicité[0..1]?
Voir la réponseMasquer la réponse de l'exercice 1
- On ne crée jamais un utilisateur qui ne serait ni visiteur ni comptable :
Utilisateurregroupe ce qu'ils ont en commun (identité, authentification). Elle déclare l'opération abstraiteRole(), que chaque fille redéfinit ; le code qui affiche le rôle traite tous les utilisateurs de la même façon (polymorphisme). - Une ligne hors forfait n'a pas de sens sans sa fiche, n'appartient qu'à elle et disparaît avec elle : c'est une composition, et c'est la fiche qui crée ses lignes. Un visiteur, lui, existe indépendamment de sa région : si la région est supprimée ou redécoupée, il est rattaché à une autre ; c'est une agrégation (une association simple serait aussi défendable).
- La quantité dépend du couple fiche-forfait : une fiche a une quantité différente pour chaque forfait, et un forfait a une quantité différente sur chaque fiche. Elle appartient donc à l'association, d'où la classe-association
LigneFraisForfait. - Le montant validé n'existe pas tant que la fiche n'est pas validée : la multiplicité
0..1dit qu'il peut être absent. En C#, il devient undecimal?, que le code doit tester avant de l'utiliser.
Tu avais trouvé ?
Exercice 2 sur 3 Lire un extrait de sujet Réussi À revoir
Un sujet fournit ce diagramme de classes (extrait) : Agence "1" ──── "0..*" Vehicule ; Vehicule "1" ──── "0..*" Location ; Location "0..*" ──── "1" Client ; Location a les attributs - dateDebut : Date, - dateFin : Date [0..1], - kmDepart : int, - kmRetour : int [0..1] et les opérations + getVehicule() : Vehicule, + estEnCours() : boolean ; Vehicule a + getLesLocations() : List<Location> et Agence a + getLesVehicules() : List<Vehicule>.
- Que signifie
dateFin : Date [0..1]? - Quel chemin suivre pour compter les locations en cours d'une agence ?
- Écris la méthode
nbLocationsEnCours() : intde la classeAgence, en Java ou en C#.
Voir la réponseMasquer la réponse de l'exercice 2
- La date de fin est facultative : elle est vide tant que le véhicule n'est pas rendu. Une location sans date de fin est en cours.
Agence→getLesVehicules()(liste,0..*) → pour chaque véhicule,getLesLocations()(liste,0..*) → pour chaque location,estEnCours(). Deux boucles imbriquées.- En Java :
public int nbLocationsEnCours() {
int nb = 0;
for (Vehicule v : this.getLesVehicules()) {
for (Location l : v.getLesLocations()) {
if (l.estEnCours()) {
nb++;
}
}
}
return nb;
}
On utilise estEnCours(), qui existe, plutôt que de tester dateFin soi-même : la règle reste à un seul endroit. En C#, la même méthode s'écrit avec foreach (Vehicule v in GetLesVehicules()).
Tu avais trouvé ?
Exercice 3 sur 3 Corriger une copie Réussi À revoir
Pour la question « Complétez le diagramme pour qu'un client puisse laisser un avis (une note de 1 à 5 et un commentaire) sur chaque location terminée », un candidat a ajouté : une classe Avis avec + note : int, + commentaire : string, + idLocation : int, et une flèche d'héritage de Avis vers Location. Corrige sa réponse.
Voir la réponseMasquer la réponse de l'exercice 3
Avisn'est pas une location : l'héritage est faux. C'est une association :Location "1" ──── "0..1" Avis(une location a au plus un avis ; un avis concerne une location). Une composition, losange du côté deLocation, est défendable : l'avis n'existe pas sans sa location.idLocationest une clé étrangère : à supprimer, l'association suffit.- Les attributs doivent être privés :
- note : int,- commentaire : string. On peut ajouter la contrainte{1 <= note <= 5}et, pour la date,- dateAvis : Date. - La règle « sur chaque location terminée » ne se dessine pas par une multiplicité : on l'écrit dans une note, ou dans l'opération qui crée l'avis (
+ laisserAvis(note : int, commentaire : string)dansLocation, qui vérifie que la location n'est plus en cours).
Tu avais trouvé ?