Archyno
UMLDiagrammes de structure

Diagrammes de classes UML

Le diagramme de structure qui porte l'essentiel du vocabulaire d'UML : les types, leurs attributs et opérations, et les six sortes de lignes qui les relient. Apprenez bien celui-ci et les six autres diagrammes de structure ne coûtent presque rien.

11 min de lectureUML 2.5.14 sur 35

La réponse courte

  • Agrégation et composition disent toutes deux possède. La seule différence est de savoir si les parties survivent au tout : losange creux oui, losange plein non.
  • La généralisation est un trait plein à triangle creux, la réalisation un pointillé au même triangle. Le plein dit est-une-sorte-de, le pointillé remplit-le-contrat-de.
  • La multiplicité se place au bout d'une association, pas au milieu : 1, 0..1, 1..*, et un astérisque seul pour abréger 0..*.
  • Un diagramme de classes modélise des types dotés de comportement, un diagramme ER les données stockées. Un domaine a souvent les deux, sans correspondance élément pour élément.
Diagramme de classes UML d'un domaine de paiement. Merchant est associé à Payment, de un à plusieurs. Payment est composé d'un Money et de zéro ou plusieurs Refund, et il est associé à une interface PaymentMethod que Card et BankTransfer réalisent toutes deux.
Un diagramme de classes d'un domaine de paiement. Chaque signe qui s'y trouve est expliqué plus bas, et le même domaine réapparaît dans tous les autres articles de cette série.

01Lire la boîte#

Une classe est un rectangle à trois compartiments au plus, empilés. Seul le premier est obligatoire.

  • Nom. Le nom du type, centré et en gras. Si la classe est abstraite, le nom est en italique. Un mot-clé entre guillemets français au-dessus - «interface», «enumeration» - précise de quel type de classificateur il s'agit.
  • Attributs. Un par ligne, écrits visibilité nom : Type [multiplicité] = valeur par défaut. Tout sauf le nom est facultatif.
  • Opérations. Une par ligne, écrites visibilité nom(paramètres) : TypeDeRetour.

Le symbole de tête de chaque membre est sa visibilité : + public, - privé, # protégé et ~ paquet. Un membre souligné est statique : il appartient à la classe et non à une instance.

02Les six traits#

Presque tout le sens d'un diagramme de classes est dans les traits, et il n'y en a que six à retenir. L'extrémité qui porte la décoration est significative dans tous les cas.

ÉlémentNotationCe que cela signifie
AssociationUn lien structurel. Les instances de l'une connaissent celles de l'autre. La multiplicité à chaque extrémité dit combien.
Association dirigéeLa même chose, mais navigable seulement dans le sens de la flèche. Payment peut atteindre sa PaymentMethod ; la méthode ne peut pas remonter.
AgrégationUn lien tout-partie où la partie survit au tout. Le losange creux se place du côté du tout.
CompositionUn lien tout-partie où la partie meurt avec le tout. Losange plein du côté du tout. Une partie a exactement un propriétaire.
GénéralisationHéritage. Le triangle creux pointe vers le parent. Lisez-le « est une sorte de ».
RéalisationImplémentation d'une interface. Trait pointillé, triangle creux du côté de l'interface.
DépendanceLe lien le plus faible : l'une utilise l'autre, typiquement comme paramètre ou variable locale. À utiliser avec parcimonie, sinon chaque classe finit reliée à toutes les autres.

Les traits pleins sans triangle sont structurels ; les traits pointillés sont toujours plus faibles que les pleins.

03Multiplicité#

Le nombre au bout d'un trait dit combien d'instances participent. Il se place à l'extrémité opposée à la classe qu'il contraint, ce qui déroute : en lisant Merchant 1 —— 0..* Payment, le 0..* à côté de Payment signifie qu'un marchand a zéro ou plusieurs paiements.

  • 1 - exactement une. La valeur par défaut quand rien n'est écrit, même s'il est plus clair de l'écrire.
  • 0..1 - facultative. C'est la notation d'une référence pouvant être vide.
  • * ou 0..* - un nombre quelconque, y compris aucun.
  • 1..* - au moins une. Une contrainte utile et souvent oubliée.
  • 2..4 - un intervalle explicite.

La multiplicité est le gain de justesse le moins cher de toute la notation. « Est-ce que ça peut être vide ? » et « peut-il y en avoir plusieurs ? » sont les deux questions qui font remonter les vrais désaccords en revue de conception, et la réponse tient en trois caractères.

04Association, agrégation, composition#

Ces trois-là sont la même forme de relation à trois intensités, et la différence porte sur le cycle de vie, pas sur l'intensité du lien ressenti entre les deux choses.

Deux diagrammes mis en regard. À gauche, Payment a un losange plein vers Money, étiqueté composition : le Money ne peut pas exister sans le Payment. À droite, Team a un losange creux vers Person, étiqueté agrégation : une Person survit à l'équipe.
Le test est la suppression. Composition à gauche : détruisez le tout et la partie est détruite avec lui. Agrégation à droite : la partie continue.

Une association simple n'affirme rien sur la propriété. Deux choses sont reliées. C'est tout, et c'est le bon choix par défaut.

L'agrégation - le losange creux - affirme une relation tout-partie où la partie est indépendante. Conseil honnête : l'agrégation ne porte presque aucune sémantique formelle en UML 2.5.1, et les lecteurs ne s'accordent pas sur ce qu'elle implique. Si vous hésitez entre association et agrégation, dessinez l'association.

La composition - le losange plein - est celle qui dit quelque chose de fort et de vérifiable. La partie appartient à exactement un tout et est détruite avec lui. Dans le modèle de paiement, un Refund n'existe que dans un Payment ; il n'y a pas de remboursement flottant. C'est une vraie contrainte, qui vaut la peine d'être consignée, et elle se traduit directement par une suppression en cascade ou une collection possédée dans le code.

05Quand en dessiner un#

À utiliser quand

  • S'accorder sur le vocabulaire du domaine avec des gens qui ne liront pas le code
  • Les relations ont de vraies contraintes : optionalité, cardinalité, propriété
  • Former quelqu'un à un sous-système dont la forme n'est pas évidente dans l'arborescence
  • Concevoir un schéma, un contrat d'API, ou tout ce qui a une structure persistée

Préférer autre chose quand

  • Vous redessineriez ce qu'un IDE génère depuis les sources en un clic
  • La question porte sur l'ordre ou le temps - dessinez une séquence ou une activité
  • Les classes sont de la pure plomberie de framework sans sens métier
  • Vous êtes tenté de mettre toutes les classes du système sur une seule page

Les diagrammes de classes les plus utiles sont petits en pratique. Sept à douze classes, des attributs sur celles dont on discute et omis partout ailleurs, et chaque trait portant une multiplicité. Un tel diagramme se lit en réunion et tranche des débats. Un diagramme de classes à cent boîtes est un artefact, pas une communication.

06Cinq erreurs à éviter#

  1. Des flèches à l'envers. Généralisation et réalisation pointent vers l'abstraction. Si votre triangle est sur la sous-classe, le diagramme dit le contraire de ce que vous vouliez.
  2. La composition pour dire « fortement lié ». Le losange plein est une affirmation sur le cycle de vie. Ne l'utilisez que lorsque détruire le tout détruit vraiment la partie.
  3. Aucune multiplicité. Un trait sans rien à ses extrémités a jeté l'information la plus précieuse que le diagramme pouvait porter.
  4. Mélanger les altitudes. Classes métier et classes de framework sur la même page. Séparez ; chaque diagramme doit être lisible par un seul public.
  5. Modéliser chaque accesseur. Les opérations ont leur place quand elles portent du sens. getName() n'en porte pas.

Pour confronter un modèle de classes à la réalité, dessinez un diagramme d'objets - un unique instantané concret d'instances. Les multiplicités qui paraissaient correctes dans l'abstrait s'effondrent en général dès qu'on essaie de les remplir avec de vraies valeurs.

En une ligne chacun

  1. 01Trois compartiments : nom, attributs, opérations. Omettre plutôt que laisser vide.
  2. 02Les marqueurs de visibilité sont + - # ~ ; souligné veut dire statique, nom en italique veut dire abstrait.
  3. 03Six traits portent le sens ; l'extrémité décorée est toujours significative.
  4. 04Généralisation et réalisation pointent vers l'abstraction.
  5. 05La composition affirme un cycle de vie : la partie meurt avec le tout. L'agrégation ne signifie presque rien ; préférez une association simple.
  6. 06La multiplicité est le gain de justesse le moins cher disponible. Mettez-la sur chaque trait.

07Questions fréquentes#

Quelle est la différence entre agrégation et composition ?

Les deux veulent dire possède, et la différence tient à ce qui arrive quand le tout disparaît. L'agrégation, losange creux, signifie que les parties survivent au tout : supprimez un service et ses employés existent toujours. La composition, losange plein, signifie qu'elles ne survivent pas : supprimez une commande et ses lignes partent avec elle.

Que signifient les signes plus, moins et dièse dans un diagramme de classes ?

Ce sont des marques de visibilité sur les attributs et les opérations, écrites juste avant le nom du membre. Plus vaut public, moins privé, dièse protégé, et le tilde visible au paquetage.

Que signifie 0..* en UML ?

C'est une multiplicité, qui veut dire zéro ou plus. La multiplicité se place au bout d'une association et contraint le nombre d'instances qui peuvent y participer : 1 vaut exactement une, 0..1 optionnelle, 1..* une ou plus, et un astérisque seul abrège 0..*.

Quelle est la différence entre généralisation et réalisation ?

La généralisation est un héritage entre deux classes, tracé en trait plein avec un triangle creux. La réalisation est une classe qui implémente une interface, tracée en pointillés avec le même triangle creux. Le plein dit est-une-sorte-de ; le pointillé dit remplit-le-contrat-de.

En quoi un diagramme de classes UML diffère-t-il d'un diagramme ER ?

Un diagramme de classes modélise des types dotés de comportement, d'où les opérations sur la classe, et il décrit des objets en mémoire. Un diagramme ER modélise les données que le système stocke, n'a pas d'opérations, et ses relations se limitent à ce qu'une base relationnelle peut faire respecter. Un même domaine a souvent les deux, sans correspondance élément pour élément.

Dans cette série

À lire aussi

Tous les articles