Aller au contenu
Réussir mon BTS SIO

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

Par exemple

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écritLes données à mémoriser et leurs règlesLes classes d'un logiciel : données et comportements
Ce qu'il produitUn MLD, puis des tablesDu code : des classes C#, PHP, Java
Indépendant deToute technique de stockageTout langage de programmation
IdentifiantObligatoire, soulignéPas de notion : un objet est identifié par sa référence en mémoire
ComportementAucunDes opérations (méthodes), avec leur visibilité
Où on le rencontreConception de bases, sujets et cours françaisProgrammation 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

MeriseUMLRemarque
EntitéClasseMême rectangle, le nom au singulier
OccurrenceObjet (instance)
PropriétéAttributEn UML, avec un type et une visibilité : - titre : string
Identifiant souligné(rien)On ajoute souvent un attribut id pour l'ORM
Association binaireAssociationUn trait, avec un nom ou des rôles
Cardinalité 0,1 / 1,1 / 0,n / 1,nMultiplicité 0..1 / 1 / * (ou 0..) / 1..Écrite de l'autre côté
Association porteuseClasse-associationUne classe reliée à l'association par un trait pointillé
Association ternaireAssociation n-aireUn losange relié aux trois classes
Association réflexive avec rôlesAssociation réflexive avec rôlesIdentique
Héritage et contraintes X, T, XTGé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, interfacesPropre 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), 1 près de Client (une commande a un client).
Merise (MCD)CLIENTCOMMANDEPRODUITPASSERCONTENIRquantite0,n1,11,n0,nUML (diagramme de classes)ClientCommandeProduit10..*0..*1..*LigneCommandequantite : intmême phrase,autre côté
Merise écrit la cardinalité près de l'entité décrite, UML près de la classe comptée

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 gestionMeriseUML
Un exemplaire est rattaché à un seul site ; un site a 0 à n exemplairesEXEMPLAIRE 1,1 ── RATTACHER ── 0,n SITEExemplaire "0..*" ──── "1" Site
Un adhérent réserve 0 à n documents ; un document est réservé par 0 à n adhérentsADHERENT 0,n ── RESERVER ── 0,n DOCUMENTAdherent "0..*" ──── "0..*" Document
Un mineur a 0 ou 1 responsable ; un responsable représente 0 à n mineursADHERENT (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).

csharp
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.

  1. EMPRUNT 1,1 ── EFFECTUER ── 0,n ADHERENT
  2. DOCUMENT 0,n ── CONTRIBUER (role) ── 1,n CONTRIBUTEUR
  3. SALARIE 0,1 ── DISPOSER ── 1,1 VOITURE_FONCTION
  4. TICKET 0,1 ── CONCERNER ── 0,n POSTE
Voir la réponseMasquer la réponse de l'exercice 1
  1. 1 près d'Adherent (un emprunt a un adhérent), 0..* près d'Emprunt (un adhérent a 0 à plusieurs emprunts).
  2. 0..* près de Contributeur (0,n près de DOCUMENT : un document a zéro ou plusieurs contributeurs) et 1..* près de Document (1,n près de CONTRIBUTEUR : un contributeur a participé à au moins un document). Le rôle devient une classe-association Contribution, avec l'attribut role.
  3. 1 près de Salarie (une voiture a un salarié), 0..1 près de VoitureFonction (un salarié a 0 ou 1 voiture).
  4. 0..1 prè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. Le 1 près de Medecin dit qu'une ordonnance a un seul médecin : en Merise, ce 1,1 s'écrit près d'ORDONNANCE. Le 0..* 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. Le 1..* près de Medicament dit qu'une ordonnance contient au moins un médicament : 1,n près d'ORDONNANCE. Le 0..* 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é ?

Chapitre terminé !

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

chapitres
–
de série
–
du cours
–
Chapitre suivant : Merise à l'examen : E6 et E7 SLAMRevoir le sommaire du cours