🌿 ATIVIDADE 11: DIAGRAMA DE ATIVIDADES (UML)
Para realizar este laboratório com sucesso, certifique-se de ter compreendido os conceitos apresentados no:
👉 CAPÍTULO 11: CASOS DE USO (PRÁTICA E RELAÇÕES)
Bem-vindo ao início do Bloco Avançado de Engenharia de Software. Ao longo das próximas semanas, você sairá da modelagem puramente estática e entrará de cabeça na lógica processual, no design de APIs modernas, no ecossistema corporativo (Java 17, Spring Boot 3.5.x, Thymeleaf, HTMX) e nas práticas de DevOps. Hoje, seu desafio é modelar o fluxo procedural dinâmico usando o Diagrama de Atividades. 🛡️🧩
🎯 Objetivos de Aprendizagem do Laboratório
Ao final deste laboratório prático (estimativa: 4 horas presenciais / autoguiadas), você será capaz de:
- Modelar a lógica processual e fluxos de negócio usando a sintaxe UML.
- Representar bifurcações e junções lógicas (decisões lógicas).
- Representar forks e joins para fluxos de processamento em paralelo.
- Organizar responsabilidades usando Raias de Natação (Swimlanes / Subgraphs).
🏢 O Cenário Prático (Seu Desafio)
Na TecProExpress, a diretoria de Logística percebeu um grande gargalo: quando um cliente clica em "Confirmar Compra", o sistema antigo esperava o faturamento da Nota Fiscal terminar para somente depois avisar o estoque. Em dias de grande volume, os motoristas ficavam parados esperando a emissão da nota, mesmo com a carga já pronta para carregar!
"Seu desafio como Analista de Processos de TI é desenhar o fluxo de atividades de faturamento e separação de forma paralela. Você deve modelar o processo de ponta a ponta: do clique do usuário, dividindo a ação em duas linhas paralelas (Faturamento e Separação), juntando-as no carregamento e finalizando com a saída do caminhão."
🧠 Fundamentos: A Teoria Traduzida
O Diagrama de Atividades UML é como um super fluxograma. Ele descreve a ordem em que as atividades de um sistema ou processo ocorrem, com excelente suporte para paralelismo.
Elementos Chave:
- Nó Inicial (Círculo Preto Sólido): Onde o processo começa.
- Ação/Atividade (Retângulo Arredondado): Um passo procedural executado pelo sistema ou humano.
- Fork (Barra de Divisão): Divide uma linha em duas ou mais ações que acontecem em paralelo.
- Join (Barra de Sincronização): Aguarda todas as linhas paralelas terminarem para continuar o fluxo.
- Decisão (Losango): Uma bifurcação baseada em uma pergunta do tipo Sim/Não.
- Nó Final (Círculo com Alvo): Onde o processo termina.
📊 Visualizando a Lógica
Fork vs Decisão: A decisão escolhe apenas um caminho. O Fork aciona todos os caminhos ao mesmo tempo. Nunca confunda as duas coisas!
style Start fill:#eceff1,stroke:#607d8b
style Fork fill:#e1f5fe,stroke:#0288d1
style Join fill:#e1f5fe,stroke:#0288d1
style End fill:#e0f2f1,stroke:#004d40

---
## 📖 Exemplo Guiado
Abaixo, veja como detalhar o processamento com raias de natação (separando as responsabilidades entre Cliente, Financeiro e Logística).
| Elemento UML | O que representa? | Ator/Componente Responsável |
| :--- | :--- | :--- |
| Iniciar Compra | Nó Inicial | Cliente |
| Faturar Cartão | Ação | Financeiro (Gateway) |
| Separar Caixas | Ação | Logística (Operador) |
| Despachar Caminhão | Ação | Transportadora |
### 🛠️ Estrutura Visual da Expedição
Para facilitar a leitura profissional, dividimos o fluxo usando **Raias de Natação** (subgraphs no Mermaid):
```mermaid
flowchart TD
subgraph CLI [Cliente]
Start(["Compra Efetuada"]) --> Fork{{"Fork"}}
end
subgraph FIN [Financeiro]
Fork --> F1[Emitir Nota Fiscal]
F1 --> F2[Registrar Impostos]
end
subgraph LOG [Logística]
Fork --> L1[Separar Produtos no Galpão]
L1 --> L2[Embalar Carga]
end
subgraph TRA [Transportadora]
F2 --> Join{{"Join"}}
L2 --> Join
Join --> T1[Carregar Caminhão]
T1 --> End(["Caminhão Despachado"])
end
style Start fill:#eceff1,stroke:#333
style End fill:#e0f2f1,stroke:#004d40
style FIN fill:#fffde7,stroke:#fbc02d,stroke-width:1px
style LOG fill:#e1f5fe,stroke:#0288d1,stroke-width:1px
style TRA fill:#e8f5e9,stroke:#2e7d32,stroke-width:1px
🔍 Detalhamento do Processo:
- A raia de natação deixa evidente quem faz o quê. Se o Financeiro falhar ao registrar impostos, o Join bloqueia o carregamento do caminhão na Transportadora, mesmo que a Logística já tenha embalado tudo!
🛠️ Prática Obrigatória 1: O Diagrama de Atividades
Cenário: O projeto de grupo semestral que você está desenvolvendo.
- Selecione a funcionalidade principal ou a jornada de maior complexidade do seu sistema (Ex: Devolução de Mercadorias, Cadastro e Aprovação de Motoristas, Compra com Vários Modos de Pagamento).
- Identifique pelo menos 3 raias de responsabilidade (Humanos ou Sistemas/Componentes).
- Insira pelo menos 1 Fork e 1 Join para representar ações executadas em paralelo.
- Insira pelo menos 1 Decisão com caminhos alternativos de erro ou validação.
🏁 Resultado Esperado (Para sua Referência)
Uma imagem (PNG/JPG) do diagrama de atividades estruturado de forma limpa, indicando claramente os caminhos paralelos e as fronteiras de responsabilidade.
💻 Simulação de Processamento Concorrente (Fork & Join) em Python
Para vivenciar a lógica de bifurcação paralela (Fork) e sincronização de término (Join) do seu Diagrama de Atividades UML:
# simulador_atividades_fork_join.py
import time
import threading
def processar_financeiro():
print(" [FINANCEIRO] 💳 Emitindo Nota Fiscal e registrando tributos...")
time.sleep(0.1)
print(" [FINANCEIRO] ✅ Nota Fiscal emitida com sucesso!")
def processar_logistica():
print(" [LOGÍSTICA] 📦 Separando itens no armazém e gerando etiqueta...")
time.sleep(0.12)
print(" [LOGÍSTICA] ✅ Caixa embalada e pronta para despacho!")
if __name__ == "__main__":
print("=" * 65)
print("🔀 WORKFLOW PARALELO (UML ACTIVITY FORK & JOIN) - TECPROEXPRESS")
print("=" * 65)
print("1. [FORK] Disparando tarefas simultâneas (Financeiro & Logística)...")
t1 = threading.Thread(target=processar_financeiro)
t2 = threading.Thread(target=processar_logistica)
t1.start()
t2.start()
# JOIN: O sistema aguarda ambos os fluxos terminarem antes de despachar
t1.join()
t2.join()
print("\n2. [JOIN] Todas as raias sincronizadas com sucesso!")
print("3. [TRANSPORTADORA] 🚛 Carregando caminhão e iniciando rota de entrega.")
print("=" * 65)
🖥️ Saída Esperada no Terminal:
=================================================================
🔀 WORKFLOW PARALELO (UML ACTIVITY FORK & JOIN) - TECPROEXPRESS
=================================================================
1. [FORK] Disparando tarefas simultâneas (Financeiro & Logística)...
[FINANCEIRO] 💳 Emitindo Nota Fiscal e registrando tributos...
[LOGÍSTICA] 📦 Separando itens no armazém e gerando etiqueta...
[FINANCEIRO] ✅ Nota Fiscal emitida com sucesso!
[LOGÍSTICA] ✅ Caixa embalada e pronta para despacho!
2. [JOIN] Todas as raias sincronizadas com sucesso!
3. [TRANSPORTADORA] 🚛 Carregando caminhão e iniciando rota de entrega.
=================================================================
🌐 Exemplo de Payload JSON para Disparo de Workflow (Swagger /docs)
{
"id_pedido": "PED-88091",
"cliente_id": "CLI-102",
"itens": [
{"sku": "MONITOR-4K", "quantidade": 1, "valor_unitario": 2100.0}
],
"acoes_paralelas": [
"EMISSAO_NFE",
"PICKING_SEPARACAO"
]
}
📤 Instruções de Entrega (Microsoft Teams)
Após validar suas modelagens técnicas:
- Salve o arquivo de justificativa como
Atividade_11.mde a imagem do seu diagrama com o nomeAtividade_11.pngna pastaes-atv-11-atividades/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: O que acontece com o fluxo de atividades se uma das ramificações que saem de um Fork entrar em um loop infinito ou falhar e nunca alcançar o Join? (Resposta: O Join travará o processo para sempre, pois ele exige por especificação matemática que todas as ramificações paralelas cheguem até ele para liberar o fluxo sequencial subsequente). 🧠🛡️
📊 Rubrica Formativa de Avaliação
| Critério de Avaliação | Insuficiente (0% - 40%) | Regular (41% - 70%) | Excelente (71% - 100%) |
|---|---|---|---|
| Diagrama de Atividades UML & Raias de Natação | Desenha o fluxo sem raias de natação ou sem nós de decisão e paralelismo. | Mapeia as raias mas confunde os conceitos de Fork e Join. | Diagrama de atividades impecável com ao menos 3 raias, nós de decisão claros e par Fork/Join bem balanceado. |
| Justificativa de Paralelismo | Omite a justificativa de paralelização de tarefas. | Justifica superficialmente sem comparar com a execução sequencial procedural. | Justificativa de alto nível comparando ganhos de performance e UX em relação à execução estritamente sequencial. |
| Entrega no GitHub | Entrega fora da pasta `es-atv-11-atividades/`. | Entrega apenas o texto sem o arquivo `.png` do diagrama. | Submete `Atividade_11.md` e `Atividade_11.png` no repositório com formatação validada. |