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.
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.
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).
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:
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:
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:
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:
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:
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.
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) |
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:
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
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:
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.
Kopiér
Integrer
classDiagram
bar ()-- foo
Kopiér
Integrer
classDiagram
class Class01 {
int amount
draw()
}
Class01 --() bar
Class02 --() bar
foo ()-- Class01
Definér navneområde
Et navneområde grupperer klasser.
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
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:
Kopiér
Integrer
classDiagram
class Shape
<<interface>> Shape
Shape : noOfVertices
Shape : draw()
- I en indlejret struktur i klassedefinitionen:
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.
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:
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
Kopiér
Integrer
classDiagram
note "This is a general note"
note for MyClass "This is a note for a class"
class MyClass{
}
URL-link:
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.
Kopiér
Integrer
---
config:
class:
hideEmptyMembersBox: true
---
classDiagram
class Duck