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

KlassediagramSyntaks

Klassediagram

Klassediagrammet er en vigtig byggeklods i objektorienteret modellering. Det bruges til generel begrebsmodellering af applikationsstruktur samt til detaljeret modellering, hvor modeller omdannes til programmeringskode. Klassediagrammer kan også bruges til datamodellering. Klasserne i et klassediagram repræsenterer både de vigtigste elementer og interaktioner i applikationen og de klasser, der skal programmeres.

Kode
                            
Kopiér
Integrer
--- 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() }

Syntaks

Klasse

UML tilbyder mekanismer til at repræsentere klassemedlemmer, f.eks. egenskaber og metoder, samt deres yderligere information. En enkelt instans af en klasse indeholder tre dele:

  • Den øverste del indeholder klassens navn. Det udskrives med fed og centreret, og første bogstav er stort. Den kan også indeholde en valgfri kommentartekst, der beskriver klassens karakter.
  • Den midterste del indeholder klassens egenskaber. De er venstrejusterede, og første bogstav er lille.
  • Den nederste del indeholder de handlinger, klassen kan udføre. De er også venstrejusterede, og første bogstav er lille.
Kode
                            
Kopiér
Integrer
--- title: Bank example --- classDiagram class BankAccount BankAccount : +String owner BankAccount : +Bigdecimal balance BankAccount : +deposit(amount) BankAccount : +withdrawal(amount)

Definér en klasse

Der er to måder at definere en klasse på

  • Brug eksplicit class-syntaksen (f.eks. class Animal), hvilket definerer klassen Animal.
  • Gennem en relation, som samtidig definerer to klasser og relationen mellem dem (f.eks. Vehicle <|-- Car).
Kode
                            
Kopiér
Integrer
classDiagram class Animal Vehicle <|-- Car

Navngivningsregler: Et klassenavn må kun bestå af alfanumeriske tegn (inklusive unicode), underscore (_) og bindestreg (-).

Klasseetiket

Hvis du har brug for at give en klasse en etiket, kan du bruge følgende syntaks:

Kode
                            
Kopiér
Integrer
classDiagram class Animal["Animal with a label"] class Car["Car with *! symbols"] Animal --> Car

Du kan også bruge backticks (``) til at escape specialtegn i etiketten:

Kode
                            
Kopiér
Integrer
classDiagram class `Animal Class!` class `Car Class` `Animal Class!` --> `Car Class`

Definér klassens medlemmer

UML tilbyder mekanismer til at repræsentere klassemedlemmer (som egenskaber og metoder) samt yderligere information om dem.

Mermaid skelner mellem egenskaber og funktioner eller metoder ud fra, om der er parenteser (). Dem med () betragtes som funktioner eller metoder, og resten betragtes som egenskaber.

Der er to måder at definere en klasses medlemmer på; uanset hvilken syntaks der bruges til at definere medlemmerne, er outputtet det samme. De to forskellige måder er:

1. Brug et kolon (:) efterfulgt af medlemsnavnet til at knytte et klassemedlem; dette er nyttigt, når du vil definere ét medlem ad gangen. For eksempel:

Kode
                            
Kopiér
Integrer
classDiagram class BankAccount BankAccount : +String owner BankAccount : +BigDecimal balance BankAccount : +deposit(amount) BankAccount : +withdrawal(amount)

2. Brug klammer {} til at knytte klassens medlemmer, hvor medlemmerne grupperes inden i klammerne. Velegnet til at definere flere medlemmer på én gang. For eksempel:

Kode
                            
Kopiér
Integrer
classDiagram class BankAccount{ +String owner +BigDecimal balance +deposit(amount) +withdrawal(amount) }

Returtype

Du kan angive den datatype, der skal returneres, i slutningen af en metode- eller funktionsdefinition. Bemærk: Der skal være et mellemrum mellem den sidste ')' og returtypen. Et eksempel:

Kode
                            
Kopiér
Integrer
classDiagram class BankAccount{ +String owner +BigDecimal balance +deposit(amount) bool +withdrawal(amount) int }

Generisk type

Generiske typer kan repræsenteres som en del af en klassedefinition og kan også bruges til klassemedlemmer eller returtyper. For at repræsentere et element som en generisk type skal du omslutte typen med tildetegn (~). Indlejrede typedeklarationer som f.eks. List<List<int>> understøttes, men generiske typer med kommaer, som f.eks. List<List<K, V>>, understøttes ikke i øjeblikket.

Kode
                            
Kopiér
Integrer
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~~

Synlighed

For at beskrive synligheden af en egenskab eller metode/funktion kan et valgfrit symbol angives før medlemmets navn:

  • + Offentlig
  • - Privat
  • # Beskyttet
  • ~ Intern

Definér relationer

En relation er et generelt udtryk, der dækker bestemte typer logiske forbindelser, som findes i klassediagrammer og objektdiagrammer.

                            
Kopiér
Integrer
[classA][Arrow][ClassB]

UML为类定义了八种不同类型的关系:

Type Beskrivelse
<|-- Nedarvning
*-- Komposition
o-- Aggregering
--> Association
-- Link (udfyldt)
..> Afhængighed
..|> Implementering
.. Link (stiplet)
Kode
                            
Kopiér
Integrer
classDiagram classA <|-- classB classC *-- classD classE o-- classF classG <-- classH classI -- classJ classK <.. classL classM <|.. classN classO .. classP

Vi kan bruge en etiket til at beskrive arten af relationen mellem to klasser. Derudover kan pilen også bruges i omvendt retning:

Kode
                            
Kopiér
Integrer
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)

Relationsetiket

Du kan tilføje etikettekst til en relation:

                            
Kopiér
Integrer
[classA][Arrow][ClassB]:LabelText
Kode
                            
Kopiér
Integrer
classDiagram classA <|-- classB : implements classC *-- classD : composition classE o-- classF : aggregation

Tovejsrelation

En tovejsrelation kan logisk repræsentere en N:M-association:

Kode
                            
Kopiér
Integrer
classDiagram Animal <|--|> Zebra

语法如下:

                            
Kopiér
Integrer
[Relation Type][Link][Relation Type]

其中 Relation Type 是以下之一:

Type Beskrivelse
<| Nedarvning
* Komposition
o Aggregering
> Association
< Association
|> Implementering

Link er en af følgende:

Type Beskrivelse
-- Fuldt optrukket linje
.. Stiplet linje

Slikkepind-grænseflade

En klasse kan også tildeles en særlig relationstype, som definerer en slikkepind-grænseflade for klassen. Slikkepind-grænsefladen defineres med følgende syntaks:

  • bar ()-- foo
  • foo --() bar

Grænsefladen med slikkepinden (bar) forbindes til klassen (foo).

Bemærk: Hver defineret grænseflade er unik, med det formål ikke at dele den mellem klasser og ikke tillade flere forbindelser til den.

Kode
                            
Kopiér
Integrer
classDiagram bar ()-- foo
Kode
                            
Kopiér
Integrer
classDiagram class Class01 { int amount draw() } Class01 --() bar Class02 --() bar foo ()-- Class01

Definér navneområde

Et navneområde grupperer klasser.

Kode
                            
Kopiér
Integrer
classDiagram namespace BaseShapes { class Triangle class Rectangle { double width double height } }

Relations kardinalitet/multiplicitet

Multiplicitet eller kardinalitet i et klassediagram angiver, hvor mange instanser af én klasse der kan knyttes til instanser af en anden klasse. F.eks. har hver virksomhed en eller flere medarbejdere, ikke nul, mens hver medarbejder aktuelt arbejder i nul eller én virksomhed.

Multiplicitetssymbolet placeres nær enden af associationen.

De forskellige kardinalitetsmuligheder er:

  • 1 kun 1
  • 0..1 0 eller 1
  • 1..* 1 eller flere
  • * 0 eller 1 eller flere
  • n n (hvor n>1)
  • 0..n 0 til n (hvor n>1)
  • 1..n 1 til n (hvor n>1)

Kardinalitet kan nemt defineres ved at omslutte tekstvalget med dobbelte anførselstegn før eller efter den givne pil. For eksempel:

                            
Kopiér
Integrer
[classA] "cardinality1" [Arrow] "cardinality2" [ClassB]:LabelText
Kode
                            
Kopiér
Integrer
classDiagram Customer "1" --> "*" Ticket Student "1" --> "1..*" Course Galaxy --> "many" Star : Contains

Klasseannotation

Du kan annotere klasser med markeringer for at give yderligere metadata om klassen. Dette kan tydeligere angive klassens karakter. Nogle almindelige annotationer omfatter:

  • <<Interface>> repræsenterer en grænsefladeklasse
  • <<Abstract>> repræsenterer en abstrakt klasse
  • <<Service>> repræsenterer en serviceklasse
  • <<Enumeration>> repræsenterer en enum

Annotationer defineres mellem << i begyndelsen og >> til sidst. Der er tre måder at tilføje annotationer til en klasse på, og alle tre giver samme output:

  • Integreret med klassedefinitionen
                            
Kopiér
Integrer
classDiagram class Shape <<interface>>

På en separat linje efter klassedefinitionen:

Kode
                            
Kopiér
Integrer
classDiagram class Shape <<interface>> Shape Shape : noOfVertices Shape : draw()
  • I en indlejret struktur i klassedefinitionen:
Kode
                            
Kopiér
Integrer
classDiagram class Shape{ <<interface>> noOfVertices draw() } class Color{ <<enumeration>> RED BLUE GREEN WHITE BLACK }

Kommentar

Du kan indsætte kommentarer i et klassediagram, og editoren ignorerer dem. En kommentar skal stå på sin egen linje og skal begynde med dobbelt procenttegn (%%). Al tekst frem til næste linje betragtes som en kommentar, inklusive enhver klassediagram-syntaks.

Kode
                            
Kopiér
Integrer
classDiagram %% This whole line is a comment classDiagram class Shape <<interface>> class Shape{ <<interface>> noOfVertices draw() }

Angiv diagrammets retning

Du kan bruge et retningsudsagn til at angive klassediagrammets renderingsretning:

Kode
                            
Kopiér
Integrer
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

Interaktion

Du kan binde klikhændelser til knuder. En klikhændelse kan udløse en JavaScript-callbackfunktion eller åbne et link, der indlæses i en ny browserfane. Bemærk: Denne funktion er deaktiveret med securityLevel='strict' og aktiveret med securityLevel='loose'.

Du kan definere disse handlinger på en separat linje efter alle klassedeklarationer.

                            
Kopiér
Integrer
action className "reference" "tooltip" click className call callback() "tooltip" click className href "url" "tooltip"
  • action er link eller callback, afhængigt af hvilken type interaktion du vil kalde.
  • className er det node-id, der er knyttet til handlingen.
  • reference kan være et URL-link eller navnet på en callbackfunktion.
  • (Valgfrit) Værktøjstip er en streng, der vises, når musen holdes over et element.
  • Callbackfunktionen kaldes med nodeId som parameter.

Bemærk

Du kan tilføje kommentarer til diagrammet med note "line1 line2". Du kan tilføje kommentarer til en bestemt klasse med note for <CLASS NAME> "line1 line2".

Eksempel

Kode
                            
Kopiér
Integrer
classDiagram note "This is a general note" note for MyClass "This is a note for a class" class MyClass{ }

URL-link:

Kode
                            
Kopiér
Integrer
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"

Konfiguration

Medlemsboks

Du kan skjule den tomme medlemsboks for en knude; dette gøres ved at ændre værdien hideEmptyMembersBox i klassediagrammets konfiguration.

Kode
                            
Kopiér
Integrer
--- config: class: hideEmptyMembersBox: true --- classDiagram class Duck