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:

  1. 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)

  1. Salve o arquivo como: Atividade_15_1_SeuNome.md
  2. 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:

  1. 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)

  1. Salve o arquivo como: Atividade_15_2_SeuNome.md
  2. 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:

  1. Desenhe a visão caixa-preta.
  2. Desenhe a visão caixa-branca (estrutura composta) com pelo menos 3 partes internas e as delegações das portas.
  3. 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)

  1. Salve o arquivo como: Atividade_15_3_SeuNome.md
  2. 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:

  1. Represente cada componente com as listas fornece e requer.
  2. Escreva um programa que liste as interfaces requeridas sem fornecedor e as fornecidas por mais de um componente (ambiguidade de montagem).
  3. 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)

  1. Salve o arquivo como: Atividade_15_4_SeuNome.md
  2. 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.