Diagramme de classes
Le diagramme de classes est le principal bloc de construction de la modélisation orientée objet. Il sert à la modélisation conceptuelle générale de la structure d'une application, ainsi qu'à la modélisation détaillée qui transforme le modèle en code de programmation. Le diagramme de classes peut également servir à la modélisation de données. Les classes d'un diagramme de classes représentent à la fois les principaux éléments et interactions d'une application, et les classes qu'il faut programmer.
Copier
Intégrer
---
title: Animal example
---
classDiagram
note "From Duck till Zebra"
Animal <|-- Duck
note for Duck "can fly
can swim
can dive
can help in debugging"
Animal <|-- Fish
Animal <|-- Zebra
Animal : +int age
Animal : +String gender
Animal: +isMammal()
Animal: +mate()
class Duck{
+String beakColor
+swim()
+quack()
}
class Fish{
-int sizeInFeet
-canEat()
}
class Zebra{
+bool is_wild
+run()
}
Syntaxe
Classe
UML fournit des mécanismes pour représenter les membres d'une classe, tels que les propriétés et les méthodes, ainsi que leurs informations complémentaires. Une instance unique d'une classe comporte trois parties :
- La partie supérieure contient le nom de la classe. Il est imprimé en gras et centré, avec la première lettre en majuscule. Elle peut également contenir un texte de commentaire facultatif décrivant la nature de la classe.
- La partie centrale contient les propriétés de la classe. Elles sont alignées à gauche, avec la première lettre en minuscule.
- La partie inférieure contient les opérations que la classe peut exécuter. Elles sont également alignées à gauche, avec la première lettre en minuscule.
Copier
Intégrer
---
title: Bank example
---
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +Bigdecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
Définir une classe
Il existe deux façons de définir une classe
- Utiliser explicitement la syntaxe class (par exemple class Animal), ce qui définit la classe Animal.
- Par une relation, qui définit simultanément deux classes et la relation entre elles (par exemple Vehicle <|-- Car).
Copier
Intégrer
classDiagram
class Animal
Vehicle <|-- Car
Convention de nommage : le nom d'une classe ne peut être composé que de caractères alphanumériques (y compris l'unicode), du tiret bas (_) et du tiret (-).
Étiquette de classe
Si vous devez fournir une étiquette à une classe, vous pouvez utiliser la syntaxe suivante :
Copier
Intégrer
classDiagram
class Animal["Animal with a label"]
class Car["Car with *! symbols"]
Animal --> Car
Vous pouvez également utiliser des backticks (``) pour échapper les caractères spéciaux dans une étiquette :
Copier
Intégrer
classDiagram
class `Animal Class!`
class `Car Class`
`Animal Class!` --> `Car Class`
Définir les membres d'une classe
UML fournit des mécanismes pour représenter les membres d'une classe (tels que les propriétés et les méthodes) ainsi que leurs informations complémentaires.
Mermaid fait la distinction entre les propriétés et les fonctions ou méthodes selon la présence ou non de parenthèses (). Ceux qui comportent () sont considérés comme des fonctions ou des méthodes, et tout le reste comme des propriétés.
Il existe deux façons de définir les membres d'une classe ; quelle que soit la syntaxe utilisée pour définir un membre, le résultat est identique. Les deux méthodes sont :
1. Utiliser le signe deux-points (:) suivi du nom du membre pour associer un membre à une classe ; cela est utile pour définir un seul membre à la fois. Par exemple :
Copier
Intégrer
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +BigDecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
2. Utiliser des accolades {} pour associer les membres d'une classe, les membres étant regroupés à l'intérieur des accolades. Convient pour définir plusieurs membres à la fois. Par exemple :
Copier
Intégrer
classDiagram
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount)
+withdrawal(amount)
}
Type de retour
Vous pouvez spécifier le type de données qui sera renvoyé à la fin d'une définition de méthode ou de fonction. Remarque : il doit y avoir un espace entre la dernière ')' et le type de retour. Un exemple :
Copier
Intégrer
classDiagram
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount) bool
+withdrawal(amount) int
}
Types génériques
Un type générique peut être représenté dans le cadre d'une définition de classe, et peut aussi être utilisé pour un membre de classe ou un type de retour. Pour représenter un élément comme un type générique, placez ce type entre des tildes (~). Les déclarations de types imbriqués telles que List<List<int>> sont prises en charge, mais les types génériques contenant des virgules, comme List<List<K, V>> , ne sont pas pris en charge actuellement.
Copier
Intégrer
classDiagram
class Square~Shape~{
int id
List~int~ position
setPoints(List~int~ points)
getPoints() List~int~
}
Square : -List~string~ messages
Square : +setMessages(List~string~ messages)
Square : +getMessages() List~string~
Square : +getDistanceMatrix() List~List~int~~
Visibilité
Pour décrire la visibilité d'une propriété ou d'une méthode/fonction, vous pouvez utiliser un symbole facultatif avant le nom de ce membre :
- + Public
- - Privé
- # Protégé
- ~ Interne
Définir une relation
Une relation est un terme général qui englobe les types spécifiques de connexions logiques rencontrés dans les diagrammes de classes et d'objets.
Copier
Intégrer
[classA][Arrow][ClassB]
UML为类定义了八种不同类型的关系:
| Type | Description |
|---|---|
| <|-- | Héritage |
| *-- | Composition |
| o-- | Agrégation |
| --> | Association |
| -- | Lien (plein) |
| ..> | Dépendance |
| ..|> | Réalisation |
| .. | Lien (pointillé) |
Copier
Intégrer
classDiagram
classA <|-- classB
classC *-- classD
classE o-- classF
classG <-- classH
classI -- classJ
classK <.. classL
classM <|.. classN
classO .. classP
Nous pouvons utiliser des étiquettes pour décrire la nature de la relation entre deux classes. De plus, la flèche peut également être utilisée dans le sens inverse :
Copier
Intégrer
classDiagram
classA --|> classB : Inheritance
classC --* classD : Composition
classE --o classF : Aggregation
classG --> classH : Association
classI -- classJ : Link(Solid)
classK ..> classL : Dependency
classM ..|> classN : Realization
classO .. classP : Link(Dashed)
Étiquette de relation
Vous pouvez ajouter un texte d'étiquette à une relation :
Copier
Intégrer
[classA][Arrow][ClassB]:LabelText
Copier
Intégrer
classDiagram
classA <|-- classB : implements
classC *-- classD : composition
classE o-- classF : aggregation
Relation bidirectionnelle
Une relation bidirectionnelle peut logiquement représenter une association N:M :
Copier
Intégrer
classDiagram
Animal <|--|> Zebra
语法如下:
Copier
Intégrer
[Relation Type][Link][Relation Type]
其中 Relation Type 是以下之一:
| Type | Description |
|---|---|
| <| | Héritage |
| * | Composition |
| o | Agrégation |
| > | Association |
| < | Association |
| |> | Réalisation |
Link est l'un des suivants :
| Type | Description |
|---|---|
| -- | Trait plein |
| .. | Trait en pointillés |
Interface en sucette
Une classe peut également se voir attribuer un type de relation particulier, qui définit une interface en sucette pour la classe. L'interface en sucette est définie à l'aide de la syntaxe suivante :
- bar ()-- foo
- foo --() bar
L'interface avec une sucette (bar) se connecte à la classe (foo).
Remarque : chaque interface définie est unique, dans le but de ne pas être partagée entre les classes et de ne pas autoriser plusieurs connexions pointant vers elle.
Copier
Intégrer
classDiagram
bar ()-- foo
Copier
Intégrer
classDiagram
class Class01 {
int amount
draw()
}
Class01 --() bar
Class02 --() bar
foo ()-- Class01
Définir un espace de noms
L'espace de noms regroupe les classes.
Copier
Intégrer
classDiagram
namespace BaseShapes {
class Triangle
class Rectangle {
double width
double height
}
}
Cardinalité/multiplicité d'une relation
La multiplicité ou cardinalité dans un diagramme de classes indique le nombre d'instances d'une classe qui peuvent être associées aux instances d'une autre classe. Par exemple, chaque entreprise aura un ou plusieurs employés, jamais zéro, tandis que chaque employé travaille actuellement pour zéro ou une entreprise.
Le symbole de multiplicité est placé près de l'extrémité de l'association.
Les différentes options de cardinalité sont :
- 1 un seul
- 0..1 zéro ou un
- 1..* un ou plusieurs
- * zéro, un ou plusieurs
- n n (où n>1)
- 0..n de 0 à n (où n>1)
- 1..n de 1 à n (où n>1)
La cardinalité peut être facilement définie en entourant l'option de texte de guillemets doubles ”“ , avant ou après la flèche donnée. Par exemple :
Copier
Intégrer
[classA] "cardinality1" [Arrow] "cardinality2" [ClassB]:LabelText
Copier
Intégrer
classDiagram
Customer "1" --> "*" Ticket
Student "1" --> "1..*" Course
Galaxy --> "many" Star : Contains
Annotations de classe
Les classes peuvent être annotées à l'aide de marqueurs afin de fournir des métadonnées complémentaires sur la classe. Cela permet d'indiquer plus clairement la nature de la classe. Parmi les annotations courantes figurent :
- <<Interface>> représente une classe d'interface
- <<Abstract>> représente une classe abstraite
- <<Service>> représente une classe de service
- <<Enumeration>> représente une énumération
Les annotations sont définies entre << au début et >> à la fin. Il existe trois façons d'ajouter des annotations à une classe ; les trois produisent le même résultat :
- En ligne avec la définition de classe
Copier
Intégrer
classDiagram
class Shape <<interface>>
Sur une ligne distincte après la définition de la classe :
Copier
Intégrer
classDiagram
class Shape
<<interface>> Shape
Shape : noOfVertices
Shape : draw()
- Dans la structure imbriquée de la définition de classe :
Copier
Intégrer
classDiagram
class Shape{
<<interface>>
noOfVertices
draw()
}
class Color{
<<enumeration>>
RED
BLUE
GREEN
WHITE
BLACK
}
Commentaire
Vous pouvez saisir des commentaires dans un diagramme de classes ; l'éditeur les ignorera. Un commentaire doit occuper une ligne à lui seul et commencer par un double signe de pourcentage (%%) . Tout texte jusqu'à la ligne suivante est considéré comme un commentaire, y compris toute syntaxe de diagramme de classes.
Copier
Intégrer
classDiagram
%% This whole line is a comment classDiagram class Shape <<interface>>
class Shape{
<<interface>>
noOfVertices
draw()
}
Définir la direction du diagramme
Vous pouvez utiliser une instruction de direction pour définir la direction de rendu du diagramme de classes :
Copier
Intégrer
classDiagram
direction RL
class Student {
-idCard : IdCard
}
class IdCard{
-id : int
-name : string
}
class Bike{
-id : int
-name : string
}
Student "1" --o "1" IdCard : carries
Student "1" --o "1" Bike : rides
Interaction
Vous pouvez lier un événement de clic à un nœud. L'événement de clic peut déclencher une fonction de rappel JavaScript ou ouvrir un lien qui sera chargé dans un nouvel onglet du navigateur. Remarque : cette fonctionnalité est désactivée avec securityLevel='strict' et activée avec securityLevel='loose'.
Vous pouvez définir ces opérations sur une ligne distincte après toutes les déclarations de classes.
Copier
Intégrer
action className "reference" "tooltip"
click className call callback() "tooltip"
click className href "url" "tooltip"
- action est link ou callback, selon le type d'interaction que vous souhaitez appeler.
- className est l'id du nœud associé à l'opération.
- reference peut être un lien URL ou le nom d'une fonction de rappel.
- (Facultatif) L'info-bulle est la chaîne de caractères affichée lorsque le curseur survole l'élément.
- La fonction de rappel sera appelée avec nodeId comme paramètre.
Remarque
Vous pouvez ajouter un commentaire sur le diagramme à l'aide de note "line1 line2". Vous pouvez ajouter un commentaire à une classe spécifique à l'aide de note for <CLASS NAME> "line1 line2".
Exemple
Copier
Intégrer
classDiagram
note "This is a general note"
note for MyClass "This is a note for a class"
class MyClass{
}
Lien URL :
Copier
Intégrer
classDiagram
class Shape
link Shape "https://www.github.com" "This is a tooltip for a link"
class Shape2
click Shape2 href "https://www.github.com" "This is a tooltip for a link"
Configuration
Cadre des membres
Vous pouvez masquer le cadre des membres vide d'un nœud de classe ; cela se fait en modifiant la valeur hideEmptyMembersBox de la configuration du diagramme de classes.
Copier
Intégrer
---
config:
class:
hideEmptyMembersBox: true
---
classDiagram
class Duck