Pular para conteúdo

Aula 18 - Diagramas de Atividades, Estado e Interação Avançados 🔄

Objetivo Pedagógico

Objetivo: Modelar fluxos de controle complexos e ciclos de vida de entidades utilizando Diagramas de Atividades (com partições/raias e forks/joins) e Diagramas de Máquinas de Estados (com guardas, ações de entrada/saída e superestados).


📑 1. Fundamentos Teóricos & Análise Técnica

Enquanto os diagramas estruturais representam a ossatura estática do sistema, os Diagramas Comportamentais da UML descrevem o fluxo de execução temporal, a concorrência e as mutações de ciclo de vida das entidades: 1. Diagrama de Atividades (Activity Diagram): - Modela o fluxo de controle algorítmico e a passagem de dados entre passos de um processo de negócio. - Raias de Natação (Swimlanes / Partitions): Delimitam formalmente as responsabilidades de diferentes atores, microsserviços ou setores da organização. - Bifurcação e Junção Concorrente (Fork e Join): - Fork: Divide uma linha de execução sequencial em múltiplos fluxos executados simultaneamente em paralelo. - Join: Sincroniza os fluxos paralelos, aguardando que todas as tarefas concorrentes terminem antes de permitir o avanço do processo. 2. Diagrama de Máquina de Estados (State Machine Diagram): - Modela todos os estados possíveis pelos quais um objeto pode transitar durante sua existência em resposta a eventos externos. - Transições com Gatilho, Guarda e Efeito: Evento [Condição de Guarda] / Ação Executada. Se a guarda for falsa, o evento é rejeitado e o objeto permanece no estado atual. - Superestados Compostos: Agrupamento hierárquico de estados afins com tratamento comum de cancelamento ou falha.

📐 Arquitetura Conceitual & Diagrama de Fluxo

stateDiagram-v2
    [*] --> Criado: Novo Pedido Iniciado
    Criado --> AguardandoPagamento: Checkout Confirmado
    state AguardandoPagamento {
        [*] --> GerandoPix
        GerandoPix --> QRDisponivel: Pix Criado
        QRDisponivel --> ValidandoTransacao: Webhook Recebido
    }
    AguardandoPagamento --> Pago: Pagamento Confirmado [Valor == Total]
    AguardandoPagamento --> Cancelado: Timeout de 15 minutos atingido
    Pago --> EmPreparacao: Enviar para Faturamento
    EmPreparacao --> Enviado: Código de Rastreio Anexado
    Enviado --> Entregue: Confirmação de Recebimento
    Entregue --> [*]
    Cancelado --> [*]

🔍 Pilares e Diretrizes Técnicas

Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Concorrência Explícita com Fork/Join: Garantia de representação visual de operações em paralelo (ex: reservar estoque e debitar cartão simultaneamente). - Transições Protegidas por Guardas: Impedimento de mudanças de estado inconsistentes através de condições booleanas estritas. - Raias de Responsabilidade (Swimlanes): Clareza sobre qual serviço ou ator executa cada etapa do processo de negócio. - Prevenção de Estados Órfãos: Mapeamento exaustivo que garante que todos os estados possuam caminhos de término válidos.


🛠️ 2. Implementação Prática em UML Comportamental, Máquinas de Estados e Diagramas de Atividades

Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:

// order_fulfillment_activity.mermaid (Diagrama de Atividades com Raias e Concorrência Fork/Join)
graph TD
    subgraph Cliente["Raia: Cliente"]
        Start([Início]) --> Carrinho[Finalizar Compra]
    end

    subgraph CheckoutService["Raia: Checkout Service"]
        Carrinho --> Fork1{Fork: Paralelo}
    end

    subgraph EstoqueService["Raia: Estoque"]
        Fork1 --> ReservarEstoque[Bloquear Itens no Inventário]
    end

    subgraph GatewayPagamento["Raia: Pagamento"]
        Fork1 --> ProcessarCartao[Processar Transação de Crédito]
    end

    subgraph CheckoutSync["Raia: Checkout Service"]
        ReservarEstoque --> Join1{Join: Sincronização}
        ProcessarCartao --> Join1
        Join1 --> AvaliarDecisao{Ambos com Sucesso?}
        AvaliarDecisao -- Sim --> ConfirmarPedido[Emitir Nota Fiscal]
        AvaliarDecisao -- Não --> ReverterOperacao[Estornar e Liberar Itens]
    end

    ConfirmarPedido --> EndSuccess([Fim: Pedido Aprovado])
    ReverterOperacao --> EndFail([Fim: Compra Rejeitada])

💡 Análise Passo a Passo do Código

  1. Divisão em Subgrafos de Responsabilidade: Evidencia os limites de cada microsserviço no fluxo de orquestração do checkout.
  2. Uso de Nós Fork e Join: Demonstra graficamente o processamento simultâneo de estoque e pagamento para reduzir a latência total.
  3. Ponto de Decisão com Ramificação Clara: Explicita o tratamento transacional compensatório em caso de falha de uma das partes.

🎯 3. Próximos Passos & Sequência Didática