a representação visual de arquiteturas é essencial para discutir e apresentar soluções técnicas. a escolha do diagrama e seu nível de detalhamento deve sempre considerar o público-alvo e o objetivo da comunicação.
padrões formais de diagramação
UML (Unified Modeling Language)
surgiu para unificar a modelagem de sistemas. embora extenso, os diagramas mais utilizados hoje são:
diagrama de classes (estrutura estática)
é o diagrama mais fundamental da UML. representa a estrutura do sistema, não o que acontece ao longo do tempo. seus principais elementos são:
- classes: os retângulos (
Cliente,Pedido) - atributos: as variáveis/dados (
nome,dataetc). é usada a notação+para atributos públicos e-para atributos privados - métodos: as funções de cada classe (
fazerLogin(),calcularTotal()) - relações: as linhas que conectam as classes (
realiza, ex:Cliente tem 1 para muitos (*) Pedidos)
classDiagram Cliente "1" --> "*" Pedido : realiza class Cliente { +String nome -String cpf +fazerLogin() } class Pedido { +Integer id +Date data +adicionarItem() +fecharPedido() }
diagrama de sequência (comportamento dinâmico)
foca na interação e na ordem dos eventos, mostrando a troca de informações entre os componentes ao longo do tempo. seus principais elementos são:
- atores/participantes: quem está interagindo (
Usuário,API,Banco de Dadosetc) - lifelines: as linhas pontilhadas verticais. o tempo corre de cima para baixo
- mensagens: setas que vão de uma linha à outra. seta cheia (
-->) significa requisição, seta pontilhada (-- ->) significa retorno.
sequenceDiagram autonumber participant U as Usuário participant F as Frontend participant A as API participant B as Banco de Dados U->>F: Clica em "Finalizar Compra" rect rgb(240, 248, 255) Note right of F: Início do fluxo transacional F->>A: POST /v1/checkout activate A A->>A: Valida Estoque A->>B: INSERT pedido B-->>A: Retorna ID (201) A-->>F: HTTP 201 Created deactivate A end F-->>U: Exibe "Sucesso"
C4 Model
criado para preencher as lacunas de visualização de arquitetura deixadas pela UML (com foco em código). propõe 4 níveis de abstração (zoom-in):
nível 1: context
é o nível mais alto, tem o objetivo de mostrar o big picture. representa o sistema inserido no ambiente, usuários e integrações externas.
C4Context title Diagrama de Contexto - Sistema de Vendas Person(cliente, "Cliente", "Pessoa que realiza compras online") Person(admin, "Administrador", "Gerencia o catálogo e pedidos") System(sistemaVendas, "Sistema de Vendas", "Permite comprar produtos e gerenciar pedidos") System_Ext(gatewayPagamento, "Gateway de Pagamento", "Processa os pagamentos (ex: Stripe, PayPal)") System_Ext(sistemaEmail, "Sistema de E-mail", "Envia confirmações para os clientes") Rel(cliente, sistemaVendas, "Visualiza produtos e faz compras", "HTTPS") Rel(admin, sistemaVendas, "Gerencia produtos", "HTTPS") Rel(sistemaVendas, gatewayPagamento, "Processa pagamentos", "API/HTTPS") Rel(sistemaVendas, sistemaEmail, "Envia e-mails", "SMTP")
nível 2: container
o objetivo é “dar um zoom” no sistema para mostrar as aplicações, APIs, bancos de dados etc que os compõem.
C4Container title Diagrama de Contêiner - Sistema de Vendas Person(cliente, "Cliente", "Pessoa que realiza compras") Container_Boundary(bSistemaVendas, "Sistema de Vendas") { Container(webApp, "Web App", "React/Next.js", "Interface principal para o cliente") Container(mobileApp, "Mobile App", "Flutter", "App para compras via celular") Container(api, "API Backend", "Java/Spring Boot", "Lógica de negócios e orquestração") ContainerDb(database, "Banco de Dados", "PostgreSQL", "Armazena pedidos, clientes e catálogo") } System_Ext(gatewayPagamento, "Gateway de Pagamento", "Processa pagamentos") Rel(cliente, webApp, "Visita", "HTTPS") Rel(cliente, mobileApp, "Usa", "HTTPS") Rel(webApp, api, "Chama", "JSON/HTTPS") Rel(mobileApp, api, "Chama", "JSON/HTTPS") Rel(api, database, "Lê e Escreve", "JDBC") Rel(api, gatewayPagamento, "Processa transações", "API/HTTPS")
nível 3: componente
é opcional, e entra nos detalhes internos de um container, para mostrar sua estrutura (por exemplo, os controllers, services e repositories de uma API).
C4Component title Diagrama de Componentes - API Backend Container(webApp, "Web App", "React", "Envia requisições") ContainerDb(database, "Banco de Dados", "PostgreSQL", "Persistência") Container_Boundary(api, "API Backend") { Component(signController, "Sign In Controller", "Spring MVC", "Gerencia autenticação e tokens") Component(compraController, "Compra Controller", "Spring MVC", "Recebe requisições de compra") Component(seguranca, "Componente de Segurança", "Spring Security", "Valida permissões") Component(pagamentoService, "Serviço de Pagamento", "Classe Java", "Regras de negócio de pagamento") Component(repositorio, "Repositório de Pedidos", "JPA/Hibernate", "Abstração do banco de dados") } Rel(webApp, signController, "Faz login", "JSON/HTTPS") Rel(webApp, compraController, "Envia pedido", "JSON/HTTPS") Rel(signController, seguranca, "Usa") Rel(compraController, seguranca, "Usa") Rel(compraController, pagamentoService, "Chama") Rel(pagamentoService, repositorio, "Salva dados") Rel(repositorio, database, "SQL", "JDBC")
nível 4: código
é opcional e pouco usado. não tem notação específica, ficando livre para usar qual quiser (UML, por exemplo).
abordagens ad hoc
nem todo diagrama precisa seguir um padrão, como UML ou C4. em diagramas com propósitos específicos, é possível usar abordagens ad hoc, desde que sejam claros e atendam ao objetivo da arquitetura.
diagrama precisa de objetivo de acordo com a proposta nem todo diagrama precisa seguir um padrão → diagramas ad hoc (para propósitos específicos que podem substituir os padrões, desde que sejam claros e atendam ao objetivo da arquitetura)
diagramas de baixa fidelidade
podem ser usados no início do esboço de uma arquitetura (boards, desenhos etc), como representações simples e temporárias. permite maior flexibilidade e estimula a colaboração.
guidelines para uma boa diagramação
para reduzir a carga cognitiva (keep it simple) e garantir o entendimento, é necessário que o diagrama tenha::
- clareza e coesão, sendo capaz de contar a história da estrutura
- títulos claros nos diagramas e nomes descritivos nos componentes
- conexões bem definidas (direção do fluxo)
- consistência, mantendo um padrão visual sem variar estilos
- uso de cores para diferenciar tipos de elementos (ex: azul para interno, cinza para externo), não apenas para estética
- legendas para decodificar símbolos e cores
⚠️ anti-padrão: apego irracional ao artefato
ocorre quando o profissional defende um diagrama impreciso só porque investiu muito tempo criando-o.
"quanto mais tempo e esforço você investir no planejamento ou em um documento, maior será a probabilidade de você proteger o que está contido no plano ou documento, mesmo diante de evidências de que ele é impreciso ou desatualizado." — Neal Ford