💻 Exemplos — Cap 16: Documentando a Arquitetura: Modelo C4, ADRs e arc42
Guia Extra: Engenharia de Software e Modelagem UML • Bloco 4: Comportamento e Arquitetura • Demonstrações Práticas
🌍 Exemplo 1: C4 Nível 1 — Contexto do SGB
flowchart TB
L["🧑 Leitor
[Pessoa]
busca, reserva e renova livros"]
B["👩💼 Bibliotecária
[Pessoa]
empresta, devolve e cataloga"]
S["SGB
[Sistema]
gestão do acervo e da circulação da rede"]
E["Provedor de e-mail
[Sistema externo]
envia avisos e comprovantes"]
I["Base bibliográfica
[Sistema externo]
dados de livros por ISBN"]
L -- "usa (HTTPS)" --> S
B -- "usa (HTTPS)" --> S
S -- "envia e-mails (SMTP)" --> E
S -- "consulta ISBN (HTTPS/JSON)" --> I
style L fill:#08427b,stroke:#052e56,color:#ffffff
style B fill:#08427b,stroke:#052e56,color:#ffffff
style S fill:#1168bd,stroke:#0b4884,color:#ffffff
style E fill:#8a8a8a,stroke:#5e5e5e,color:#ffffff
style I fill:#8a8a8a,stroke:#5e5e5e,color:#ffffff
📦 Exemplo 2: C4 Nível 2 — Contêineres
flowchart LR
L["🧑 Leitor"] -- "HTTPS" --> WEB
B["👩💼 Bibliotecária"] -- "HTTPS" --> WEB
subgraph SGB["SGB"]
WEB["Portal Web\n[SPA, TypeScript]\ntelas de busca, empréstimo e reserva"]
API["API\n[Python, FastAPI]\nregras de acervo e circulação"]
DB[("Banco\n[PostgreSQL]\nacervo, leitores, empréstimos")]
JOB["Job noturno\n[Python]\nlembretes, multas, reservas"]
end
WEB -- "JSON/HTTPS" --> API
API -- "SQL" --> DB
JOB -- "SQL" --> DB
API -- "SMTP" --> EM["Provedor de e-mail\n[externo]"]
JOB -- "SMTP" --> EM
📝 Exemplo 3: Um ADR do SGB
# 0004 — Publicar eventos de circulação em vez de chamar o Financeiro
**Status:** Aceito (2026-03-10)
## Contexto
A devolução em atraso precisa gerar multa no Financeiro. A chamada direta
Circulação → Financeiro criaria dependência circular entre os pacotes
(Financeiro já consulta Circulação) e faria a devolução falhar se o
Financeiro estiver fora do ar.
## Decisão
Vamos publicar o evento DevolucaoAtrasada numa fila (tabela de saída + job),
e o Financeiro vai consumir o evento para gerar a multa.
## Consequências
+ Circulação não conhece o Financeiro; o grafo de pacotes fica acíclico.
+ A devolução continua funcionando se o Financeiro estiver indisponível.
- A multa aparece com alguns segundos de atraso (consistência eventual).
- Precisamos monitorar a fila e tratar eventos duplicados.
🐍 Exemplo 4: Índice Automático de ADRs
# indice_adrs.py
ADRS = [
("0001", "Usar arquitetura em camadas", "Substituído por 0005"),
("0002", "PostgreSQL como banco principal", "Aceito"),
("0003", "Autenticação com a conta da prefeitura", "Aceito"),
("0004", "Eventos de circulação para o Financeiro", "Aceito"),
("0005", "Arquitetura hexagonal no núcleo de circulação", "Aceito"),
]
print("| ADR | Título | Status |")
print("| :-- | :-- | :-- |")
for numero, titulo, status in ADRS:
print(f"| {numero} | {titulo} | {status} |")
vigentes = sum(1 for *_, s in ADRS if s == "Aceito")
print(f"\n{vigentes} decisões vigentes de {len(ADRS)} registradas")
Saída:
| ADR | Título | Status |
| :-- | :-- | :-- |
| 0001 | Usar arquitetura em camadas | Substituído por 0005 |
| 0002 | PostgreSQL como banco principal | Aceito |
| 0003 | Autenticação com a conta da prefeitura | Aceito |
| 0004 | Eventos de circulação para o Financeiro | Aceito |
| 0005 | Arquitetura hexagonal no núcleo de circulação | Aceito |
4 decisões vigentes de 5 registradas