Processo Tipo
Expressão gráfica
Pensamento Tipo
Expressão estruturada
Anotações Tipo
Expressão eficiente

Diagrama de classesSintaxe

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.

Código
                            
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.
Código
                            
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).
Código
                            
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:

Código
                            
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:

Código
                            
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:

Código
                            
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:

Código
                            
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:

Código
                            
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>>.

Código
                            
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)
Código
                            
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:

Código
                            
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
Código
                            
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:

Código
                            
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.

Código
                            
Copiar
Incorporar
classDiagram bar ()-- foo
Código
                            
Copiar
Incorporar
classDiagram class Class01 { int amount draw() } Class01 --() bar Class02 --() bar foo ()-- Class01

Definir namespace

Os namespaces agrupam classes.

Código
                            
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
Código
                            
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:

Código
                            
Copiar
Incorporar
classDiagram class Shape <<interface>> Shape Shape : noOfVertices Shape : draw()
  • Na estrutura aninhada dentro da definição da classe:
Código
                            
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.

Código
                            
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:

Código
                            
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

Código
                            
Copiar
Incorporar
classDiagram note "This is a general note" note for MyClass "This is a note for a class" class MyClass{ }

Link de URL:

Código
                            
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.

Código
                            
Copiar
Incorporar
--- config: class: hideEmptyMembersBox: true --- classDiagram class Duck