Register
Process Type
Graphical expression
Mind Type
Structured expression
Note Type
Efficient expression

KlassendiagramSyntaxis

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.

Code
                            
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.
Code
                            
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).
Code
                            
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:

Code
                            
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:

Code
                            
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:

Code
                            
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:

Code
                            
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:

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

Code
                            
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)
Code
                            
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:

Code
                            
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
Code
                            
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:

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

Code
                            
Kopiëren
Insluiten
classDiagram bar ()-- foo
Code
                            
Kopiëren
Insluiten
classDiagram class Class01 { int amount draw() } Class01 --() bar Class02 --() bar foo ()-- Class01

Een naamruimte definiëren

Naamruimten groeperen klassen.

Code
                            
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
Code
                            
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:

Code
                            
Kopiëren
Insluiten
classDiagram class Shape <<interface>> Shape Shape : noOfVertices Shape : draw()
  • In de geneste structuur van de klassendefinitie:
Code
                            
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.

Code
                            
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:

Code
                            
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

Code
                            
Kopiëren
Insluiten
classDiagram note "This is a general note" note for MyClass "This is a note for a class" class MyClass{ }

URL-link:

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

Code
                            
Kopiëren
Insluiten
--- config: class: hideEmptyMembersBox: true --- classDiagram class Duck