🎭 CAPÍTULO 10: DIAGRAMA DE CASOS DE USO (CONCEITOS)
🎯 1. Objetivos de Aprendizagem & Competências
Estimativa de Dedicação: 2 horas de estudo autoguiado.
Ao final deste capítulo, você será capaz de:
- 🔹 Compreender a finalidade do Diagrama de Casos de Uso na captura de requisitos funcionais sob a perspectiva do usuário (Ivar Jacobson / UML).
- 🔹 Identificar Atores Primários, Atores Secundários (Sistemas Externos/APIs) e o Limite do Sistema (System Boundary).
- 🔹 Modelar diagramas de casos de uso profissionais com sintaxe declarativa Mermaid e Draw.io.
- 🔹 Evitar o anti-pattern de desenhar sequências temporais e fluxogramas dentro do diagrama de casos de uso.
🏢 2. Cenário Corporativo & Estudo de Caso (TecProExpress)
Na TecProExpress, a diretoria executiva solicitou uma visão consolidada de todas as operações do novo Módulo de Gestão de Fretes e Frotas. Eles não desejam ver tabelas de banco de dados ou detalhes de infraestrutura, mas precisam entender com clareza quais ações podem ser executadas pelo Motorista, pelo Operador de Logística e pelo Gateway Bancário.
O Desafio: Seu objetivo como Analista de Sistemas é construir a "foto panorâmica" de escopo funcional do sistema através do Diagrama de Casos de Uso, estabelecendo com precisão o que está dentro do escopo do software (System Boundary) e quais entidades externas interagem com ele.
🧠 3. Fundamentação Teórica & Modelos Visuais
3.1. A Tríade do Diagrama de Casos de Uso
O diagrama organiza-se em torno de 3 elementos gráficos padronizados pela UML:
- Atores (Actors): Entidades externas que interagem com o sistema (usuários, sensores ou sistemas legados).
- Casos de Uso (Use Cases - Elipses): Conjuntos de ações realizadas pelo sistema que geram um resultado de valor observável para o ator.
- Limite do Sistema (Subject Boundary - Retângulo): Delimita o que pertence ao software que será construído versus o que é externo.
flowchart LR
subgraph SIS ["🏢 SISTEMA TECPROEXPRESS (SYSTEM BOUNDARY)"]
direction TB
UC1(["📦 Registrar Pacote"])
UC2(["🗺️ Rastrear Entrega"])
UC3(["💳 Processar Pagamento"])
end
A1["👤 Operador Logístico"] --> UC1
A2["👤 Cliente Final"] --> UC2
UC3 --> S1["🏛️ Gateway de Pagamento (API)"]
style SIS fill:#f8fafc,stroke:#475569
style UC1 fill:#e0f2fe,stroke:#0284c7
style UC2 fill:#e0f2fe,stroke:#0284c7
style UC3 fill:#e0f2fe,stroke:#0284c7
style A1 fill:#dcfce7,stroke:#16a34a
style A2 fill:#dcfce7,stroke:#16a34a
style S1 fill:#ede7f6,stroke:#5e35b1
3.2. Atores Primários vs. Atores Secundários
- Ator Primário: Inicia a interação com o sistema para atingir uma meta pessoal de negócio (ex: o Cliente buscando rastrear seu pacote).
- Ator Secundário (Ator de Suporte): É acionado pelo sistema para fornecer serviços auxiliares (ex: a API de Envio de SMS ou o Serviço de Cobrança Bancária).
💻 4. Aplicação Prática & Código Executável (Python 3.11+)
Mapeamento de casos de uso para controladores REST com Flask 3.x em Python 3.11+.
📋 Pré-requisitos e Instalação
No terminal do seu ambiente virtual, instale o microframework Flask:
pip install flask
💻 Código Completo e Autocontido (rotas_casos_uso.py)
Crie o arquivo rotas_casos_uso.py e insira o código abaixo integralmente:
"""
Módulo: rotas_casos_uso.py
Domínio: Transposição de casos de uso UML para endpoints REST com Flask 3.x.
Stack: Python 3.11+ | Flask 3.x
"""
from flask import Flask, request, jsonify
app = Flask(__name__)
# Base de dados em memória para simulação operacional
PACOTES_DB = {
"BR123456": {"codigo": "BR123456", "status": "EM TRANSITO", "localizacao": "Hub São Paulo"}
}
# Caso de Uso 1: Registrar Pacote (Ator: Operador Logístico)
@app.post("/api/pacotes/")
def uc_registrar_pacote():
"""UC01: Permite ao Operador Logístico cadastrar um novo pacote no sistema."""
dados = request.get_json()
if not dados or "codigo" not in dados or "peso_kg" not in dados:
return jsonify({"status": "ERRO", "mensagem": "Campos 'codigo' e 'peso_kg' são obrigatórios."}), 400
PACOTES_DB[dados["codigo"]] = {
"codigo": dados["codigo"],
"peso_kg": dados["peso_kg"],
"destino": dados.get("destino", "NÃO INFORMADO"),
"status": "REGISTRADO"
}
return jsonify({"status": "SUCESSO", "mensagem": f"Pacote {dados['codigo']} registrado com sucesso."}), 201
# Caso de Uso 2: Rastrear Entrega (Ator: Cliente Final)
@app.get("/api/pacotes/<codigo>/rastreio")
def uc_rastrear_entrega(codigo: str):
"""UC02: Permite ao Cliente Final consultar o status em tempo real do pacote."""
pacote = PACOTES_DB.get(codigo)
if not pacote:
return jsonify({"status": "ERRO", "detalhe": f"Pacote '{codigo}' não localizado."}), 404
return jsonify(pacote), 200
# Ponto de Entrada Executável
if __name__ == "__main__":
print("🚀 TESTE DE CONTROLADORES REST FLASK (CASOS DE USO UML)")
print("=" * 65)
# Execução de testes de integração automáticos via Flask Test Client nativo
client = app.test_client()
# 1. Simulação do Caso de Uso 1 (Operador cadastra pacote)
print("1. [UC01 - Operador] Registrando pacote:")
resp_post = client.post("/api/pacotes/", json={"codigo": "BR999888", "peso_kg": 3.5, "destino": "Curitiba/PR"})
print(f" Status HTTP: {resp_post.status_code}")
print(f" Resposta: {resp_post.get_json()}\n")
# 2. Simulação do Caso de Uso 2 (Cliente rastreia pacote)
print("2. [UC02 - Cliente] Rastreando entrega cadastrada:")
resp_get = client.get("/api/pacotes/BR123456/rastreio")
print(f" Status HTTP: {resp_get.status_code}")
print(f" Resposta: {resp_get.get_json()}\n")
# 3. Cenário de Falha (Pacote não encontrado)
print("3. [UC02 - Exceção] Consultando código inexistente:")
resp_404 = client.get("/api/pacotes/XX000000/rastreio")
print(f" Status HTTP: {resp_404.status_code}")
print(f" Resposta: {resp_404.get_json()}")
print("=" * 65)
print("💡 Dica: Para iniciar o servidor HTTP interativo na porta 5000, descomente: # app.run(port=5000, debug=True)")
# app.run(port=5000, debug=True)
🚀 Como Executar
Execute o script no terminal:
python rotas_casos_uso.py
🖥️ Saída Esperada no Terminal
🚀 TESTE DE CONTROLADORES REST FLASK (CASOS DE USO UML)
=================================================================
1. [UC01 - Operador] Registrando pacote:
Status HTTP: 201
Resposta: {'mensagem': 'Pacote BR999888 registrado com sucesso.', 'status': 'SUCESSO'}
2. [UC02 - Cliente] Rastreando entrega cadastrada:
Status HTTP: 200
Resposta: {'codigo': 'BR123456', 'localizacao': 'Hub São Paulo', 'status': 'EM TRANSITO'}
3. [UC02 - Exceção] Consultando código inexistente:
Status HTTP: 404
Resposta: {'detalhe': "Pacote 'XX000000' não localizado.", 'status': 'ERRO'}
=================================================================
💡 Dica: Para iniciar o servidor HTTP interativo na porta 5000, descomente: # app.run(port=5000, debug=True)
💡 5. Checkpoint de Engenharia & Boas Práticas
- Verbo no Infinitivo: Nomeie casos de uso sempre iniciando com verbos de ação que expressem valor de negócio ("Emitir Boleto", "Cadastrar Imóvel" e não "Boleto" ou "Tela 02").
- Anti-Pattern Decomposição Funcional (Fluxograma): O Diagrama de Casos de Uso não é um fluxograma. Não ligue elipses em sequência linear ("Digitar Senha" ➔ "Validar Usuário" ➔ "Abrir Menu"). Use Diagramas de Atividades para fluxos internos!
🔗 6. Conexão com os Projetos Integradores
| Projeto Integrador | Como o conceito deste capítulo é aplicado no PI |
|---|---|
| PI-01: ManuTrack | Mapeamento dos casos de uso dos Atores: Técnico de Manutenção e Gestor de Produção. |
| PI-07: AgroSafe | Ator Secundário: Sistema do MAPA/CREA integrado para validação de receituário agronômico. |
🧪 7. Quiz de Fixação e Autoavaliação (Formative Assessment)
🧪 Quiz de Autoavaliação — Capítulo 10
🧪 Quiz de Autoavaliação — Capítulo 10
1. Em um Diagrama de Casos de Uso, qual é a representação e significado do 'Limite do Sistema' (System Boundary)?
- A) É um círculo que representa a internet.
- B) É um retângulo que envolve os casos de uso, delimitando com precisão o que está dentro do escopo de desenvolvimento do software.
- C) É a tabela de banco de dados principal.
- D) É o servidor físico onde o software roda.
💡 Ver Resposta e Justificativa
Resposta Correta: B
Justificativa: O System Boundary separa o sistema (casos de uso internos) do mundo exterior (atores externos), estabelecendo com clareza a fronteira do projeto.
2. Qual das seguintes opções representa uma boa prática de nomenclatura para um Caso de Uso?
-
A)
TELA_DE_LOGIN_V2 -
B)
Banco de Dados PostgreSQL -
C)
Consultar Histórico de Vistorias -
D)
Verificar se o campo não é nulo
💡 Ver Resposta e Justificativa
Resposta Correta: C
Justificativa: Casos de uso devem ser nomeados com um verbo no infinitivo seguido de um substantivo, representando uma meta completa com valor para o ator.
3. Um sistema externo (como uma API bancária ou o serviço de CEP dos Correios) é modelado no Diagrama de Casos de Uso como:
- A) Uma classe abstrata.
- B) Um caso de uso interno.
- C) Um Ator Secundário (ou Ator de Suporte).
- D) Uma chave estrangeira de banco de dados.
💡 Ver Resposta e Justificativa
Resposta Correta: C
Justificativa: Sistemas e APIs externos que trocam informações com o software são modelados como atores secundários situados fora da fronteira do sistema.
🛠️ 8. Ponte para a Ação: Laboratório 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
- Visão de Escopo: O Diagrama de Casos de Uso apresenta as capacidades do sistema sob a ótica do usuário e de sistemas externos.
- Atores: Papéis que interagem com o sistema (não confunda com pessoas individuais).
- Fronteira do Sistema: Delimita a responsabilidade da equipe técnica de desenvolvimento.
- Nomenclatura Semântica: Sempre use [Verbo no Infinitivo] + [Objeto] expressando uma meta real de negócio.