Pular para o conteúdo principal

Conceitointermediário

Diagramas de Componente

Visão Geral

Um diagrama de componente mostra o interior de um contêiner: os agrupamentos lógicos de código e como eles se relacionam.

É o terceiro nível do modelo C4, e o primeiro cuja necessidade precisa ser justificada. Contexto e contêiner quase sempre valem a pena. Componente, raramente.

A razão é econômica: ele descreve o que muda mais rápido, e por isso desatualiza mais rápido — e a informação que ele carrega já está no código, disponível para quem abrir o projeto.

Problema

Uma pessoa nova recebe a tarefa de mudar o cálculo de frete. Ela sabe, pelo diagrama de contêiner, que isso vive na API de Pedidos. Abre o projeto e encontra 240 arquivos.

O diagrama de contêiner parou cedo demais para essa pergunta.

Mas a resposta óbvia — desenhar todos os componentes de todos os contêineres — produz um custo que raramente se paga:

um sistema com 8 contêineres
cada um com 10 a 20 componentes
= 8 diagramas que mudam a cada refatoração interna

Depois de três meses, eles descrevem uma estrutura que não existe mais, e a pessoa nova é mandada para um mapa errado — o que é pior que não ter mapa.

Conceitos Centrais

O que é um componente aqui

Um agrupamento de código com responsabilidade coesa e interface identificável, dentro de um contêiner:

sim Controlador de Pedidos, Calculadora de Frete, Repositório de Clientes,
Cliente de Pagamento, Validador de Cupom
não uma classe, um pacote qualquer, uma camada inteira

O componente não é implantável separadamente — se fosse, seria contêiner. Ele é uma unidade de organização interna.

E o critério prático: o componente é algo que você nomearia numa conversa sobre onde mexer.

Ele custa mais do que parece

Este é o ponto central:

contexto muda quando o sistema muda de propósito — anos
contêiner muda quando uma peça é criada ou removida — meses
componente muda a cada refatoração interna — semanas

O diagrama de componente tem a meia-vida mais curta dos três, e o mesmo custo de manutenção manual. Ver princípios de documentação.

Um diagrama desatualizado neste nível é ativamente prejudicial: ele afirma uma estrutura com precisão suficiente para ser seguida, e está errado.

Quando ele se paga

Poucos casos, e todos específicos:

contêiner grande e complexo, com mais de 15 componentes
domínio que precisa ser explicado, não só navegado
onboarding recorrente no mesmo contêiner
antes de uma refatoração estrutural, para discutir o alvo
para argumentar uma decisão de fronteira

O último é o mais legítimo: um diagrama desenhado para embasar uma decisão é descartável por natureza — ele vive na ADR, datado, e não precisa ser mantido.

A alternativa é gerar

Quando o diagrama é realmente necessário e o contêiner é ativo, gerar a partir do código resolve o problema de meia-vida:

ferramenta lê o código, extrai a estrutura, produz o diagrama
o diagrama nunca está errado
o layout é automático e às vezes ruim
só mostra o que existe, não o que se pretende

Ver documentação viva. Este é o nível onde geração tem o maior retorno, porque é o nível que mais desatualiza.

E há uma condição: gerar só funciona se o código tiver estrutura reconhecível. Um projeto sem organização clara produz um diagrama gerado ilegível — o que, aliás, é um diagnóstico.

O código é a documentação primária

No nível de componente, existe uma alternativa que quase sempre vence:

estrutura de diretórios que reflita o domínio
nomes que digam o que a coisa faz
um README curto por contêiner com o mapa em texto

Uma estrutura de pastas bem nomeada responde "onde mexo" sem nenhum diagrama, e nunca desatualiza, porque é o próprio código.

Ver desenho modular.

Um contêiner por vez

Como no nível anterior, o escopo é único: um diagrama descreve um contêiner. Os demais aparecem, se aparecerem, como caixas na borda.

Um diagrama que ninguém consegue desenhar é um achado

Há um resultado do exercício que vale independentemente do diagrama produzido: quando a estrutura interna de um contêiner não pode ser desenhada de forma legível, isso não é falha de documentação.

componentes sem responsabilidade clara nomes que não dizem nada
dependências em todas as direções nenhuma camada discernível
um componente que aparece em tudo provável classe-deus

Nesses casos o diagrama vira insumo de refatoração, e cumpre sua função melhor do que cumpriria se ficasse bonito. Ver desenho modular.

Modelo Mental

O nível de menor retorno e maior custo. Desenhe quando houver uma pergunta específica, gere quando precisar de permanência, e prefira código bem organizado a ambos.

Quando Usar

  • Contêiner grande, com estrutura interna não óbvia.
  • Onboarding recorrente no mesmo contêiner.
  • Antes de uma refatoração estrutural, como alvo a discutir.
  • Para embasar uma decisão de fronteira — descartável, dentro da ADR.
  • Quando for gerado automaticamente.

Quando Não Usar

Para todo contêiner, por completude. Este é o erro caro.

Mantido à mão, em código que muda toda semana.

Quando a estrutura de pastas já responde.

Com classes como caixas — o nível seria o quarto, e raramente vale.

Sem alguém responsável por atualizá-lo.

Alternativas

  • Estrutura de diretórios bem nomeada — resposta sem custo de manutenção.
  • README por contêiner — o mapa em texto, mais fácil de manter.
  • Diagrama gerado — sempre atual.
  • Nada — para contêineres pequenos, ler o código é mais rápido.

A última é legítima com mais frequência do que se admite: um contêiner de 15 arquivos não precisa de diagrama.

Trade-offs

DesenhadoGerado
Expressa intençãoMostra o que existe
DesatualizaSempre atual
Layout bomAutomático
Custo contínuoCusto inicial
DiagramaEstrutura de pastas
Mostra relaçõesMostra organização
Custo de manutençãoNenhum
Independente do códigoÉ o código

Modos de Falha

Desatualizado e seguido. Pior que não existir.

Produzido para todos os contêineres. Custo que nunca se paga.

Classes como caixas. Nível errado.

Gerado a partir de código sem estrutura. Ilegível.

Sem dono. Nasce e apodrece.

Erros Comuns

Tratar o terceiro nível como obrigatório porque o modelo tem quatro.

Não considerar a estrutura de pastas como alternativa.

Manter à mão o que poderia ser gerado.

Não datar — sem data, o leitor confia.

Exemplo Real

Uma equipe de plataforma decidiu documentar completamente seus sistemas, incluindo o nível de componente para os 22 contêineres existentes.

O esforço levou seis semanas. Os diagramas foram publicados no wiki.

Onze meses depois, uma auditoria de documentação mediu:

diagramas de contexto 6 — 6 ainda corretos
diagramas de contêiner 22 — 19 corretos, 3 desatualizados
diagramas de componente 22 — 4 corretos, 18 desatualizados

E, mais grave, dois incidentes tinham sido agravados por diagramas de componente errados: em ambos, alguém localizou onde mexer pelo diagrama, mexeu no lugar indicado, e o comportamento estava em outro componente — movido numa refatoração meses antes.

A revisão da política:

Nível de componente removido por padrão. Os 22 diagramas foram arquivados.

Quatro exceções mantidas, todas em contêineres grandes com onboarding frequente — e todas convertidas para geração automática a partir do código.

README por contêiner substituiu o resto: um mapa em texto de cinco a dez linhas, mantido no repositório do próprio contêiner, revisado junto com mudanças estruturais.

Diagramas de decisão passaram a viver nas ADRs, datados e explicitamente não mantidos — com uma frase no cabeçalho: "retrato da estrutura em 2026-03; não atualizado".

O resultado, medido no ano seguinte: a documentação estrutural encolheu de 50 para 32 artefatos, a taxa de itens corretos subiu de 58% para 91%, e nenhum incidente foi agravado por documentação errada.

Um efeito não previsto: ao escrever os READMEs, três times descobriram que não conseguiam descrever a organização interna em dez linhas — o que virou motivo para refatorar.

A avaliação posterior aponta: a lição não foi "componentes não importam", e sim que a completude tem custo e o custo é contínuo. Documentar tudo produziu menos verdade que documentar menos.

Conceitos Relacionados

Exercício Prático

Escolha um contêiner do seu time e escreva um README de dez linhas descrevendo sua organização interna.

Se você não conseguir, o problema provavelmente não é de documentação.

Perguntas de Entrevista

  • Por que o nível de componente tem o pior retorno dos três?
  • Quando um diagrama desatualizado é pior que nenhum diagrama?
  • Que alternativa costuma vencer o diagrama de componente?

Para Aprofundar

  • Brown, Simon. Software Architecture for Developers. Leanpub, 2015.
  • Martin, Robert C. Clean Architecture. Prentice Hall, 2017.
  • Parnas, David. On the Criteria To Be Used in Decomposing Systems into Modules. CACM, 1972.
Terminou de ler este documento?Seu progresso fica salvo apenas neste navegador.