Diagrama de classes
O diagrama de classes é o principal bloco de construção da modelagem orientada a objetos. Ele é usado para a modelagem conceitual geral da estrutura de uma aplicação, bem como para a modelagem detalhada que converte o modelo em código de programação. O diagrama de classes também pode ser usado para modelagem de dados. As classes em um diagrama de classes representam tanto os principais elementos e interações de uma aplicação quanto as classes que precisam ser programadas.
Copiar
Incorporar
---
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()
}
Sintaxe
Classe
A UML oferece mecanismos para representar membros de uma classe, como atributos e métodos, e suas informações adicionais. Uma única instância de uma classe contém três partes:
- A parte superior contém o nome da classe. Ele é impresso em negrito e centralizado, com a primeira letra maiúscula. Também pode conter um texto de comentário opcional que descreve a natureza da classe.
- A parte do meio contém os atributos da classe. Eles são alinhados à esquerda e a primeira letra é minúscula.
- A parte inferior contém as operações que a classe pode executar. Elas também são alinhadas à esquerda e a primeira letra é minúscula.
Copiar
Incorporar
---
title: Bank example
---
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +Bigdecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
Definir uma classe
Há duas maneiras de definir uma classe
- Usar explicitamente a sintaxe class (como class Animal), o que definirá a classe Animal.
- Por meio de uma relação, que define ao mesmo tempo duas classes e a relação entre elas (como Vehicle <|-- Car).
Copiar
Incorporar
classDiagram
class Animal
Vehicle <|-- Car
Regra de nomenclatura: os nomes de classe só podem ser compostos por caracteres alfanuméricos (incluindo unicode), sublinhado (_) e hífen (-).
Rótulo da classe
Se você precisar fornecer um rótulo para uma classe, pode usar a seguinte sintaxe:
Copiar
Incorporar
classDiagram
class Animal["Animal with a label"]
class Car["Car with *! symbols"]
Animal --> Car
Você também pode usar crases (``) para escapar caracteres especiais no rótulo:
Copiar
Incorporar
classDiagram
class `Animal Class!`
class `Car Class`
`Animal Class!` --> `Car Class`
Definir os membros da classe
A UML oferece mecanismos para representar membros de uma classe (como atributos e métodos) e informações adicionais sobre eles.
O Mermaid distingue atributos de funções ou métodos com base na presença ou não de parênteses (). O que tiver () é considerado uma função ou método, e o restante é considerado um atributo.
Há duas maneiras de definir os membros de uma classe; independentemente da sintaxe usada para definir os membros, o resultado é o mesmo. As duas maneiras diferentes são:
1. Associar membros à classe usando dois-pontos (:) seguidos do nome do membro, o que é útil para definir um membro de cada vez. Por exemplo:
Copiar
Incorporar
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +BigDecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
2. Associar membros à classe usando chaves {}, agrupando os membros dentro das chaves. Adequado para definir vários membros de uma vez. Por exemplo:
Copiar
Incorporar
classDiagram
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount)
+withdrawal(amount)
}
Tipo de retorno
Você pode especificar o tipo de dado que será retornado no final da definição de um método ou função. Observação: deve haver um espaço entre o ')' final e o tipo de retorno. Um exemplo:
Copiar
Incorporar
classDiagram
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount) bool
+withdrawal(amount) int
}
Tipo genérico
Os tipos genéricos podem ser representados como parte de uma definição de classe, e também podem ser usados em membros de classe ou tipos de retorno. Para representar um item como tipo genérico, coloque o tipo entre til (~). Há suporte a declarações de tipo aninhadas, como List<List<int>>, mas atualmente não há suporte a tipos genéricos que contenham vírgulas, como List<List<K, V>>.
Copiar
Incorporar
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~~
Visibilidade
Para descrever a visibilidade de um atributo ou método/função, você pode usar um símbolo opcional antes do nome do membro:
- + Público
- - Privado
- # Protegido
- ~ Interno
Definir relações
Relação é um termo genérico que abrange os tipos específicos de conexão lógica encontrados em diagramas de classes e de objetos.
Copiar
Incorporar
[classA][Arrow][ClassB]
UML为类定义了八种不同类型的关系:
| Tipo | Descrição |
|---|---|
| <|-- | Herança |
| *-- | Composição |
| o-- | Agregação |
| --> | Associação |
| -- | Link (sólido) |
| ..> | Dependência |
| ..|> | Implementação |
| .. | Link (tracejado) |
Copiar
Incorporar
classDiagram
classA <|-- classB
classC *-- classD
classE o-- classF
classG <-- classH
classI -- classJ
classK <.. classL
classM <|.. classN
classO .. classP
Podemos usar rótulos para descrever a natureza da relação entre duas classes. Além disso, as setas também podem ser usadas no sentido inverso:
Copiar
Incorporar
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)
Rótulo da relação
É possível adicionar um texto de rótulo a uma relação:
Copiar
Incorporar
[classA][Arrow][ClassB]:LabelText
Copiar
Incorporar
classDiagram
classA <|-- classB : implements
classC *-- classD : composition
classE o-- classF : aggregation
Relação bidirecional
Uma relação bidirecional pode representar logicamente uma associação N:M:
Copiar
Incorporar
classDiagram
Animal <|--|> Zebra
语法如下:
Copiar
Incorporar
[Relation Type][Link][Relation Type]
其中 Relation Type 是以下之一:
| Tipo | Descrição |
|---|---|
| <| | Herança |
| * | Composição |
| o | Agregação |
| > | Associação |
| < | Associação |
| |> | Implementação |
Link é um dos seguintes:
| Tipo | Descrição |
|---|---|
| -- | Linha sólida |
| .. | Linha tracejada |
Interface pirulito
As classes também podem receber um tipo de relação especial, que define uma interface pirulito para a classe. A interface pirulito é definida com a seguinte sintaxe:
- bar ()-- foo
- foo --() bar
A interface com pirulito (bar) é conectada à classe (foo).
Observação: cada interface definida é única, com o objetivo de não ser compartilhada entre classes e não permitir que várias conexões apontem para ela.
Copiar
Incorporar
classDiagram
bar ()-- foo
Copiar
Incorporar
classDiagram
class Class01 {
int amount
draw()
}
Class01 --() bar
Class02 --() bar
foo ()-- Class01
Definir namespace
Os namespaces agrupam classes.
Copiar
Incorporar
classDiagram
namespace BaseShapes {
class Triangle
class Rectangle {
double width
double height
}
}
Cardinalidade/Multiplicidade da relação
A multiplicidade ou cardinalidade em um diagrama de classes representa a quantidade de instâncias de uma classe que podem estar associadas às instâncias de outra classe. Por exemplo, cada empresa terá um ou mais funcionários, nunca zero, enquanto cada funcionário trabalha atualmente em zero ou uma empresa.
O símbolo de multiplicidade é colocado próximo ao final da associação.
As diferentes opções de cardinalidade são:
- 1 Apenas 1
- 0..1 0 ou 1
- 1..* 1 ou mais
- * 0, 1 ou mais
- n n (onde n>1)
- 0..n 0 a n (onde n>1)
- 1..n 1 a n (onde n>1)
A cardinalidade pode ser definida facilmente colocando o texto da opção entre aspas duplas ”“ antes ou depois de uma determinada seta. Por exemplo:
Copiar
Incorporar
[classA] "cardinality1" [Arrow] "cardinality2" [ClassB]:LabelText
Copiar
Incorporar
classDiagram
Customer "1" --> "*" Ticket
Student "1" --> "1..*" Course
Galaxy --> "many" Star : Contains
Comentários da classe
É possível comentar uma classe usando marcações, a fim de fornecer metadados adicionais sobre ela. Isso pode deixar mais clara a natureza da classe. Alguns comentários comuns incluem:
- <<Interface>> representa uma classe de interface
- <<Abstract>> representa uma classe abstrata
- <<Service>> representa uma classe de serviço
- <<Enumeration>> representa uma enumeração
Os comentários são definidos entre << no início e >> no final. Há três maneiras de adicionar comentários a uma classe; as três produzem o mesmo resultado:
- Em linha com a definição da classe
Copiar
Incorporar
classDiagram
class Shape <<interface>>
Em uma linha separada após a definição da classe:
Copiar
Incorporar
classDiagram
class Shape
<<interface>> Shape
Shape : noOfVertices
Shape : draw()
- Na estrutura aninhada dentro da definição da classe:
Copiar
Incorporar
classDiagram
class Shape{
<<interface>>
noOfVertices
draw()
}
class Color{
<<enumeration>>
RED
BLUE
GREEN
WHITE
BLACK
}
Comentário
É possível inserir comentários em um diagrama de classes; o editor irá ignorá-los. Os comentários precisam ocupar uma linha própria e devem começar com dois sinais de porcentagem (%%). Todo o texto até a próxima linha será considerado comentário, incluindo qualquer sintaxe de diagrama de classes.
Copiar
Incorporar
classDiagram
%% This whole line is a comment classDiagram class Shape <<interface>>
class Shape{
<<interface>>
noOfVertices
draw()
}
Definir a direção do diagrama
Você pode usar uma instrução de direção para definir a direção de renderização do diagrama de classes:
Copiar
Incorporar
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
Interação
É possível vincular eventos de clique a nós. Os eventos de clique podem disparar uma função de callback JavaScript ou abrir um link que será carregado em uma nova aba do navegador. Observação: este recurso fica desativado com securityLevel='strict' e ativado com securityLevel='loose'.
Você pode definir essas operações em uma linha separada, após todas as declarações de classe.
Copiar
Incorporar
action className "reference" "tooltip"
click className call callback() "tooltip"
click className href "url" "tooltip"
- action é link ou callback, dependendo do tipo de interação que você deseja chamar.
- className é o id do nó associado à operação.
- reference pode ser um link URL ou o nome de uma função de callback.
- (Opcional) a dica de ferramenta é a string exibida quando o mouse passa sobre o elemento.
- A função de callback será chamada com nodeId como parâmetro.
Observação
É possível adicionar um comentário ao diagrama usando note "line1 line2". Também é possível adicionar um comentário a uma classe específica usando note for <CLASS NAME> "line1 line2".
Exemplo
Copiar
Incorporar
classDiagram
note "This is a general note"
note for MyClass "This is a note for a class"
class MyClass{
}
Link de URL:
Copiar
Incorporar
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"
Configuração
Caixa de membros
É possível ocultar a caixa de membros vazia de nós de classe; isso é feito alterando o valor hideEmptyMembersBox na configuração do diagrama de classes.
Copiar
Incorporar
---
config:
class:
hideEmptyMembersBox: true
---
classDiagram
class Duck