O que é um diagrama de classes e por que a maioria das pessoas desenha errado
Diagrama de classes é uma representação estática da estrutura de um sistema orientado a objetos. Ele mostra classes, atributos, métodos e os relacionamentos entre elas. Nada mais, nada menos. A confusão começa quando gente acha que diagrama de classes é coisa de documentação bonitinha pra entregar pro cliente. Não é. É ferramenta de projeto. Se você não usa pra decidir coisas, tá gastando tempo. Na prática, eu começo desenhando as classes centrais primeiro — aquelas que definem o domínio — e só depois entro nos detalhes. A ordem importa. Começar por classes utilitárias ou de infraestrutura gera diagramas que não representam nada que o sistema realmente faz.
Montando um diagrama de classes exemplo do zero
Vou mostrar com um caso real. Digamos que estamos modelando um sistema simples de pedidos para uma loja online. As classes relevantes são: Cliente, Produto, Pedido, ItemDoPedido e Pagamento. Simples, mas suficiente pra ilustrar. Cada classe tem atributos e métodos. No Cliente, temos nome, email, CPF e endereço. Os métodos incluem cadastrar(), atualizarDados() e listarPedidos(). No Produto, temos código, descricao, precoEstoque e os métodos adicionarEstoque(), reservarEstoque(). O Pedido agrupa dataPedido, status e total, com methods like criarItem(), calcularTotal() e finalizar(). O ItemDoPedido é a chave aqui — ele conecta Pedido a Produto com quantidade e precoUnitario. E o Pagamento tem tipo, valor, data e status, com processar() e confirmar().
Os relacionamentos determinam tudo. Cliente tem uma associação 1..* com Pedido — um cliente pode fazer vários pedidos, um pedido pertence a um único cliente. Pedido tem uma composição 1..* com ItemDoPedido — se o pedido for excluído, os itens somem junto. ItemDoPedido tem uma associação com Produto — quantos produtos num item? Só um, mas o mesmo produto pode aparecer em vários itens. Essa distinção entre associação e composição é onde a maioria erra. Na UML padrão, uso linhas sólidas pra associação, linha com diamante cheio pra composição, e linha com diamante vazio pra agregação. Setas indicam direção da navegação. Multiplicidades ficam perto de cada extremidade.
Quando eu faço isso num diagrama de classes exemplo, costumo usar uma ferramenta como Lucidchart, Draw.io ou até o Umbrello do KDE. O importante é que a ferramenta gere código a partir do diagrama ou vice-versa, senão ele viraria documentação morta em duas semanas.
O problema que ninguém conta sobre herança em diagramas de classes
Herança visual é confortável. Você desenha um triângulo, coloca uma seta, e pronto. Mas na prática, herança profunda — mais de dois níveis — transforma seu diagrama num espaguete que ninguém consegue ler depois de uma semana. Eu já vi diagramas com cinco níveis de herança e não fazia sentido nenhum. A solução que eu uso é limitar herança a dois níveis no máximo. Se precisa de mais, troque por composição. Isso não é opinião minha, é padrão do mercado. Frameworks como Spring e Django seguem essa lógica. Herança múltipla simplesmente não use em diagrama de classes exemplo. A sintaxe UML permite, mas a manutenção pratica elimina.
Outro detalhe prático: interfaces. Desenhar interfaces como classes com o estereótipo <
👉 Clique no botão abaixo para saber mais sobre o assunto!
Erros comuns que eu vejo todo dia
O primeiro erro é colocar métodos que não existem nas classes. Tipo adicionar um método recuperarDadosDoBanco() diretamente numa classe de domínio. Isso é responsabilidade de repositório, não da entidade. Separe claramente camadas no diagrama. O segundo erro é ignorar multiplicidades. Escrever "1 para muitos" numa frase, mas deixar a multiplicidade em branco no diagrama. Isso gera ambiguidade. Coloque 0..*, 1..*, ou o que for necessário.
O terceiro erro é não atualizar o diagrama depois de uma mudança de design. Diagrama desatualizado é pior que diagrama inexistente. Ele cria falsidade de confiança. Pessoas leem e acham que o sistema segue aquele modelo.
Limitações que precisam ser dito
Diagrama de classes não mostra fluxo de dados, comportamento em tempo de execução, ou lógica de negócio. Ele é estático. Se você precisa entender como o sistema funciona em operação, use diagrama de sequência junto. Diagrama de classes sozinho deixa lacunas enormes. Também não escala bem pra sistemas muito grandes. Mais de cinquenta classes no mesmo diagrama vira ilegível. Divida em subdiagramas por módulo ou por bounded context, especialmente se estiver seguindo Domain-Driven Design.
Para projetos pequenos, às vezes um simples esboço em papel com caixas e setas resolve mais rápido do que configurar ferramenta alguma. Não tem jeito de evitar o custo de ferramenta nessa fase inicial.
Como exportar e documentar
Se quiser um diagrama de classes exemplo pronto pra usar, existem templates no Draw.io que você pode baixar gratuitamente. Basta acessar draw.io, procurar por "class diagram" nos templates e adaptar. Também tem extensões no VS Code como "Draw.io Integration" que permitem salvar o diagrama como imagem PNG ou SVG diretamente do editor. Para documentação técnica, exporte em SVG. Imagens rasterizadas perdem qualidade ao ampliar, e diagrama de classes precisa ser legível em diferentes resoluções. PDF também funciona, mas SVG é preferível pra inclusão em wikis e repositórios.
Uma última coisa: guarde o arquivo fonte do diagrama junto com o código. Ferramentas como PlantUML permitem gerar diagramas a partir de texto, o que significa versionamento no git e diff legível. Isso resolve o problema de diagramas desatualizados na raiz — qualquer mudança no código pode triggering uma atualização automática do diagrama num pipeline de CI.