Klassendiagramm
Klassendiagramme sind der Hauptbaustein der objektorientierten Modellierung. Sie werden für die allgemeine konzeptionelle Modellierung der Anwendungsstruktur sowie für die detaillierte Modellierung verwendet, um das Modell in Programmcode umzuwandeln. Klassendiagramme können auch für die Datenmodellierung verwendet werden. Klassen in einem Klassendiagramm stellen sowohl die wichtigsten Elemente und Interaktionen in einer Anwendung als auch die Klassen dar, die programmiert werden müssen.
Kopieren
Einbetten
---
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
Klasse
UML bietet Mechanismen zur Darstellung von Klassenmitgliedern wie Eigenschaften und Methoden sowie deren zusätzlicher Informationen. Eine einzelne Instanz einer Klasse besteht aus drei Teilen:
- Der obere Teil enthält den Namen der Klasse. Er wird fett und zentriert gedruckt, der erste Buchstabe großgeschrieben. Er kann auch einen optionalen Kommentartext enthalten, der die Art der Klasse beschreibt.
- Der mittlere Teil enthält die Eigenschaften der Klasse. Sie sind linksbündig und beginnen mit einem Kleinbuchstaben.
- Der untere Teil enthält die Operationen, die die Klasse ausführen kann. Sie sind ebenfalls linksbündig und beginnen mit einem Kleinbuchstaben.
Kopieren
Einbetten
---
title: Bank example
---
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +Bigdecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
Eine Klasse definieren
Es gibt zwei Möglichkeiten, eine Klasse zu definieren
- Durch explizite Verwendung der class-Syntax (z. B. class Animal), wodurch die Klasse Animal definiert wird.
- Durch eine Beziehung, die gleichzeitig zwei Klassen und die Beziehung zwischen ihnen definiert (z. B. Vehicle <|-- Car).
Kopieren
Einbetten
classDiagram
class Animal
Vehicle <|-- Car
Benennungsregeln: Ein Klassenname darf nur aus alphanumerischen Zeichen (einschließlich Unicode), Unterstrichen (_) und Bindestrichen (-) bestehen.
Klassenlabel
Wenn du ein Label für eine Klasse angeben möchtest, kannst du die folgende Syntax verwenden:
Kopieren
Einbetten
classDiagram
class Animal["Animal with a label"]
class Car["Car with *! symbols"]
Animal --> Car
Du kannst auch Backticks (``) verwenden, um Sonderzeichen im Label zu escapen:
Kopieren
Einbetten
classDiagram
class `Animal Class!`
class `Car Class`
`Animal Class!` --> `Car Class`
Mitglieder einer Klasse definieren
UML bietet Mechanismen zur Darstellung von Klassenmitgliedern (wie Eigenschaften und Methoden) sowie zusätzlicher Informationen darüber.
Mermaid unterscheidet anhand des Vorhandenseins von Klammern () zwischen Eigenschaften und Funktionen oder Methoden. Elemente mit () werden als Funktion oder Methode betrachtet, alle übrigen gelten als Eigenschaften.
Es gibt zwei Möglichkeiten, die Mitglieder einer Klasse zu definieren. Unabhängig davon, welche Syntax zur Definition der Mitglieder verwendet wird, ist das Ausgabeergebnis identisch. Die beiden unterschiedlichen Möglichkeiten sind:
1. Verwende einen Doppelpunkt (:), gefolgt vom Mitgliedsnamen, um ein Mitglied der Klasse zuzuordnen. Dies ist nützlich, um jeweils ein Mitglied zu definieren. Zum Beispiel:
Kopieren
Einbetten
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +BigDecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
2. Verwende geschweifte Klammern {}, um die Mitglieder der Klasse zuzuordnen, wobei die Mitglieder innerhalb der geschweiften Klammern gruppiert werden. Geeignet, um mehrere Mitglieder auf einmal zu definieren. Zum Beispiel:
Kopieren
Einbetten
classDiagram
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount)
+withdrawal(amount)
}
Rückgabetyp
Du kannst den zurückzugebenden Datentyp am Ende der Methoden- oder Funktionsdefinition angeben. Hinweis: Zwischen dem letzten ')' und dem Rückgabetyp muss ein Leerzeichen stehen. Ein Beispiel:
Kopieren
Einbetten
classDiagram
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount) bool
+withdrawal(amount) int
}
Generischer Typ
Generische Typen können als Teil einer Klassendefinition dargestellt sowie für Klassenmitglieder oder Rückgabetypen verwendet werden. Um ein Element als generischen Typ darzustellen, schließe den Typ in Tilden (~) ein. Verschachtelte Typdeklarationen wie List<List<int>> werden unterstützt, aber generische Typen mit Kommas wie List<List<K, V>> werden derzeit nicht unterstützt.
Kopieren
Einbetten
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~~
Sichtbarkeit
Um die Sichtbarkeit einer Eigenschaft oder Methode/Funktion zu beschreiben, kann vor dem Namen des Mitglieds ein optionales Symbol verwendet werden:
- + Öffentlich
- - Privat
- # Geschützt
- ~ Intern
Beziehung definieren
Beziehung ist ein allgemeiner Begriff, der bestimmte Arten logischer Verbindungen abdeckt, die in Klassendiagrammen und Objektdiagrammen vorkommen.
Kopieren
Einbetten
[classA][Arrow][ClassB]
UML为类定义了八种不同类型的关系:
| Typ | Beschreibung |
|---|---|
| <|-- | Vererbung |
| *-- | Komposition |
| o-- | Aggregation |
| --> | Assoziation |
| -- | Link (durchgezogen) |
| ..> | Abhängigkeit |
| ..|> | Realisierung |
| .. | Link (gestrichelt) |
Kopieren
Einbetten
classDiagram
classA <|-- classB
classC *-- classD
classE o-- classF
classG <-- classH
classI -- classJ
classK <.. classL
classM <|.. classN
classO .. classP
Wir können Labels verwenden, um die Art der Beziehung zwischen zwei Klassen zu beschreiben. Außerdem können Pfeile auch in umgekehrter Richtung verwendet werden:
Kopieren
Einbetten
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)
Beziehungslabel
Der Beziehung kann ein Labeltext hinzugefügt werden:
Kopieren
Einbetten
[classA][Arrow][ClassB]:LabelText
Kopieren
Einbetten
classDiagram
classA <|-- classB : implements
classC *-- classD : composition
classE o-- classF : aggregation
Bidirektionale Beziehung
Eine bidirektionale Beziehung kann logisch eine N:M-Assoziation darstellen:
Kopieren
Einbetten
classDiagram
Animal <|--|> Zebra
语法如下:
Kopieren
Einbetten
[Relation Type][Link][Relation Type]
其中 Relation Type 是以下之一:
| Typ | Beschreibung |
|---|---|
| <| | Vererbung |
| * | Komposition |
| o | Aggregation |
| > | Assoziation |
| < | Assoziation |
| |> | Realisierung |
Link ist eines der folgenden:
| Typ | Beschreibung |
|---|---|
| -- | Durchgezogene Linie |
| .. | Gestrichelte Linie |
Lollipop-Schnittstelle
Einer Klasse kann auch ein besonderer Beziehungstyp zugewiesen werden, der eine Lollipop-Schnittstelle für die Klasse definiert. Die Lollipop-Schnittstelle wird mit folgender Syntax definiert:
- bar ()-- foo
- foo --() bar
Die Schnittstelle mit Lollipop (bar) wird mit der Klasse (foo) verbunden.
Hinweis: Jede definierte Schnittstelle ist eindeutig, mit dem Ziel, sie nicht zwischen Klassen zu teilen und nicht zuzulassen, dass mehrere Verbindungen auf sie zeigen.
Kopieren
Einbetten
classDiagram
bar ()-- foo
Kopieren
Einbetten
classDiagram
class Class01 {
int amount
draw()
}
Class01 --() bar
Class02 --() bar
foo ()-- Class01
Namensraum definieren
Namensräume gruppieren Klassen.
Kopieren
Einbetten
classDiagram
namespace BaseShapes {
class Triangle
class Rectangle {
double width
double height
}
}
Kardinalität/Multiplizität der Beziehung
Die Multiplizität oder Kardinalität in einem Klassendiagramm gibt an, wie viele Instanzen einer Klasse mit Instanzen einer anderen Klasse verknüpft sein können. Zum Beispiel hat jedes Unternehmen einen oder mehrere Mitarbeiter, aber nie null, während jeder Mitarbeiter derzeit bei null oder einem Unternehmen beschäftigt ist.
Das Multiplizitätssymbol wird nahe dem Ende der Assoziation platziert.
Die verschiedenen Kardinalitätsoptionen sind:
- 1 nur 1
- 0..1 0 oder 1
- 1..* 1 oder mehr
- * 0 oder 1 oder mehr
- n n (wobei n>1)
- 0..n 0 bis n (wobei n>1)
- 1..n 1 bis n (wobei n>1)
Die Kardinalität kann einfach definiert werden, indem die Textoption vor oder nach dem jeweiligen Pfeil in doppelte Anführungszeichen ”“ gesetzt wird. Zum Beispiel:
Kopieren
Einbetten
[classA] "cardinality1" [Arrow] "cardinality2" [ClassB]:LabelText
Kopieren
Einbetten
classDiagram
Customer "1" --> "*" Ticket
Student "1" --> "1..*" Course
Galaxy --> "many" Star : Contains
Annotationen der Klasse
Klassen können mit Markierungen annotiert werden, um zusätzliche Metadaten über die Klasse bereitzustellen. Dadurch kann die Art der Klasse klarer angegeben werden. Einige gängige Annotationen sind:
- <<Interface>> Stellt eine Schnittstellenklasse dar
- <<Abstract>> Stellt eine abstrakte Klasse dar
- <<Service>> Stellt eine Dienstklasse dar
- <<Enumeration>> Stellt eine Enumeration dar
Annotationen werden am Anfang mit << und am Ende mit >> definiert. Es gibt drei Möglichkeiten, einer Klasse eine Annotation hinzuzufügen; alle drei Methoden liefern dasselbe Ergebnis:
- Inline mit der Klassendefinition
Kopieren
Einbetten
classDiagram
class Shape <<interface>>
In einer separaten Zeile nach der Definition der Klasse:
Kopieren
Einbetten
classDiagram
class Shape
<<interface>> Shape
Shape : noOfVertices
Shape : draw()
- In der verschachtelten Struktur der Klassendefinition:
Kopieren
Einbetten
classDiagram
class Shape{
<<interface>>
noOfVertices
draw()
}
class Color{
<<enumeration>>
RED
BLUE
GREEN
WHITE
BLACK
}
Kommentar
In einem Klassendiagramm können Kommentare eingegeben werden, die der Editor ignoriert. Ein Kommentar muss eine eigene Zeile einnehmen und mit einem doppelten Prozentzeichen (%%) beginnen. Der gesamte Text bis zur nächsten Zeile wird als Kommentar betrachtet, einschließlich jeglicher Klassendiagramm-Syntax.
Kopieren
Einbetten
classDiagram
%% This whole line is a comment classDiagram class Shape <<interface>>
class Shape{
<<interface>>
noOfVertices
draw()
}
Richtung des Diagramms festlegen
Du kannst mit einer Richtungsanweisung die Rendering-Richtung des Klassendiagramms festlegen:
Kopieren
Einbetten
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
An einen Knoten kann ein Klickereignis gebunden werden. Das Klickereignis kann eine JavaScript-Callback-Funktion auslösen oder einen Link öffnen, der in einem neuen Browser-Tab geladen wird. Hinweis: Diese Funktion ist deaktiviert, wenn securityLevel='strict' verwendet wird, und aktiviert, wenn securityLevel='loose' verwendet wird.
Du kannst diese Operationen in einer separaten Zeile nach allen Klassendeklarationen definieren.
Kopieren
Einbetten
action className "reference" "tooltip"
click className call callback() "tooltip"
click className href "url" "tooltip"
- action ist link oder callback, je nachdem, welchen Interaktionstyp du aufrufen möchtest.
- className ist die Knoten-id, die mit der Operation verknüpft ist.
- reference kann eine URL sein oder der Name einer Callback-Funktion.
- (Optional) Der Tooltip ist eine Zeichenkette, die angezeigt wird, wenn die Maus über einem Element schwebt.
- Die Callback-Funktion wird mit nodeId als Parameter aufgerufen.
Hinweis
Mit note "line1 line2" kann ein Kommentar zum Diagramm hinzugefügt werden. Mit note for <CLASS NAME> "line1 line2" kann ein Kommentar für eine bestimmte Klasse hinzugefügt werden.
Beispiel
Kopieren
Einbetten
classDiagram
note "This is a general note"
note for MyClass "This is a note for a class"
class MyClass{
}
URL-Link:
Kopieren
Einbetten
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
Mitgliederfeld
Das leere Mitgliederfeld von Klassenknoten kann ausgeblendet werden, was durch Ändern des Werts hideEmptyMembersBox in der Klassendiagramm-Konfiguration erfolgt.
Kopieren
Einbetten
---
config:
class:
hideEmptyMembersBox: true
---
classDiagram
class Duck