Klassdiagram
Klassdiagram är den främsta byggstenen inom objektorienterad modellering. Det används för allmän begreppsmodellering av applikationsstruktur samt för detaljerad modellering som omvandlar modellen till programmeringskod. Klassdiagram kan också användas för datamodellering. Klasser i ett klassdiagram representerar både de viktigaste elementen och interaktionerna i applikationen samt de klasser som behöver programmeras.
Kopiera
Bädda in
---
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()
}
Syntax
Klass
UML tillhandahåller mekanismer för att representera klassmedlemmar, såsom egenskaper och metoder, samt tillhörande information. En enskild instans av en klass innehåller tre delar:
- Överst finns klassens namn. Det skrivs ut i fetstil och centrerat, med stor begynnelsebokstav. Det kan också innehålla valfri kommentarstext som beskriver klassens karaktär.
- I mitten finns klassens egenskaper. De är vänsterjusterade och börjar med liten bokstav.
- Längst ned finns de operationer som klassen kan utföra. De är också vänsterjusterade och börjar med liten bokstav.
Kopiera
Bädda in
---
title: Bank example
---
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +Bigdecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
Definiera en klass
Det finns två sätt att definiera en klass
- Använd explicit klassyntax (som class Animal ), vilket definierar klassen Animal.
- Genom en relation, vilket samtidigt definierar två klasser och relationen mellan dem (som Vehicle <|-- Car ).
Kopiera
Bädda in
classDiagram
class Animal
Vehicle <|-- Car
Namnregler: ett klassnamn får endast bestå av alfanumeriska tecken (inklusive unicode), understreck (_) och bindestreck (-).
Klassetikett
Om du behöver ange en etikett för en klass kan du använda följande syntax:
Kopiera
Bädda in
classDiagram
class Animal["Animal with a label"]
class Car["Car with *! symbols"]
Animal --> Car
Du kan också använda backticks (``) för att undvika specialtecken i etiketten:
Kopiera
Bädda in
classDiagram
class `Animal Class!`
class `Car Class`
`Animal Class!` --> `Car Class`
Definiera klassens medlemmar
UML tillhandahåller mekanismer för att representera klassmedlemmar (såsom egenskaper och metoder) samt tillhörande information om dem.
Mermaid skiljer egenskaper från funktioner eller metoder beroende på om parenteser () finns. De med () betraktas som funktioner eller metoder, resten betraktas som egenskaper.
Det finns två sätt att definiera klassens medlemmar; oavsett vilken syntax som används för att definiera medlemmarna blir resultatet detsamma. De två olika sätten är:
1. Använd ett kolon (:) följt av medlemsnamnet för att associera en klassmedlem; detta är användbart för att definiera en medlem i taget. Till exempel:
Kopiera
Bädda in
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +BigDecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
2. Använd klammerparenteser {} för att associera klassmedlemmar, där medlemmarna grupperas inom klammerparenteserna. Lämpligt för att definiera flera medlemmar på en gång. Till exempel:
Kopiera
Bädda in
classDiagram
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount)
+withdrawal(amount)
}
Returtyp
Du kan ange vilken datatyp som ska returneras i slutet av en metod- eller funktionsdefinition. Obs: det måste finnas ett mellanslag mellan den sista ')' och returtypen. Ett exempel:
Kopiera
Bädda in
classDiagram
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount) bool
+withdrawal(amount) int
}
Generisk typ
Generiska typer kan representeras som en del av en klassdefinition och kan också användas för klassmedlemmar eller returtyper. För att representera ett objekt som en generisk typ, omge typen med tilde (~). Nästlade typdeklarationer stöds, till exempel List<List<int>> , men generiska typer som innehåller kommatecken, som List<List<K, V>> , stöds för närvarande inte.
Kopiera
Bädda in
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~~
Synlighet
För att beskriva synligheten för en egenskap eller metod/funktion kan en valfri symbol användas före medlemsnamnet:
- + Offentlig
- - Privat
- # Skyddad
- ~ Intern
Definiera relationer
Relation är en allmän term som omfattar specifika typer av logiska kopplingar som finns i klassdiagram och objektdiagram.
Kopiera
Bädda in
[classA][Arrow][ClassB]
UML为类定义了八种不同类型的关系:
| Typ | Beskrivning |
|---|---|
| <|-- | Arv |
| *-- | Komposition |
| o-- | Aggregering |
| --> | Association |
| -- | Länk (fylld) |
| ..> | Beroende |
| ..|> | Implementering |
| .. | Länk (streckad) |
Kopiera
Bädda in
classDiagram
classA <|-- classB
classC *-- classD
classE o-- classF
classG <-- classH
classI -- classJ
classK <.. classL
classM <|.. classN
classO .. classP
Vi kan använda etiketter för att beskriva karaktären hos relationen mellan två klasser. Dessutom kan pilen också användas i omvänd riktning:
Kopiera
Bädda in
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)
Relationsetikett
Du kan lägga till etikettext till en relation:
Kopiera
Bädda in
[classA][Arrow][ClassB]:LabelText
Kopiera
Bädda in
classDiagram
classA <|-- classB : implements
classC *-- classD : composition
classE o-- classF : aggregation
Dubbelriktad relation
En dubbelriktad relation kan logiskt representera en N:M-association:
Kopiera
Bädda in
classDiagram
Animal <|--|> Zebra
语法如下:
Kopiera
Bädda in
[Relation Type][Link][Relation Type]
其中 Relation Type 是以下之一:
| Typ | Beskrivning |
|---|---|
| <| | Arv |
| * | Komposition |
| o | Aggregering |
| > | Association |
| < | Association |
| |> | Implementering |
Link är en av följande:
| Typ | Beskrivning |
|---|---|
| -- | Heldragen linje |
| .. | Streckad linje |
Klubba-gränssnitt
En klass kan också tilldelas en speciell relationstyp som definierar ett klubba-gränssnitt för klassen. Klubba-gränssnittet definieras med följande syntax:
- bar ()-- foo
- foo --() bar
Gränssnittet med klubban (bar) ansluts till klassen (foo).
Obs: varje definierat gränssnitt är unikt, i syfte att inte delas mellan klasser och inte tillåta flera anslutningar till det.
Kopiera
Bädda in
classDiagram
bar ()-- foo
Kopiera
Bädda in
classDiagram
class Class01 {
int amount
draw()
}
Class01 --() bar
Class02 --() bar
foo ()-- Class01
Definiera namnrymd
Namnrymder grupperar klasser.
Kopiera
Bädda in
classDiagram
namespace BaseShapes {
class Triangle
class Rectangle {
double width
double height
}
}
Relationsmultiplicitet/kardinalitet
Multiplicitet eller kardinalitet i ett klassdiagram anger hur många instanser av en klass som kan associeras med instanser av en annan klass. Till exempel har varje företag en eller flera anställda, inte noll, medan varje anställd för närvarande arbetar på noll eller ett företag.
Multiplicitetssymbolen placeras nära slutet av associationen.
De olika kardinalitetsalternativen är:
- 1 endast 1
- 0..1 0 eller 1
- 1..* 1 eller flera
- * 0 eller 1 eller flera
- n n (där n>1)
- 0..n 0 till n (där n>1)
- 1..n 1 till n (där n>1)
Kardinalitet kan enkelt definieras genom att omge textalternativet med dubbla citattecken ”“ före eller efter en given pil. Till exempel:
Kopiera
Bädda in
[classA] "cardinality1" [Arrow] "cardinality2" [ClassB]:LabelText
Kopiera
Bädda in
classDiagram
Customer "1" --> "*" Ticket
Student "1" --> "1..*" Course
Galaxy --> "many" Star : Contains
Klassannotering
Klasser kan annoteras med markörer för att tillhandahålla ytterligare metadata om klassen. Detta kan tydligare visa klassens karaktär. Några vanliga annoteringar inkluderar:
- <<Interface>> representerar en gränssnittsklass
- <<Abstract>> representerar en abstrakt klass
- <<Service>> representerar en tjänsteklass
- <<Enumeration>> representerar en uppräkning
Kommentarer definieras mellan inledande << och avslutande >>. Det finns tre sätt att lägga till kommentarer till en klass, och alla tre ger samma resultat:
- Infogat med klassdefinitionen
Kopiera
Bädda in
classDiagram
class Shape <<interface>>
På en separat rad efter att klassen definierats:
Kopiera
Bädda in
classDiagram
class Shape
<<interface>> Shape
Shape : noOfVertices
Shape : draw()
- I en nästlad struktur i klassdefinitionen:
Kopiera
Bädda in
classDiagram
class Shape{
<<interface>>
noOfVertices
draw()
}
class Color{
<<enumeration>>
RED
BLUE
GREEN
WHITE
BLACK
}
Kommentar
Du kan infoga kommentarer i ett klassdiagram, och redigeraren ignorerar kommentaren. En kommentar måste uppta en egen rad och börja med två procenttecken (%%). All text fram till nästa rad betraktas som en kommentar, inklusive all klassdiagram-syntax.
Kopiera
Bädda in
classDiagram
%% This whole line is a comment classDiagram class Shape <<interface>>
class Shape{
<<interface>>
noOfVertices
draw()
}
Ange diagrammets riktning
Du kan använda en riktningssats för att ange klassdiagrammets renderingsriktning:
Kopiera
Bädda in
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 binda klickhändelser till noder. Klickhändelser kan utlösa JavaScript-callback-funktioner eller öppna en länk som läses in i en ny webbläsarflik. Obs: denna funktion är inaktiverad med securityLevel='strict' och aktiverad med securityLevel='loose'.
Du kan definiera dessa åtgärder på en separat rad efter alla klassdeklarationer.
Kopiera
Bädda in
action className "reference" "tooltip"
click className call callback() "tooltip"
click className href "url" "tooltip"
- action är link eller callback, beroende på vilken typ av interaktion du vill anropa.
- className är det nod-id som är associerat med åtgärden.
- reference kan vara en URL-länk eller namnet på en callback-funktion.
- (Valfritt) verktygstipset är en sträng som visas när muspekaren hålls över ett element.
- Callback-funktionen anropas med nodeId som parameter.
Obs
Du kan lägga till en kommentar på diagrammet med note "line1 line2" . Du kan lägga till en kommentar för en specifik klass med note for <CLASS NAME> "line1 line2" .
Exempel
Kopiera
Bädda in
classDiagram
note "This is a general note"
note for MyClass "This is a note for a class"
class MyClass{
}
Webbadresslänk:
Kopiera
Bädda in
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
Medlemsruta
Du kan dölja den tomma medlemsrutan för en klassnod; detta görs genom att ändra värdet hideEmptyMembersBox i klassdiagrammets konfiguration.
Kopiera
Bädda in
---
config:
class:
hideEmptyMembersBox: true
---
classDiagram
class Duck