Klassendiagram
Het klassendiagram is de belangrijkste bouwsteen van objectgeoriënteerde modellering. Het wordt gebruikt voor het algemene conceptuele modelleren van de toepassingsstructuur, en voor het gedetailleerde modelleren van het omzetten van een model naar programmacode. Klassendiagrammen kunnen ook worden gebruikt voor gegevensmodellering. Klassen in een klassendiagram vertegenwoordigen zowel de belangrijkste elementen en interacties in een toepassing als de klassen die moeten worden geprogrammeerd.
Kopiëren
Insluiten
---
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()
}
Syntaxis
Klasse
UML biedt mechanismen om klasseleden, zoals eigenschappen en methoden, en hun aanvullende informatie weer te geven. Een enkel exemplaar van een klasse bestaat uit drie delen:
- Bovenaan staat de naam van de klasse. Deze wordt vet en gecentreerd afgedrukt, met een hoofdletter. Er kan ook optionele opmerkingtekst zijn die de aard van de klasse beschrijft.
- In het midden staan de eigenschappen van de klasse. Ze zijn links uitgelijnd en beginnen met een kleine letter.
- Onderaan staan de bewerkingen die de klasse kan uitvoeren. Ze zijn ook links uitgelijnd en beginnen met een kleine letter.
Kopiëren
Insluiten
---
title: Bank example
---
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +Bigdecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
Een klasse definiëren
Er zijn twee manieren om een klasse te definiëren
- Expliciet met de syntaxis class (zoals class Animal), waarmee de klasse Animal wordt gedefinieerd.
- Via een relatie, die tegelijk twee klassen en hun onderlinge relatie definieert (zoals Vehicle <|-- Car).
Kopiëren
Insluiten
classDiagram
class Animal
Vehicle <|-- Car
Naamgevingsregels: een klassenaam mag alleen bestaan uit alfanumerieke tekens (inclusief unicode), underscores (_) en streepjes (-).
Klasselabel
Als je een label aan een klasse wilt geven, kun je de volgende syntaxis gebruiken:
Kopiëren
Insluiten
classDiagram
class Animal["Animal with a label"]
class Car["Car with *! symbols"]
Animal --> Car
Je kunt ook backticks (``) gebruiken om speciale tekens in een label te escapen:
Kopiëren
Insluiten
classDiagram
class `Animal Class!`
class `Car Class`
`Animal Class!` --> `Car Class`
Leden van een klasse definiëren
UML biedt mechanismen om klasseleden (zoals eigenschappen en methoden) en aanvullende informatie daarover weer te geven.
Mermaid maakt onderscheid tussen eigenschappen en functies of methoden op basis van de aanwezigheid van haakjes (). Wat haakjes () bevat, wordt als functie of methode beschouwd; de rest wordt als eigenschap beschouwd.
Er zijn twee manieren om klasseleden te definiëren; ongeacht welke syntaxis je gebruikt om leden te definiëren, is het resultaat hetzelfde. De twee verschillende manieren zijn:
1. Gebruik een dubbele punt (:) gevolgd door de naam van het lid om een klasselid te koppelen; dit is handig om één lid tegelijk te definiëren. Bijvoorbeeld:
Kopiëren
Insluiten
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +BigDecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
2. Gebruik accolades {} om klasseleden te koppelen, waarbij de leden binnen de accolades worden gegroepeerd. Geschikt om meerdere leden tegelijk te definiëren. Bijvoorbeeld:
Kopiëren
Insluiten
classDiagram
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount)
+withdrawal(amount)
}
Retourtype
Je kunt aan het einde van een methode- of functiedefinitie het gegevenstype opgeven dat wordt geretourneerd. Let op: er moet een spatie staan tussen de laatste ')' en het retourtype. Een voorbeeld:
Kopiëren
Insluiten
classDiagram
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount) bool
+withdrawal(amount) int
}
Generiek type
Generieke typen kunnen als onderdeel van een klassendefinitie worden weergegeven en kunnen ook worden gebruikt voor klasseleden of retourtypen. Om een item als een generiek type weer te geven, plaats je het type tussen tildes (~). Geneste typedeclaraties zoals List<List<int>> worden ondersteund, maar generieke typen met een komma, zoals List<List<K, V>>, worden momenteel niet ondersteund.
Kopiëren
Insluiten
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~~
Zichtbaarheid
Om de zichtbaarheid van een eigenschap of methode/functie te beschrijven, kun je een optioneel symbool voor de naam van dat lid gebruiken:
- + Openbaar
- - Privé
- # Beschermd
- ~ Intern
Relaties definiëren
Een relatie is een algemene term die de specifieke soorten logische verbindingen omvat die op klassendiagrammen en objectdiagrammen voorkomen.
Kopiëren
Insluiten
[classA][Arrow][ClassB]
UML为类定义了八种不同类型的关系:
| Type | Beschrijving |
|---|---|
| <|-- | Overerving |
| *-- | Compositie |
| o-- | Aggregatie |
| --> | Associatie |
| -- | Link (massief) |
| ..> | Afhankelijkheid |
| ..|> | Realisatie |
| .. | Link (streeplijn) |
Kopiëren
Insluiten
classDiagram
classA <|-- classB
classC *-- classD
classE o-- classF
classG <-- classH
classI -- classJ
classK <.. classL
classM <|.. classN
classO .. classP
We kunnen labels gebruiken om de aard van de relatie tussen twee klassen te beschrijven. Bovendien kunnen pijlen ook in omgekeerde richting worden gebruikt:
Kopiëren
Insluiten
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)
Relatielabel
Je kunt labeltekst aan een relatie toevoegen:
Kopiëren
Insluiten
[classA][Arrow][ClassB]:LabelText
Kopiëren
Insluiten
classDiagram
classA <|-- classB : implements
classC *-- classD : composition
classE o-- classF : aggregation
Bidirectionele relatie
Een bidirectionele relatie kan logisch een N:M-associatie vertegenwoordigen:
Kopiëren
Insluiten
classDiagram
Animal <|--|> Zebra
语法如下:
Kopiëren
Insluiten
[Relation Type][Link][Relation Type]
其中 Relation Type 是以下之一:
| Type | Beschrijving |
|---|---|
| <| | Overerving |
| * | Compositie |
| o | Aggregatie |
| > | Associatie |
| < | Associatie |
| |> | Realisatie |
Link is een van de volgende:
| Type | Beschrijving |
|---|---|
| -- | Doorgetrokken lijn |
| .. | Streeplijn |
Lollipop-interface
Aan een klasse kan ook een speciaal relatietype worden toegewezen, dat een lollipop-interface voor de klasse definieert. De lollipop-interface wordt met de volgende syntaxis gedefinieerd:
- bar ()-- foo
- foo --() bar
Een interface met een lollipop (bar) is verbonden met een klasse (foo).
Let op: elke gedefinieerde interface is uniek, met als doel deze niet tussen klassen te delen en niet toe te staan dat meerdere verbindingen erheen wijzen.
Kopiëren
Insluiten
classDiagram
bar ()-- foo
Kopiëren
Insluiten
classDiagram
class Class01 {
int amount
draw()
}
Class01 --() bar
Class02 --() bar
foo ()-- Class01
Een naamruimte definiëren
Naamruimten groeperen klassen.
Kopiëren
Insluiten
classDiagram
namespace BaseShapes {
class Triangle
class Rectangle {
double width
double height
}
}
Kardinaliteit/multipliciteit van een relatie
De multipliciteit of kardinaliteit in een klassendiagram geeft aan met hoeveel exemplaren van de ene klasse een exemplaar van een andere klasse kan worden geassocieerd. Een bedrijf heeft bijvoorbeeld een of meer werknemers, nooit nul, terwijl elke werknemer momenteel bij nul of één bedrijf werkt.
Multipliciteitssymbolen worden nabij het einde van de associatie geplaatst.
De verschillende kardinaliteitsopties zijn:
- 1 slechts 1
- 0..1 0 of 1
- 1..* 1 of meer
- * 0 of 1 of meer
- n n (waarbij n>1)
- 0..n 0 tot n (waarbij n>1)
- 1..n 1 tot n (waarbij n>1)
Kardinaliteit kan eenvoudig worden gedefinieerd door de tekstoptie voor of na de gegeven pijl tussen dubbele aanhalingstekens " " te plaatsen. Bijvoorbeeld:
Kopiëren
Insluiten
[classA] "cardinality1" [Arrow] "cardinality2" [ClassB]:LabelText
Kopiëren
Insluiten
classDiagram
Customer "1" --> "*" Ticket
Student "1" --> "1..*" Course
Galaxy --> "many" Star : Contains
Annotatie van een klasse
Klassen kunnen met markeringen worden geannoteerd om aanvullende metadata over de klasse te bieden. Dit kan de aard van de klasse duidelijker maken. Enkele veelvoorkomende annotaties zijn:
- <<Interface>> stelt een interfaceklasse voor
- <<Abstract>> stelt een abstracte klasse voor
- <<Service>> stelt een serviceklasse voor
- <<Enumeration>> stelt een opsomming voor
Opmerkingen worden gedefinieerd tussen << aan het begin en >> aan het einde. Er zijn drie manieren om opmerkingen aan een klasse toe te voegen; de uitvoer van alle drie is hetzelfde:
- Inline met de klassendefinitie
Kopiëren
Insluiten
classDiagram
class Shape <<interface>>
Op een aparte regel na de klassendefinitie:
Kopiëren
Insluiten
classDiagram
class Shape
<<interface>> Shape
Shape : noOfVertices
Shape : draw()
- In de geneste structuur van de klassendefinitie:
Kopiëren
Insluiten
classDiagram
class Shape{
<<interface>>
noOfVertices
draw()
}
class Color{
<<enumeration>>
RED
BLUE
GREEN
WHITE
BLACK
}
Opmerking
Je kunt opmerkingen in een klassendiagram invoeren; de editor negeert deze opmerking. Opmerkingen moeten op een eigen regel staan en moeten beginnen met een dubbel procentteken (%%). Alle tekst tot de volgende regel wordt als opmerking beschouwd, inclusief eventuele klassendiagram-syntaxis.
Kopiëren
Insluiten
classDiagram
%% This whole line is a comment classDiagram class Shape <<interface>>
class Shape{
<<interface>>
noOfVertices
draw()
}
De richting van het diagram instellen
Je kunt een richtingsverklaring gebruiken om de weergaverichting van het klassendiagram in te stellen:
Kopiëren
Insluiten
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
Interactie
Je kunt klikgebeurtenissen aan knooppunten koppelen. Klikgebeurtenissen kunnen een JavaScript-callbackfunctie activeren of een link openen die in een nieuw browsertabblad wordt geladen. Let op: deze functie is uitgeschakeld bij securityLevel='strict' en ingeschakeld bij securityLevel='loose'.
Je kunt deze bewerkingen op een aparte regel na alle klassendeclaraties definiëren.
Kopiëren
Insluiten
action className "reference" "tooltip"
click className call callback() "tooltip"
click className href "url" "tooltip"
- action is link of callback, afhankelijk van het type interactie dat je wilt aanroepen.
- className is de knooppunt-id die aan de bewerking is gekoppeld.
- reference kan een URL-link of de naam van een callbackfunctie zijn.
- (Optioneel) een tooltip is de tekenreeks die wordt weergegeven wanneer de muis over een element zweeft.
- De callbackfunctie wordt aangeroepen met nodeId als parameter.
Let op
Je kunt met note "line1 line2" een opmerking aan een diagram toevoegen. Je kunt met note for <CLASS NAME> "line1 line2" een opmerking aan een specifieke klasse toevoegen.
Voorbeeld
Kopiëren
Insluiten
classDiagram
note "This is a general note"
note for MyClass "This is a note for a class"
class MyClass{
}
URL-link:
Kopiëren
Insluiten
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"
Configuratie
Ledenvenster
Je kunt het lege ledenvenster van een klasseknooppunt verbergen; dit doe je door de waarde hideEmptyMembersBox van de klassendiagram-configuratie te wijzigen.
Kopiëren
Insluiten
---
config:
class:
hideEmptyMembersBox: true
---
classDiagram
class Duck