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