Diagrama de Classes UML: Estrutura, Notação e Aplicação na Engenharia de Software
O Diagrama de Classes é o principal artefato da Linguagem de Modelagem Unificada (UML – Unified Modeling Language) para representar a estrutura estática de sistemas orientados a objetos. Ele funciona como um blueprint do software, descrevendo suas classes, atributos, operações e os relacionamentos entre elas.
Exemplo Geral: Diagrama de Classes Básico
1. Classes, Objetos e Orientação a Objetos
- Classe: Uma abstração que define um conjunto de objetos com características (atributos) e comportamentos (operações) comuns.
- Objeto: Uma instância de uma classe em tempo de execução.
- Objetivo da OOP: Reduzir o gap semântico entre o problema real e o código.
2. O Diagrama de Classes no Contexto Ágil
Usado com propósito, ele complementa práticas ágeis ao facilitar comunicação, prevenir retrabalho e acelerar alinhamento.
3. Representação da Classe no UML
No UML, uma classe é representada por um retângulo dividido em até três compartimentos:
- Nome da classe: Escrito em negrito, no topo. Define a identidade do tipo (ex:
Cliente,Pedido). - Atributos: Listados no compartimento do meio. Cada atributo pode incluir:
- Visibilidade:
+(público),-(privado),#(protegido) - Nome e tipo (ex:
- nome: String)
- Visibilidade:
- Operações (métodos): No compartimento inferior. Cada operação pode incluir:
- Visibilidade (mesmos símbolos)
- Nome, parâmetros (com tipos) e tipo de retorno (ex:
+ calcularTotal(): BigDecimal)
A notação UML é flexível por design. Em muitos contextos — como reuniões de alinhamento ou esboços iniciais — é comum mostrar apenas o nome da classe, ou nome + atributos, omitindo métodos. O nível de detalhe deve refletir o propósito da comunicação, não uma exigência burocrática.
Níveis de Detalhe: Representações da classe Cliente
Da esquerda para a direita: (1) só nome, (2) com atributos, (3) com atributos e operações.
4. Relacionamentos Estruturais: Notação Precisa e Atualizada
No Diagrama de Classes UML, as relações estruturais representam ligações permanentes entre classes — ou seja, conexões que existem durante toda a vida do sistema (diferentes de interações temporárias, que são modeladas em diagramas de sequência). Esses relacionamentos definem como os objetos colaboram, se compõem e se especializam.
Existem quatro tipos fundamentais de relações estruturais, cada um com uma notação gráfica específica e um significado conceitual distinto:
1. Associação
O que é: Uma ligação semântica entre duas classes, indicando que uma classe conhece ou utiliza a outra.
Notação: Linha reta e contínua entre as classes.
Características:
- Pode ter multiplicidade (ex:
1,0..*,1..5) em cada extremidade, definindo quantos objetos participam do relacionamento. - Pode ter nome do papel (ex:
cliente,pedido) para esclarecer o papel de cada classe. - Não implica dependência de ciclo de vida: as classes podem existir independentemente.
Exemplo: Cliente ——— Pedido. Um cliente pode fazer vários pedidos, mas um pedido pode não existir sem um cliente. No entanto, se o cliente for excluído, o pedido pode persistir (ex: para fins fiscais), o que mostra independência de ciclo de vida.
2. Generalização (Herança)
O que é: Um relacionamento de especialização/generalização, onde uma classe filha (subclasse) herda atributos e operações de uma classe pai (superclasse).
Notação: Seta com triângulo vazio apontando para a superclasse.
Características:
- Também chamado de herança ou relação “é um” (is-a).
- Uma subclasse pode ampliar ou substituir comportamentos da superclasse.
- É um dos pilares da reutilização de código na orientação a objetos.
Exemplo: Cachorro ───▷ Animal. Um Cachorro é um Animal. Ele herda propriedades como nome e métodos como emitirSom(), mas pode ter comportamentos próprios como latir().
3. Agregação
O que é: Um tipo especial de associação que representa um relacionamento “tem um” fraco (has-a), onde o todo (contêiner) contém partes, mas não controla seu ciclo de vida.
Notação: Linha com losango vazado (◇) do lado da classe todo.
Características:
- As partes podem existir independentemente do todo.
- O relacionamento é de posse lógica, não de propriedade estrutural.
- Muito comum em modelagem de domínios organizacionais.
Exemplo: Departamento ◇—— Professor. Um departamento tem professores, mas se o departamento for extinto, os professores continuam existindo (podem ser transferidos ou demitidos, mas não “destruídos” junto com o departamento).
4. Composição
O que é: Um tipo de associação forte, onde o todo controla o ciclo de vida das partes. É um relacionamento “tem um” forte (tem-a).
Notação: Linha com losango preenchido (◆) do lado da classe todo.
Características:
- As partes não podem existir sem o todo.
- Quando o todo é destruído, todas as suas partes são destruídas.
- Representa propriedade exclusiva.
Exemplo: Carro ◆—— Motor. Um motor não existe como parte funcional fora do carro no contexto do sistema. Se o carro for sucateado, o motor (como componente do sistema) também é descartado.
📌 Regra Fundamental de Notação
O losango — seja vazado (agregação) ou preenchido (composição) — sempre está conectado à classe que representa o “TODO” (o contêiner).
Essa regra evita um dos erros mais comuns na modelagem UML: inverter o lado do losango.
Composição vs Agregação
Generalização (Herança)
Associação com Multiplicidade
🧩 Comparação Visual Rápida
| RELACIONAMENTO | NOTAÇÃO GRÁFICA | DEPENDÊNCIA DE CICLO DE VIDA? | EXEMPLO |
|---|---|---|---|
| Associação | ————— |
❌ Não | Cliente → Pedido |
| Generalização | ———▷ (triângulo vazio) |
N/A (herança) | Cachorro → Animal |
| Agregação | ◇——— |
❌ Não | Departamento → Professor |
| Composição | ◆——— |
✅ Sim | Carro → Motor |
✅ Quando usar cada um?
- Use associação para relacionamentos simples de uso.
- Use generalização apenas para verdadeiras especializações (evite herança por conveniência).
- Use agregação quando houver pertencimento lógico, mas independência de existência.
- Use composição quando tiver propriedade total e dependência de ciclo de vida.
5. Aplicações Práticas do Diagrama de Classes
- Modelagem de projeto: Definir estrutura antes de codificar.
- Engenharia reversa: Entender sistemas existentes.
- Esboço colaborativo: Alinhar ideias rapidamente.
Conclusão
O Diagrama de Classes é uma ferramenta poderosa quando usada com propósito. Em equipes ágeis, menos (mas bem feito) é mais.