🧩 Exercícios — Cap 15: Componentes, Estrutura Composta e Implantação
Guia Extra: Engenharia de Software e Modelagem UML • Bloco 4: Comportamento e Arquitetura • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 15.1 — Fornecida ou Requerida?
Contexto: Componentes de uma loja virtual: Carrinho, Catalogo, Pagamentos, Estoque.
Requisitos de Execução:
- Para cada frase, diga qual componente fornece e qual requer a interface: (a) o carrinho consulta preços; (b) o carrinho cobra o cliente; (c) pagamentos, ao confirmar, pede a baixa do estoque.
Resultado Esperado
Três linhas no formato “interface: fornecida por X, requerida por Y”.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_15_1_SeuNome.md - Envie na tarefa:
Atividade Cap 15 - Componentes, Estrutura Composta e Implantação
🔑 Gabarito de Código & Solução Comentada
IPrecos: fornecida por Catalogo, requerida por Carrinho.ICobranca: fornecida por Pagamentos, requerida por Carrinho.IBaixaEstoque: fornecida por Estoque, requerida por Pagamentos.
🎯 Nível 2: Prática
Problema 15.2 — Implantação de um Aplicativo de Delivery
Contexto: O app roda em celulares Android e iOS; a API em contêineres num cluster Kubernetes na nuvem; o banco é um PostgreSQL gerenciado; as notificações vão pelo serviço de push do Firebase.
Requisitos de Execução:
- Desenhe o diagrama de implantação com nós
«device»e«executionEnvironment», artefatos e protocolos.
Resultado Esperado
Diagrama com pelo menos 4 nós, 4 artefatos e os protocolos nos caminhos.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_15_2_SeuNome.md - Envie na tarefa:
Atividade Cap 15 - Componentes, Estrutura Composta e Implantação
🔑 Gabarito de Código & Solução Comentada
flowchart LR
subgraph CEL["«device» Celular"]
subgraph OS["«executionEnvironment» Android / iOS"]
APP["«artifact» delivery-app"]
end
end
subgraph NUV["«device» Nuvem"]
subgraph K8S["«executionEnvironment» Kubernetes"]
API["«artifact» api-pedidos:2.1"]
end
DB["«executionEnvironment» PostgreSQL gerenciado"]
end
subgraph FB["«device» Firebase"]
PUSH["serviço FCM"]
end
APP -- "HTTPS / JSON" --> API
API -- "TCP 5432" --> DB
API -- "HTTPS" --> PUSH
PUSH -. "push" .-> APP
🎯 Nível 3: Integração
Problema 15.3 — Da Caixa-Preta à Caixa-Branca
Contexto: O componente Financeiro do SGB fornece IMultas (consultar e quitar multas) e requer IEventosCirculacao (para receber DevolucaoAtrasada) e IGatewayPix.
Requisitos de Execução:
- Desenhe a visão caixa-preta.
- Desenhe a visão caixa-branca (estrutura composta) com pelo menos 3 partes internas e as delegações das portas.
- Explique o que muda para os outros componentes se o gateway Pix for trocado.
Resultado Esperado
Dois diagramas e a explicação.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_15_3_SeuNome.md - Envie na tarefa:
Atividade Cap 15 - Componentes, Estrutura Composta e Implantação
🔑 Gabarito de Código & Solução Comentada
flowchart LR
I1(("IMultas")) --- FIN["«component» Financeiro"]
FIN -. "requer" .-> I2(("IEventosCirculacao"))
FIN -. "requer" .-> I3(("IGatewayPix"))
flowchart LR
PM["▪ porta IMultas"] --> SM["servico : ServicoMultas"]
subgraph FIN["Financeiro"]
OUV["ouvinte : OuvinteDevolucoes"] --> SM
SM --> REP["repositorio : RepositorioMultas"]
SM --> COB["cobranca : AdaptadorPix"]
end
PE["▪ porta IEventosCirculacao"] --> OUV
COB --> PP["▪ porta IGatewayPix"]
Trocar o gateway Pix muda só a implementação do outro lado da porta IGatewayPix (e talvez o AdaptadorPix). Nenhum outro componente é afetado, porque todos usam o Financeiro por IMultas.
🎯 Nível 4: Desafio
Problema 15.4 — Verificador de Montagem de Componentes
Contexto: Antes de subir o sistema, queremos garantir que toda interface requerida é fornecida por algum componente.
Requisitos de Execução:
- Represente cada componente com as listas
forneceerequer. - Escreva um programa que liste as interfaces requeridas sem fornecedor e as fornecidas por mais de um componente (ambiguidade de montagem).
- Imprima o plano de montagem (quem liga em quem) para as interfaces resolvidas.
Resultado Esperado
O plano de montagem e os problemas encontrados.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_15_4_SeuNome.md - Envie na tarefa:
Atividade Cap 15 - Componentes, Estrutura Composta e Implantação
🔑 Gabarito de Código & Solução Comentada
# montagem.py
COMPONENTES = {
"PortalWeb": {"fornece": [], "requer": ["IEmprestimos", "IConsultaAcervo"]},
"Circulacao": {"fornece": ["IEmprestimos"], "requer": ["IConsultaAcervo", "INotificador"]},
"Acervo": {"fornece": ["IConsultaAcervo"], "requer": []},
"NotificacaoEmail": {"fornece": ["INotificador"], "requer": []},
"NotificacaoSMS": {"fornece": ["INotificador"], "requer": []},
"Financeiro": {"fornece": ["IMultas"], "requer": ["IGatewayPix"]},
}
fornecedores: dict[str, list[str]] = {}
for nome, c in COMPONENTES.items():
for i in c["fornece"]:
fornecedores.setdefault(i, []).append(nome)
print("Plano de montagem:")
problemas = []
for nome, c in COMPONENTES.items():
for i in c["requer"]:
opcoes = fornecedores.get(i, [])
if len(opcoes) == 1:
print(f" {nome} --{i}--> {opcoes[0]}")
elif not opcoes:
problemas.append(f"{nome} requer {i}, que ninguém fornece")
else:
problemas.append(f"{nome} requer {i}: escolher entre {', '.join(opcoes)}")
print("Problemas:")
for p in problemas:
print(" " + p)
Saída:
Plano de montagem:
PortalWeb --IEmprestimos--> Circulacao
PortalWeb --IConsultaAcervo--> Acervo
Circulacao --IConsultaAcervo--> Acervo
Problemas:
Circulacao requer INotificador: escolher entre NotificacaoEmail, NotificacaoSMS
Financeiro requer IGatewayPix, que ninguém fornece
Comentário: é o que um contêiner de injeção de dependências faz ao iniciar a aplicação: resolver cada interface requerida e falhar se houver ausência ou ambiguidade.