🎬 ATIVIDADE 08: DIAGRAMA DE SEQUÊNCIA (UML)
Para realizar este laboratório com sucesso, certifique-se de ter compreendido os conceitos apresentados no:
👉 CAPÍTULO 08: VALIDAÇÃO E GESTÃO
Bem-vindo a mais uma etapa da sua jornada no curso de Gestão de TI / Desenvolvimento de Sistemas. Hoje vamos mergulhar em conceitos que conectam a teoria técnica diretamente com o padrão de excelência da dinâmica de software, entendendo como o sistema "conversa" internamente. 🛡️🧩
🎯 Objetivos de Aprendizagem do Laboratório
Ao final deste laboratório prático (estimativa: 4 horas presenciais / autoguiadas), você será capaz de:
- Modelar o fluxo temporal de uma funcionalidade específica (Diferente da Classes, que é estático).
- Identificar Linhas de Vida (Lifelines) de objetos e atores.
- Representar Mensagens Síncronas, Assíncronas e Respostas.
- Visualizar a interação entre as camadas do sistema (Interface, Lógica e Banco de Dados).
🏢 O Cenário Prático (Seu Desafio)
Na TecProExpress, você definiu as Classes (Atividade 07). Agora, os desenvolvedores de Frontend e Backend precisam sentar para combinar como as mensagens serão trocadas. O programador da tela pergunta: "Quando eu clicar em 'Confirmar Entrega', para quem eu mando o sinal? Quem valida se o motorista está no local certo? Quem avisa o banco de dados para salvar?".
"Seu desafio como Analista de Sistemas é desenhar o 'filme' dessa ação. Você deve criar o Diagrama de Sequência que mostra o passo a passo temporal: da tela para o servidor, do servidor para o banco, e a resposta voltando para o celular do motorista."
🧠 Fundamentos: A Teoria Traduzida
Se o Diagrama de Classes é a foto das peças de um tabuleiro de xadrez, o Diagrama de Sequência é a descrição de uma jogada específica.
Elementos Chaves
- Atores e Objetos: Ficam no topo. De cada um desce uma Linha de Vida (tracejada).
- Foco de Controle (Retângulo na linha): Indica que o objeto está "trabalhando" naquele momento.
- Seta Contínua: Chamada de método (pergunta/ordem).
- Seta Tracejada: Retorno (resposta).
📊 Visualizando a Lógica
A ordem importa! No Diagrama de Sequência, o tempo flui de cima para baixo. A primeira mensagem do topo é a primeira coisa que acontece no sistema.
M->>T: Clica em "Finalizar"
T->>S: validarLocalizacao(gps)
S->>B: salvarStatus("Entregue")
B-->>S: OK (Sucesso)
S-->>T: Exibir Mensagem Sucesso
T-->>M: Notificação na Tela

---
## 📖 Exemplo Guiado
Abaixo, veja como planejar a sequência do "Login" no sistema da TecProExpress.
| Ordem | Quem fala com quem? | O que é dito? |
| :--- | :--- | :--- |
| 1 | Usuário -> Tela | Digita usuário/senha e clica em Entrar. |
| 2 | Tela -> Servidor | `autenticar(user, pass)` |
| 3 | Servidor -> Banco | `SELECT * FROM usuarios...` |
| 4 | Banco -> Servidor | Retorna os dados do usuário. |
| 5 | Servidor -> Tela | Login Autorizado. |
#### 📊 Dinâmica de Chamadas e Foco de Controle
```mermaid
sequenceDiagram
autonumber
actor U as Usuário
participant T as Tela Login
participant S as Servidor Auth
U->>T: Digita credenciais e clica em Entrar
activate T
T->>S: POST /login (payload JSON)
activate S
Note over S: Autentica credenciais e gera JWT
S-->>T: 200 OK (Token JWT)
deactivate S
T-->>U: Redireciona para o Dashboard
deactivate T
🛠️ Regras de Ouro do Diagrama
- Objetos nunca falam sozinhos: Uma mensagem sempre sai de uma linha de vida e vai para outra.
- Use verbos de ação: As setas representam chamadas de funções que você definiu lá na Atividade 07.
- Mantenha o foco: Não tente colocar 50 telas no mesmo diagrama. Escolha um fluxo (ex: Realizar Compra) e desenhe apenas ele.
🔍 Detalhamento do Processo:
- O Diagrama de Sequência é o melhor lugar para descobrir bugs de lógica. Se você desenhou que a "Tela" fala direto com o "Banco de Dados", você descobriu uma falha de segurança! Na engenharia profissional, a Tela sempre fala com o Servidor, e o Servidor fala com o Banco.
💻 Simulação de Sequência de Chamadas (Trace Middleware) em Python
Para inspecionar na prática a troca temporal de mensagens entre Usuário, Frontend, API e Banco de Dados:
# simulador_sequencia.py
import time
class BancoDadosMock:
def consultar_usuario(self, email: str) -> dict:
time.sleep(0.05) # Simula latência de rede/disco
print(" [DB] 💾 SELECT * FROM usuarios WHERE email = :email -> Encontrado!")
return {"id": 1, "nome": "Carlos Silva", "senha_hash": "$2b$12$e8f..."}
class ServidorAPIMock:
def __init__(self, db: BancoDadosMock) -> None:
self.db = db
def autenticar(self, email: str, senha: str) -> dict:
print(" [API] ⚙️ Recebida requisição POST /api/v1/auth/login")
user = self.db.consultar_usuario(email)
print(" [API] 🔐 Validando hash de senha e gerando Token JWT...")
return {"status": 200, "token": "eyJhbGciOiJIUzI1NiIsIn...", "nome": user["nome"]}
class FrontendAppMock:
def __init__(self, api: ServidorAPIMock) -> None:
self.api = api
def clicar_botao_entrar(self, email: str, senha: str) -> None:
print("[UI] 📱 Usuário clicou em 'Entrar'. Disparando requisição HTTP...")
resposta = self.api.autenticar(email, senha)
print(f"[UI] 🟢 200 OK recebido! Redirecionando para Dashboard. Bem-vindo(a), {resposta['nome']}!")
if __name__ == "__main__":
print("=" * 65)
print("⏱️ SIMULADOR DE TRACE TEMPORAL (DIAGRAMA DE SEQUÊNCIA UML)")
print("=" * 65)
db = BancoDadosMock()
api = ServidorAPIMock(db)
app = FrontendAppMock(api)
app.clicar_botao_entrar("carlos@tecproexpress.com", "SenhaForte123")
print("=" * 65)
🖥️ Saída Esperada no Terminal:
=================================================================
⏱️ SIMULADOR DE TRACE TEMPORAL (DIAGRAMA DE SEQUÊNCIA UML)
=================================================================
[UI] 📱 Usuário clicou em 'Entrar'. Disparando requisição HTTP...
[API] ⚙️ Recebida requisição POST /api/v1/auth/login
[DB] 💾 SELECT * FROM usuarios WHERE email = :email -> Encontrado!
[API] 🔐 Validando hash de senha e gerando Token JWT...
[UI] 🟢 200 OK recebido! Redirecionando para Dashboard. Bem-vindo(a), Carlos Silva!
=================================================================
🌐 Exemplo de Requisição cURL para o Fluxo de Autenticação (Swagger /docs)
curl -X POST "http://127.0.0.1:8000/api/v1/auth/login" \
-H "Content-Type: application/json" \
-d '{
"email": "carlos@tecproexpress.com",
"senha": "SenhaForte123"
}'
🔹 Resposta JSON do Servidor (Token JWT):
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "bearer",
"usuario": {
"id": 1,
"nome": "Carlos Silva",
"perfil": "MOTORISTA"
}
}
📤 Instruções de Entrega (Microsoft Teams)
Após validar suas documentações técnicas:
- Salve o arquivo de documentação com o nome
Atividade_08.mde a imagem do seu diagrama de sequência com o nomeAtividade_08.pngna pastaes-atv-08-sequencia/do seu repositório GitHub. - Certifique-se de fazer o commit e push para o repositório público.
- Submeta o link do seu repositório no Microsoft Teams para avaliação do professor.
💡 Checkpoint de Lógica
Reflexão Profissional:
Se durante o desenho do Diagrama de Sequência você perceber que precisa chamar um método chamado verificarEstoque(), mas esse método não existe na classe Estoque lá na sua Atividade 07, o que você deve fazer? (Resposta: Voltar na Atividade 07 e atualizar o Diagrama de Classes. A modelagem é um processo vivo e as atividades devem estar sempre sincronizadas). 🧠🛡️
📊 Rubrica Formativa de Avaliação
| Critério de Avaliação | Insuficiente (0% - 40%) | Regular (41% - 70%) | Excelente (71% - 100%) |
|---|---|---|---|
| Diagrama de Sequência (UML) | Diagrama sem participantes claros ou misturando chamadas com retornos. | Desenha o fluxo mas sem a distinção de setas de mensagem (síncrona) e retorno (assíncrona/tracejada). | Diagrama de sequência limpo com ao menos 3 participantes (Ator, Tela, Banco), chamadas síncronas e retornos tracejados. |
| Sincronismo com o Diagrama de Classes | Utiliza objetos e métodos inventados que não existem no Diagrama de Classes (Atv 07). | Utiliza participantes coerentes mas omite retornos de dados importantes. | Sincronia impecável de métodos e entidades entre o Diagrama de Sequência e o Diagrama de Classes. |
| Entrega no GitHub | Entrega fora da pasta `es-atv-08-sequencia/`. | Entrega o texto sem a imagem do diagrama de sequência. | Submete `Atividade_08.md` e `Atividade_08.png` no repositório com validação de formato. |