🎭 CAPÍTULO 11: CASOS DE USO (PRÁTICA E RELAÇÕES)


🎯 1. Objetivos de Aprendizagem & Competências

Estimativa de Dedicação: 2 horas de estudo autoguiado.
Ao final deste capítulo, você será capaz de:

  • 🔹 Distinguir e aplicar com precisão os três relacionamentos da UML entre casos de uso: «include» (inclusão obrigatória), «extend» (extensão condicional) e Generalização/Especialização.
  • 🔹 Estruturar especificações textuais completas de casos de uso contendo Fluxo Principal (Caminho Feliz), Fluxos Alternativos e Fluxos de Exceção.
  • 🔹 Modelar diagramas com pontos de extensão (Extension Points) claros no Mermaid e Draw.io.
  • 🔹 Implementar o padrão de handlers condicionais e exceções em Python 3.11+ refletindo os fluxos modelados.

🏢 2. Cenário Corporativo & Estudo de Caso (TecProExpress)

Na TecProExpress, a equipe de desenvolvimento modelou um caso de uso para "Emitir Frete". No entanto, quando o cliente solicita entrega expressa aos domingos, uma taxa especial de seguro adicional precisa ser contratada condicionalmente. Além disso, toda emissão de frete exige obrigatoriamente a validação do token JWT de autenticação.

O Desafio: Você deve modelar corretamente esses comportamentos utilizando as relações «include» para a autenticação obrigatória e «extend» com ponto de extensão condicional para o seguro especial de domingo, evitando duplicação de lógica e garantindo clareza técnica.


🧠 3. Fundamentação Teórica & Modelos Visuais

3.1. As Relações entre Casos de Uso na UML

flowchart TD
    subgraph RELACOES_UC ["RELAÇÕES NA UML ENTRE CASOS DE USO"]
        direction TB
        UC_BASE(["📦 Emitir Frete (Base)"])
        
        UC_INC(["🔐 Validar Token JWT<br>(Obrigatório)"])
        UC_EXT(["🛡️ Contratar Seguro Especial<br>(Opcional / Condicional)"])
        
        UC_BASE -.->|"«include»"| UC_INC
        UC_EXT -.->|"«extend» [Se for Domingo]"| UC_BASE
    end
    
    style UC_BASE fill:#e0f2fe,stroke:#0284c7
    style UC_INC fill:#ede7f6,stroke:#5e35b1
    style UC_EXT fill:#fef3c7,stroke:#d97706

3.2. Comparativo: «include» vs. «extend» vs. Generalização

Relação UMLDireção da SetaQuando UsarExemplo Real
«include»Caso Base ➔ Caso IncluídoO caso de uso base sempre e obrigatoriamente executa o comportamento incluído para ser concluído.Efetuar Pagamento inclui Validar Saldo.
«extend»Caso Extensor ➔ Caso BaseO comportamento é adicionado apenas se uma condição específica for satisfeita no ponto de extensão.Calcular Frete Especial estende Emitir Pedido (se entrega for internacional).
GeneralizaçãoFilho ➔ Pai (Seta com triângulo vazio)O caso de uso filho herda e especializa o comportamento do pai.Pagar via PIX e Pagar via Cartão especializam Pagar Fatura.

💻 4. Aplicação Prática & Código Executável (Python 3.11+)

Implementação dos fluxos principal, de extensão («extend») e de inclusão obrigatória («include») em Python 3.11+.

📋 Pré-requisitos e Instalação

Este módulo utiliza exclusivamente recursos nativos do Python 3.11+ (dataclasses e decimal). Nenhuma instalação externa é necessária:

# Ambiente padrão Python 3.11+ (sem dependências externas)

💻 Código Completo e Autocontido (emissoes_frete_regras.py)

Crie o arquivo emissoes_frete_regras.py e insira o código abaixo integralmente:

"""
Módulo: emissoes_frete_regras.py
Domínio: Aplicação das relações de caso de uso (Include, Extend e Exceções).
Stack: Python 3.11+
"""
from dataclasses import dataclass
from decimal import Decimal

class TokenInvalidoException(Exception):
    pass

@dataclass
class SolicitacaoFrete:
    token_jwt: str
    peso_kg: Decimal
    entrega_domingo: bool

# Caso de Uso Incluído («include» obrigatório)
def validar_token_jwt(token: str):
    if not token or token != "TOKEN_SEGURO_2026":
        raise TokenInvalidoException("❌ Acesso negado: Token JWT ausente ou inválido.")

# Caso de Uso Extensor («extend» condicional)
def aplicar_seguro_domingo(valor_base: Decimal) -> Decimal:
    print(" 🛡️ [«extend»] Ponto de Extensão Ativado: Adicionando Seguro Especial de Domingo (+15%)")
    return valor_base * Decimal("1.15")

# Caso de Uso Base
def emitir_frete(solicitacao: SolicitacaoFrete) -> Decimal:
    # 1. Executa o «include» obrigatório
    validar_token_jwt(solicitacao.token_jwt)

    # 2. Fluxo Principal
    valor_base = solicitacao.peso_kg * Decimal("12.00")

    # 3. Ponto de Extensão («extend»)
    if solicitacao.entrega_domingo:
        valor_base = aplicar_seguro_domingo(valor_base)

    return valor_base

if __name__ == "__main__":
    try:
        sol = SolicitacaoFrete("TOKEN_SEGURO_2026", Decimal("5.0"), entrega_domingo=True)
        valor_final = emitir_frete(sol)
        print(f"✅ Frete emitido com sucesso: R$ {valor_final:.2f}")
    except TokenInvalidoException as erro:
        print(erro)

🚀 Como Executar

Execute o script no terminal:

python emissoes_frete_regras.py

🖥️ Saída Esperada no Terminal

 🛡️ [«extend»] Ponto de Extensão Ativado: Adicionando Seguro Especial de Domingo (+15%)
✅ Frete emitido com sucesso: R$ 69.00

💡 5. Checkpoint de Engenharia & Boas Práticas

Boas Práticas & Anti-Patterns

  • Atenção à Direção da Seta no «extend»: No relacionamento «extend», a seta pontilhada aponta do caso de uso extensor PARA o caso de uso base (pois o caso base não tem conhecimento prévio da extensão).
  • Anti-Pattern Uso Excessivo de Include/Extend: Evite fragmentar o diagrama em dezenas de pequenos casos de uso para passos triviais (ex: "Digitar CPF"). Use «include» apenas para lógicas reaproveitadas em múltiplos casos de uso.

🔗 6. Conexão com os Projetos Integradores

Projeto IntegradorComo o conceito deste capítulo é aplicado no PI
PI-04: ShopFlowO caso de uso Finalizar Compra inclui obrigatoriamente Reservar Estoque e pode estender Aplicar Cupom de Desconto.
PI-06: ServiceFlowEncerrar OS inclui Calcular Peças e Mão de Obra e estende Notificar Cliente por WhatsApp.

🧪 7. Quiz de Fixação e Autoavaliação (Formative Assessment)

🧪 Quiz de Autoavaliação — Capítulo 11

1. Qual é a principal diferença entre os relacionamentos «include» e «extend» na UML?

  • A) O «include» é opcional e o «extend» é obrigatório.
  • B) O «include» representa uma execução obrigatória e incondicional do comportamento incluído; o «extend» representa uma execução opcional que ocorre apenas sob determinadas condições.
  • C) Ambos possuem exatamente a mesma semântica e podem ser usados de forma intercambiável.
  • D) O «extend» só pode ser usado entre atores humanos.
💡 Ver Resposta e Justificativa

Resposta Correta: B
Justificativa: O «include» é mandatório para a conclusão do caso base (fração essencial de lógica reaproveitada), enquanto o «extend» só é acionado se a condição do ponto de extensão for verdadeira.


2. No diagrama de casos de uso da UML, para onde aponta a seta pontilhada do relacionamento «extend»?

  • A) Do Caso de Uso Base para o Ator.
  • B) Do Caso de Uso Extensor PARA o Caso de Uso Base.
  • C) Do Caso de Uso Base para o Caso de Uso Extensor.
  • D) De um Ator para outro Ator.
💡 Ver Resposta e Justificativa

Resposta Correta: B
Justificativa: A convenção estrita da UML define que o caso de uso que estende (extensor) aponta para o caso de uso que está sendo estendido (base), pois o caso base independe da extensão.


3. O que é um 'Fluxo de Exceção' na especificação textual de um caso de uso?

  • A) O caminho ideal quando tudo dá certo na primeira tentativa.
  • B) O conjunto de passos executados quando ocorre um erro, validação inválida ou falha que impede a conclusão normal da meta (ex: cartão sem limite).
  • C) A lista de linguagens de programação usadas no backend.
  • D) O orçamento financeiro da sprint.
💡 Ver Resposta e Justificativa

Resposta Correta: B
Justificativa: Fluxos de exceção tratam condições de erro, falhas e cancelamentos, garantindo que o sistema responda de forma graciosa e segura.


🛠️ 8. Ponte para a Ação: Laboratório Prático

🎯 Próximo Passo Prático

Coloque esta teoria em prática executando o roteiro de laboratório autoguiado:
👉 ATIVIDADE 05: CASOS DE USO (UML)


📌 9. Resumo Executivo & Key Takeaways

  • «include»: Comportamento compartilhado e obrigatório para o término do caso base.
  • «extend»: Comportamento modular e condicional acionado em pontos de extensão pré-definidos.
  • Direção das Setas: Base ➔ «include» ➔ Compartilhado | Extensor ➔ «extend» ➔ Base.
  • Especificação Textual: Caminho Feliz (Principal), Alternativos e Exceções devem ser detalhados para guiar o time de testes e desenvolvimento.