Diagramma delle classi
Il diagramma delle classi è il principale blocco costitutivo della modellazione orientata agli oggetti. È usato per la modellazione concettuale generale della struttura di un'applicazione, nonché per la modellazione dettagliata della conversione di un modello in codice di programmazione. Il diagramma delle classi può essere usato anche per la modellazione dei dati. Le classi in un diagramma delle classi rappresentano sia gli elementi e le interazioni principali di un'applicazione sia le classi che devono essere programmate.
Copia
Incorpora
---
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()
}
Sintassi
Classe
UML fornisce meccanismi per rappresentare i membri di una classe, come proprietà e metodi, e le relative informazioni aggiuntive. Una singola istanza di una classe comprende tre parti:
- La parte superiore contiene il nome della classe. È stampato in grassetto e centrato, con l'iniziale maiuscola. Può anche contenere un testo di commento opzionale che descrive la natura della classe.
- La parte centrale contiene le proprietà della classe. Sono allineate a sinistra e con l'iniziale minuscola.
- La parte inferiore contiene le operazioni che la classe può eseguire. Anch'esse sono allineate a sinistra e con l'iniziale minuscola.
Copia
Incorpora
---
title: Bank example
---
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +Bigdecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
Definire una classe
Esistono due modi per definire una classe
- Usare esplicitamente la sintassi class (come class Animal), che definirà la classe Animal.
- Tramite una relazione, che definisce contemporaneamente due classi e la relazione tra esse (come Vehicle <|-- Car).
Copia
Incorpora
classDiagram
class Animal
Vehicle <|-- Car
Convenzione di denominazione: i nomi delle classi possono essere composti solo da caratteri alfanumerici (inclusi i caratteri unicode), underscore (_) e trattino (-).
Etichetta della classe
Se hai bisogno di fornire un'etichetta per una classe, puoi usare la seguente sintassi:
Copia
Incorpora
classDiagram
class Animal["Animal with a label"]
class Car["Car with *! symbols"]
Animal --> Car
Puoi anche usare i backtick (``) per eseguire l'escape dei caratteri speciali in un'etichetta:
Copia
Incorpora
classDiagram
class `Animal Class!`
class `Car Class`
`Animal Class!` --> `Car Class`
Definire i membri di una classe
UML fornisce meccanismi per rappresentare i membri di una classe (come proprietà e metodi) e le informazioni aggiuntive su di essi.
Mermaid distingue le proprietà dalle funzioni o dai metodi in base alla presenza o meno delle parentesi tonde (). Quelli con () sono considerati funzioni o metodi, tutti gli altri sono considerati proprietà.
Esistono due modi per definire i membri di una classe; indipendentemente dalla sintassi usata per definirli, il risultato è lo stesso. I due modi diversi sono:
1. Associare i membri a una classe usando i due punti (:) seguiti dal nome del membro; questo è utile per definire un singolo membro alla volta. Ad esempio:
Copia
Incorpora
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +BigDecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
2. Associare i membri a una classe usando le parentesi graffe {}, raggruppando i membri al loro interno. Adatto per definire più membri contemporaneamente. Ad esempio:
Copia
Incorpora
classDiagram
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount)
+withdrawal(amount)
}
Tipo restituito
Puoi specificare il tipo di dato che verrà restituito alla fine della definizione di un metodo o di una funzione. Nota: tra l'ultima ')' e il tipo restituito deve esserci uno spazio. Un esempio:
Copia
Incorpora
classDiagram
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount) bool
+withdrawal(amount) int
}
Tipo generico
I tipi generici possono essere rappresentati come parte della definizione di una classe oppure usati nei membri di una classe o come tipo restituito. Per rappresentare un elemento come tipo generico, racchiudi il tipo tra tilde (~). Sono supportate le dichiarazioni di tipi annidati, ad esempio List<List<int>>, ma attualmente non sono supportati i tipi generici contenenti virgole, come List<List<K, V>>.
Copia
Incorpora
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~~
Visibilità
Per descrivere la visibilità di una proprietà o di un metodo/funzione, puoi usare un simbolo opzionale davanti al nome del membro:
- + Pubblico
- - Privato
- # Protetto
- ~ Interno
Definire le relazioni
Relazione è un termine generico che comprende i tipi specifici di connessione logica che si trovano nei diagrammi delle classi e degli oggetti.
Copia
Incorpora
[classA][Arrow][ClassB]
UML为类定义了八种不同类型的关系:
| Tipo | Descrizione |
|---|---|
| <|-- | Ereditarietà |
| *-- | Composizione |
| o-- | Aggregazione |
| --> | Associazione |
| -- | Collegamento (pieno) |
| ..> | Dipendenza |
| ..|> | Realizzazione |
| .. | Collegamento (tratteggiato) |
Copia
Incorpora
classDiagram
classA <|-- classB
classC *-- classD
classE o-- classF
classG <-- classH
classI -- classJ
classK <.. classL
classM <|.. classN
classO .. classP
Possiamo usare un'etichetta per descrivere la natura della relazione tra due classi. Inoltre, la freccia può anche essere usata in direzione inversa:
Copia
Incorpora
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)
Etichetta della relazione
Puoi aggiungere un testo di etichetta a una relazione:
Copia
Incorpora
[classA][Arrow][ClassB]:LabelText
Copia
Incorpora
classDiagram
classA <|-- classB : implements
classC *-- classD : composition
classE o-- classF : aggregation
Relazione bidirezionale
Una relazione bidirezionale può logicamente rappresentare un'associazione N:M:
Copia
Incorpora
classDiagram
Animal <|--|> Zebra
语法如下:
Copia
Incorpora
[Relation Type][Link][Relation Type]
其中 Relation Type 是以下之一:
| Tipo | Descrizione |
|---|---|
| <| | Ereditarietà |
| * | Composizione |
| o | Aggregazione |
| > | Associazione |
| < | Associazione |
| |> | Realizzazione |
Link è uno dei seguenti:
| Tipo | Descrizione |
|---|---|
| -- | Linea continua |
| .. | Linea tratteggiata |
Interfaccia a lecca-lecca
Alle classi si può anche assegnare un tipo di relazione speciale, che definisce per la classe un'interfaccia a lecca-lecca. L'interfaccia a lecca-lecca è definita con la seguente sintassi:
- bar ()-- foo
- foo --() bar
Un'interfaccia con lecca-lecca (bar) è collegata a una classe (foo).
Nota: ogni interfaccia definita è unica, allo scopo di non essere condivisa tra le classi e di non consentire a più collegamenti di puntare ad essa.
Copia
Incorpora
classDiagram
bar ()-- foo
Copia
Incorpora
classDiagram
class Class01 {
int amount
draw()
}
Class01 --() bar
Class02 --() bar
foo ()-- Class01
Definire un namespace
I namespace raggruppano le classi.
Copia
Incorpora
classDiagram
namespace BaseShapes {
class Triangle
class Rectangle {
double width
double height
}
}
Cardinalità/molteplicità di una relazione
La molteplicità o cardinalità in un diagramma delle classi indica il numero di istanze di una classe che possono essere associate alle istanze di un'altra classe. Ad esempio, ogni azienda ha uno o più dipendenti, mai zero, mentre ogni dipendente lavora attualmente per zero o una azienda.
Il simbolo di molteplicità è posizionato vicino all'estremità dell'associazione.
Le diverse opzioni di cardinalità sono:
- 1 esattamente 1
- 0..1 0 o 1
- 1..* 1 o più
- * 0, 1 o più
- n n (dove n>1)
- 0..n da 0 a n (dove n>1)
- 1..n da 1 a n (dove n>1)
La cardinalità può essere definita facilmente racchiudendo l'opzione di testo tra virgolette doppie "" prima o dopo una determinata freccia. Ad esempio:
Copia
Incorpora
[classA] "cardinality1" [Arrow] "cardinality2" [ClassB]:LabelText
Copia
Incorpora
classDiagram
Customer "1" --> "*" Ticket
Student "1" --> "1..*" Course
Galaxy --> "many" Star : Contains
Annotazione della classe
Puoi annotare una classe usando uno stereotipo, per fornire metadati aggiuntivi sulla classe. Questo può indicare più chiaramente la natura della classe. Alcune annotazioni comuni includono:
- <<Interface>> rappresenta una classe di tipo interfaccia
- <<Abstract>> rappresenta una classe astratta
- <<Service>> rappresenta una classe di servizio
- <<Enumeration>> rappresenta un'enumerazione
Un commento è definito tra << all'inizio e >> alla fine. Esistono tre modi per aggiungere un commento a una classe, e tutti e tre producono lo stesso risultato:
- In linea con la definizione della classe
Copia
Incorpora
classDiagram
class Shape <<interface>>
Su una riga separata dopo la definizione della classe:
Copia
Incorpora
classDiagram
class Shape
<<interface>> Shape
Shape : noOfVertices
Shape : draw()
- Nella struttura annidata della definizione della classe:
Copia
Incorpora
classDiagram
class Shape{
<<interface>>
noOfVertices
draw()
}
class Color{
<<enumeration>>
RED
BLUE
GREEN
WHITE
BLACK
}
Commento
Puoi inserire commenti in un diagramma delle classi; l'editor li ignorerà. I commenti devono occupare una riga propria e devono iniziare con il doppio segno di percentuale (%%). Tutto il testo fino alla riga successiva sarà considerato un commento, inclusa qualsiasi sintassi del diagramma delle classi.
Copia
Incorpora
classDiagram
%% This whole line is a comment classDiagram class Shape <<interface>>
class Shape{
<<interface>>
noOfVertices
draw()
}
Impostare la direzione del diagramma
Puoi usare l'istruzione di direzione per impostare la direzione di rendering del diagramma delle classi:
Copia
Incorpora
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
Interazione
Puoi associare eventi di clic ai nodi. Un evento di clic può attivare una funzione di callback JavaScript oppure aprire un link che verrà caricato in una nuova scheda del browser. Nota: questa funzionalità è disabilitata con securityLevel='strict' e abilitata con securityLevel='loose'.
Puoi definire queste operazioni su una riga separata dopo tutte le dichiarazioni delle classi.
Copia
Incorpora
action className "reference" "tooltip"
click className call callback() "tooltip"
click className href "url" "tooltip"
- action è link oppure callback, a seconda del tipo di interazione che vuoi richiamare.
- className è l'id del nodo associato all'operazione.
- reference può essere un link URL oppure il nome di una funzione di callback.
- (Opzionale) Il tooltip è la stringa mostrata quando il mouse passa sopra l'elemento.
- La funzione di callback verrà chiamata con nodeId come parametro.
Nota
Puoi aggiungere una nota al diagramma usando note "line1 line2". Puoi aggiungere una nota a una classe specifica usando note for <CLASS NAME> "line1 line2".
Esempio
Copia
Incorpora
classDiagram
note "This is a general note"
note for MyClass "This is a note for a class"
class MyClass{
}
Link URL:
Copia
Incorpora
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"
Configurazione
Riquadro dei membri
Puoi nascondere il riquadro vuoto dei membri di un nodo classe; questo si fa modificando il valore hideEmptyMembersBox nella configurazione del diagramma delle classi.
Copia
Incorpora
---
config:
class:
hideEmptyMembersBox: true
---
classDiagram
class Duck