Prozess Typ
Grafischer Ausdruck
Denken Typ
Strukturierter Ausdruck
Notizen Typ
Effizienter Ausdruck

KlassendiagrammSyntax

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.

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

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

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

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

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

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

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

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

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

Code
                            
Kopieren
Einbetten
classDiagram bar ()-- foo
Code
                            
Kopieren
Einbetten
classDiagram class Class01 { int amount draw() } Class01 --() bar Class02 --() bar foo ()-- Class01

Namensraum definieren

Namensräume gruppieren Klassen.

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

Code
                            
Kopieren
Einbetten
classDiagram class Shape <<interface>> Shape Shape : noOfVertices Shape : draw()
  • In der verschachtelten Struktur der Klassendefinition:
Code
                            
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.

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

Code
                            
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

Code
                            
Kopieren
Einbetten
classDiagram note "This is a general note" note for MyClass "This is a note for a class" class MyClass{ }

URL-Link:

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

Code
                            
Kopieren
Einbetten
--- config: class: hideEmptyMembersBox: true --- classDiagram class Duck