Chapitre 1211 minIntermédiaire
MCD et diagramme de classes UML : les différences
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- faire correspondre les notions du MCD et d'UML ;
- traduire une cardinalité en multiplicité sans l'inverser ;
- passer d'un diagramme de classes à un MCD ;
- choisir le bon modèle selon le besoin.
3 exercices corrigés1 schéma
Le MCD de Merise et le diagramme de classes d'UML décrivent tous deux des objets métier et les liens entre eux, mais ils n'ont pas le même but : le MCD modélise les données à stocker dans une base relationnelle, le diagramme de classes modélise les classes d'un programme orienté objet, avec leurs méthodes. Les deux notations se traduisent l'une dans l'autre presque terme à terme, avec un piège : les multiplicités UML se lisent du côté opposé aux cardinalités Merise. Ce chapitre donne les correspondances et la méthode pour passer de l'un à l'autre.
Deux modèles, deux objectifs
| MCD (Merise) | Diagramme de classes (UML) | |
|---|---|---|
| Ce qu'il décrit | Les données à mémoriser et leurs règles | Les classes d'un logiciel : données et comportements |
| Ce qu'il produit | Un MLD, puis des tables | Du code : des classes C#, PHP, Java |
| Indépendant de | Toute technique de stockage | Tout langage de programmation |
| Identifiant | Obligatoire, souligné | Pas de notion : un objet est identifié par sa référence en mémoire |
| Comportement | Aucun | Des opérations (méthodes), avec leur visibilité |
| Où on le rencontre | Conception de bases, sujets et cours français | Programmation objet, documentation internationale, sujets d'E7 pour les questions de code |
Le diagramme de classes est présenté en détail dans le chapitre Diagramme de classes du cours UML. Ce chapitre se concentre sur ce qui le relie au MCD.
Le tableau des correspondances
| Merise | UML | Remarque |
|---|---|---|
| Entité | Classe | Même rectangle, le nom au singulier |
| Occurrence | Objet (instance) | |
| Propriété | Attribut | En UML, avec un type et une visibilité : - titre : string |
| Identifiant souligné | (rien) | On ajoute souvent un attribut id pour l'ORM |
| Association binaire | Association | Un trait, avec un nom ou des rôles |
| Cardinalité 0,1 / 1,1 / 0,n / 1,n | Multiplicité 0..1 / 1 / * (ou 0..) / 1.. | Écrite de l'autre côté |
| Association porteuse | Classe-association | Une classe reliée à l'association par un trait pointillé |
| Association ternaire | Association n-aire | Un losange relié aux trois classes |
| Association réflexive avec rôles | Association réflexive avec rôles | Identique |
| Héritage et contraintes X, T, XT | Généralisation (flèche à triangle creux vers la classe mère), contraintes {disjoint}, {complete} | Une partition s'écrit {complete, disjoint} |
| Entité faible (identifiant relatif) | Souvent une composition (losange plein du côté du tout) | La partie n'existe pas sans le tout |
| (rien) | Opérations, visibilité, navigabilité, classes abstraites, interfaces | Propre au code |
Cardinalités et multiplicités : l'inversion
C'est la différence à connaître. Reprends la règle « un client passe zéro ou plusieurs commandes ; une commande est passée par un seul client ».
- En Merise, la cardinalité se place du côté de l'entité qu'elle décrit : 0,n près de CLIENT (un client passe 0 à n commandes), 1,1 près de COMMANDE.
- En UML, la multiplicité se place du côté de la classe qu'on compte :
*près de Commande (un client a 0 à plusieurs commandes),1près de Client (une commande a un client).
Pour traduire sans te tromper, ne déplace pas les nombres : relis la phrase. « Un client passe combien de commandes ? Zéro ou plusieurs » : en Merise, 0,n près de CLIENT ; en UML, * près de Commande. Le minimum et le maximum ne changent pas, seul l'endroit change.
| Règle de gestion | Merise | UML |
|---|---|---|
| Un exemplaire est rattaché à un seul site ; un site a 0 à n exemplaires | EXEMPLAIRE 1,1 ── RATTACHER ── 0,n SITE | Exemplaire "0..*" ──── "1" Site |
| Un adhérent réserve 0 à n documents ; un document est réservé par 0 à n adhérents | ADHERENT 0,n ── RESERVER ── 0,n DOCUMENT | Adherent "0..*" ──── "0..*" Document |
| Un mineur a 0 ou 1 responsable ; un responsable représente 0 à n mineurs | ADHERENT (représenté) 0,1 ── REPRESENTER ── 0,n ADHERENT (responsable) | rôle responsable avec 0..1, rôle representes avec 0..* |
Association porteuse et classe-association
La propriété quantite, portée par l'association CONTENIR dans le MCD, devient en UML une classe-association : une classe LigneCommande reliée par un trait pointillé à l'association entre Commande et Produit. Dans le code, on la transforme souvent en vraie classe, avec deux associations : une commande a plusieurs lignes, chaque ligne concerne un produit.
C'est la même chose qu'au passage au MLD : l'association porteuse plusieurs à plusieurs devient une table ligne_commande en relationnel, une classe LigneCommande en objet.
Héritage et généralisation
L'héritage de Merise/2 et la généralisation d'UML sont la même idée. En UML, la classe mère peut être abstraite (en italique, ou avec {abstract}) : on ne crée jamais d'objet Document, seulement des Livre, des Film ou des Jeu. C'est la traduction objet d'une contrainte de totalité. Côté code, l'héritage entre classes est présenté dans le cours Programmation orientée objet. Les contraintes se notent entre accolades sur l'ensemble de généralisation : {complete, disjoint} pour une partition.
En code, l'héritage est direct (class Livre : Document en C#, class Livre extends Document en PHP). En base, il faut choisir l'une des trois traductions, et les ORM proposent les mêmes : une table par classe, une seule table avec une colonne discriminante, ou une table par classe concrète.
Ce qui n'existe que d'un côté
Seulement en UML : les opérations (+ estEnRetard() : bool), la visibilité (+ public, - privé, # protégé), la navigabilité (une flèche au bout d'une association dit quel objet connaît l'autre), les classes abstraites et les interfaces. Rien de tout cela n'a de sens pour une base de données.
Seulement en Merise : l'identifiant, et toute la rigueur qui va avec (identifiants relatifs, dépendances fonctionnelles, normalisation). En objet, deux objets distincts peuvent avoir les mêmes valeurs ; en base, la clé primaire l'interdit.
Du MCD au code
Voici la classe Exemplaire et la classe Site écrites en C# à partir du MCD de Rivelire. L'association un à plusieurs devient une référence d'un côté (un exemplaire connaît son site) et une collection de l'autre (un site connaît ses exemplaires).
public class Site
{
public string CodeSite { get; set; } = "";
public string NomSite { get; set; } = "";
public List<Exemplaire> Exemplaires { get; } = new(); // 0,n côté SITE
}
public class Exemplaire
{
public string CodeBarre { get; set; } = "";
public DateOnly DateAcquisition { get; set; }
public string Etat { get; set; } = "neuf";
public Site Site { get; set; } = null!; // 1,1 côté EXEMPLAIRE
}
Dans la table, le lien est une seule colonne, la clé étrangère code_site d'exemplaire ; dans le code, il est à double sens. Faire correspondre les deux, c'est le travail d'une couche d'accès aux données (DAO) ou d'un ORM : chapitre Repository, DAO et injection de dépendances du cours Architecture MVC, et cours POO.
Lequel choisir ?
Les deux, chacun à sa place. Pour concevoir une base de données relationnelle, le MCD reste l'outil le plus précis, et celui qu'attendent la plupart des correcteurs français. Pour concevoir le code d'une application, le diagramme de classes s'impose. Dans un projet d'E6 en C# ou en PHP objet, il est courant de présenter un MCD (ou un MLD) pour la base et un diagramme de classes pour le code : la commission vérifie surtout que les deux sont cohérents.
À l'écrit d'E7, le sujet fournit plutôt un schéma relationnel pour les questions de base de données et un diagramme de classes pour les questions de code. Sache lire les deux, et passer de l'un à l'autre sans inverser les cardinalités.
Exercices
Exercice 1 sur 3 Du MCD au diagramme de classes Réussi À revoir
Pour chaque association, indique les multiplicités UML et le côté où tu les écris.
EMPRUNT 1,1 ── EFFECTUER ── 0,n ADHERENTDOCUMENT 0,n ── CONTRIBUER (role) ── 1,n CONTRIBUTEURSALARIE 0,1 ── DISPOSER ── 1,1 VOITURE_FONCTIONTICKET 0,1 ── CONCERNER ── 0,n POSTE
Voir la réponseMasquer la réponse de l'exercice 1
1près d'Adherent (un emprunt a un adhérent),0..*près d'Emprunt (un adhérent a 0 à plusieurs emprunts).0..*près de Contributeur (0,n près de DOCUMENT : un document a zéro ou plusieurs contributeurs) et1..*près de Document (1,n près de CONTRIBUTEUR : un contributeur a participé à au moins un document). Le rôle devient une classe-associationContribution, avec l'attributrole.1près de Salarie (une voiture a un salarié),0..1près de VoitureFonction (un salarié a 0 ou 1 voiture).0..1près de Poste (un ticket concerne 0 ou 1 poste),0..*près de Ticket (un poste a 0 à plusieurs tickets).
Tu avais trouvé ?
Exercice 2 sur 3 Du diagramme de classes au MCD Réussi À revoir
Un sujet donne ce diagramme de classes : Ordonnance "0..*" ──── "1" Medecin, et Ordonnance "0..*" ──── "1..*" Medicament avec une classe-association Prescription (posologie, dureeJours). Écris le MCD.
Voir la réponseMasquer la réponse de l'exercice 2
ORDONNANCE 1,1 ── REDIGER ── 0,n MEDECIN. Le1près de Medecin dit qu'une ordonnance a un seul médecin : en Merise, ce 1,1 s'écrit près d'ORDONNANCE. Le0..*près d'Ordonnance dit qu'un médecin a rédigé zéro ou plusieurs ordonnances : 0,n près de MEDECIN.ORDONNANCE 1,n ── CONTENIR (posologie, duree_jours) ── 0,n MEDICAMENT. Le1..*près de Medicament dit qu'une ordonnance contient au moins un médicament : 1,n près d'ORDONNANCE. Le0..*près d'Ordonnance dit qu'un médicament figure dans zéro ou plusieurs ordonnances : 0,n près de MEDICAMENT.
La classe-association devient une association porteuse. Pour ne pas te tromper, ne déplace pas les nombres : relis chaque multiplicité comme une phrase, puis écris cette phrase en Merise.
Tu avais trouvé ?
Exercice 3 sur 3 Trouver l'erreur Réussi À revoir
Un étudiant traduit EXEMPLAIRE 1,1 ── CORRESPONDRE ── 0,n DOCUMENT en UML et écrit Exemplaire "1" ──── "0..*" Document. Qu'est-ce qui ne va pas ?
Voir la réponseMasquer la réponse de l'exercice 3
Il a recopié les cardinalités du même côté. Son diagramme dit qu'un document correspond à un seul exemplaire (1 près d'Exemplaire) et qu'un exemplaire correspond à plusieurs documents (0..* près de Document), ce qui est absurde. Le bon diagramme est Exemplaire "0..*" ──── "1" Document : un exemplaire a un document, un document a zéro ou plusieurs exemplaires.
Tu avais trouvé ?