Guia Extra: Engenharia de Software e Modelagem UML • Bloco 4: Comportamento e Arquitetura


🗺️ Mapa Conceitual do Capítulo

flowchart TD
    INT["Diagramas de Interação (UML 2.5)\nModelagem da Troca de Mensagens entre Objetos"] --> SEQ["Diagrama de Sequência (Sequence Diagram)\nOrdenação Temporal Estrita de Cima para Baixo"]
    INT --> COM["Diagrama de Comunicação (Communication Diagram)\nÊnfase na Malha Estrutural e Numeração Decimal"]
    INT --> VG["Visão Geral de Interação (Interaction Overview)\nEncadeamento de Cenários em Alto Nível"]

    subgraph SEQ_PRIMITIVAS["Primitivas do Diagrama de Sequência"]
        SEQ --> LL["Linhas de Vida (Lifelines) & Barras de Ativação (Execution Occurrences)"]
        SEQ --> MSG["Tipos de Mensagens: Síncrona · Assíncrona · Retorno · Criação · Destruição"]
        SEQ --> FRAG["Fragmentos Combinados (Interaction Frames):\nalt · opt · loop · par · break · ref · critical"]
    end

    style INT fill:#ede7f6,stroke:#512da8,stroke-width:2px
    style SEQ fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
    style COM fill:#fff3e0,stroke:#ff9800,stroke-width:2px
    style VG fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
    style SEQ_PRIMITIVAS fill:#fce4ec,stroke:#e91e63,stroke-width:2px

⏱️ 1. O Diagrama de Sequência e o Fluxo Temporal

O Diagrama de Sequência é o mais poderoso e popular dos diagramas comportamentais da UML. Ele detalha exatamente como um conjunto de objetos colabora dinamicamente para realizar um cenário de uso específico, com a dimensão do tempo transcorrendo estritamente de cima para baixo.

Enquanto o Caso de Uso descreve o que o usuário deseja e o Diagrama de Classes define quem possui quais atributos, o Diagrama de Sequência conecta os dois mundos: cada mensagem enviada a um objeto torna-se obrigatoriamente um método público na classe de destino.

sequenceDiagram
    autonumber
    actor Cliente as Ator: Cliente
    participant Handler as :PedidoController
    participant Service as :PedidoService
    participant DB as :PedidoRepository

    Cliente->>+Handler: POST /pedidos (JSON Payload)
    Handler->>+Service: criarPedido(dados)
    
    alt Estoque Disponível
        Service->>+DB: salvar(pedido)
        DB-->>-Service: Pedido persistido (ID: 104)
        Service-->>Handler: PedidoDTO
        Handler-->>Cliente: 201 Created + JSON
    else Estoque Esgotado
        Service-->>-Handler: Erro: EstoqueInsuficiente
        Handler-->>-Cliente: 422 Unprocessable Entity
    end

📐 2. Tipologia Rigorosa de Mensagens na UML

A notação gráfica da ponta da seta determina a semântica de concorrência e bloqueio no código-fonte:

Tipo de Mensagem Notação Gráfica UML Semântica de Execução Equivalente em Código
Síncrona (Call) Linha sólida com ponta preenchida triangular sólida ($\blacktriangleright$) O remetente bloqueia a execução e aguarda o término do método chamado. Chamada de função comum resp = servico.calcular() ou HTTP request bloqueante.
Assíncrona (Signal) Linha sólida com ponta aberta em V ($\rightarrow$) O remetente dispara a mensagem e continua trabalhando imediatamente. Disparo de goroutine, thread avulsa ou publicação em fila RabbitMQ/Kafka.
Resposta (Reply / Return) Linha tracejada com ponta aberta ($\dashrightarrow$) Devolve o controle e o valor de retorno da chamada síncrona. Comando return resultado; de uma função.
Criação de Objeto Linha tracejada que aponta para o cabeçalho do novo participante A instância do objeto passa a existir na memória a partir daquele instante. Operador new ou instanciação de struct &Pedido{}.
Destruição de Objeto Linha que termina em um grande X na base da linha de vida A instância é liberada da memória (destruição explícita / delete em C++). Encerramento de sessão ou descarte de recurso gerenciado.

🔲 3. Fragmentos Combinados de Interação (Interaction Frames)

A partir da UML 2.0, a introdução dos Fragmentos Combinados transformou os diagramas de sequência em especificações lógicas completas, capazes de expressar desvios condicionais e laços sem a necessidade de desenhar diagramas separados:

  • alt (Alternativas): Representa estruturas if / else if / else. É dividido em compartimentos horizontais delimitados por linhas tracejadas, cada um com sua Expressão de Guarda entre colchetes ([condicao]). Apenas o compartimento cuja guarda for verdadeira será executado.
  • opt (Opcional): Equivalente a um if simples sem bloco else. Executa o fragmento apenas se a guarda for satisfeita.
  • loop (Repetição): Itera sobre uma coleção de objetos (loop [para cada item do carrinho]), representando laços for ou while.
  • par (Paralelo): Dispara múltiplos sub-cenários concorrentemente em threads separadas, representando operações assíncronas paralelas.
  • break (Interrupção): Executado como um fluxo de exceção (análogo a um try / catch com throw). Se a condição for atendida, o resto do diagrama de sequência é imediatamente abortado.
  • ref (Referência): Reutiliza um diagrama de sequência externo completo, encapsulando lógicas complexas e modulares (ex: ref: UC01_Autenticacao_JWT).

🕸️ 4. Diagrama de Comunicação vs Sequência: Isomorfismo Semântico

O Diagrama de Comunicação (denominado Diagrama de Colaboração na UML 1.x) contém exatamente o mesmo conteúdo informacional do Diagrama de Sequência, porém organiza os elementos com foco na conectividade estrutural entre os objetos, e não no eixo temporal vertical:

  • Os objetos são desenhados como caixas espalhadas no espaço, interligadas por linhas de associação.
  • As mensagens trafegam sobre as linhas com setas de direção acompanhadas de uma Numeração Decimal Hierárquica:
    • 1. registrarVenda()
    • 1.1. debitarEstoque()
    • 1.2. emitirComprovante()
    • 2. notificarCliente()

💡 Critério de Escolha de Engenharia:

  • Utilize Sequência quando a ordem cronológica, prazos de expiração ou fluxos condicionais (alt, loop) forem o foco principal.
  • Utilize Comunicação quando desejar enfatizar a malha de acoplamento entre os objetos e verificar quais classes possuem conexões excessivas.