🎯 Visão Geral
Este guia o acompanha no projeto e modelagem de umSistema de Controle de Chamadas de TelefoniausandoDiagramas de Máquina de Estados UML. Ele se concentra nociclo de vida da chamada de saída, ilustrando como uma linha telefônica passa por estados em resposta a ações do usuário e eventos de rede.
O diagrama captura tanto oscaminhos felizes (configuração bem-sucedida de chamada) quanto oscaminhos desafortunados (erros, tempos limite, linhas ocupadas), enfatizando robustez, tratamento de exceções e transições de estado claras — princípios fundamentais em sistemas de comunicação em tempo real.
🧩 Conceitos Principais em Máquinas de Estados UML
Antes de mergulhar no diagrama, entenda esses conceitos fundamentais de UML:
| Conceito | Descrição |
|---|---|
| Estado | Uma condição durante a qual um objeto satisfaz certas condições ou realiza ações. |
| Transição | Uma mudança de um estado para outro, disparada por um evento. |
| Evento | Uma ocorrência que causa uma transição (por exemplo,desligado, número válido). |
| Transição Auto | Uma transição que começa e termina no mesmo estado (por exemplo,dígito(n) enquanto em Discagem). |
| Estado Pseudo | Pontos de controle especiais como Inicial ou Final que não são estados reais. |
| Estado Composto | Um estado que contém subestados (por exemplo, Erro estado com Sinal de Ocupado, Sinal de Ocupado Rápido, Mensagem Gravada). |
| Condição de Guarda | Uma expressão booleana que deve ser verdadeira para que uma transição ocorra. |
✅ Dica Profissional: Use
evento [guarda] / açãosintaxe em UML para documentar gatilhos, condições e efeitos colaterais.
🔄 Ciclo de Vida da Chamada de Saída: Análise Passo a Passo
1. Fase de Início e Discagem
🔹 Estado Pseudo Inicial → Ocioso
- O sistema começa no Estado Pseudo Inicial.
- Nenhuma atividade ainda; o telefone está no gancho.
🔹 Ocioso → Tom de Discagem (onHook)
- Evento:
onHook(o usuário levanta o fone) - Transição:
onHook → Tom de Discagem - Ação: Gerar tom de discagem; preparar para entrada de dígitos.
📌 Este é a primeira mudança de estado visível no ciclo de vida da chamada.
🔹 Tom de Discagem → Discando (digit(n))
- Evento:
digit(n)(o usuário digita um dígito) - Transição:
digit(n) → Discando - Estado: Entrar
Discandomodo.
🔹 Transição Auto: Discando → Discando (digit(n))
- Evento:
digit(n)(vários dígitos digitados) - Guarda: Nenhum (sempre permitido)
- Ação: Adicionar dígito ao número sendo discado.
- Propósito: Permitir entrada contínua de dígitos sem sair do estado de
Discagemestado.
💡 Transições auto são essenciais para lidar com sequências de entrada como números de telefone.
2. Lógica de Conexão e Tratamento de Exceções
🔹 Discagem → Conectando (númeroVálido)
- Evento:
númeroVálido(número completo validado) - Transição:
númeroVálido → Conectando - Ação: Iniciar o preparo da chamada com a rede.
🔹 Discagem → Mensagem Gravada (númeroInválido)
- Evento:
númeroInválido(por exemplo, comprimento incorreto, prefixo inválido) - Transição:
númeroInválido → Mensagem Gravada - Ação: Reproduzir mensagem gravada: “O número que você discou não está em serviço.”
🔹 Conectando → Tom de Ocupado (númeroOcupado)
- Evento:
númeroOcupado - Transição:
númeroOcupado → TomOcupado - Ação: Tocar tom de ocupado; informar ao usuário que a linha está ocupada.
🔹 Conectando → TomRápidoOcupado (trunkOcupado)
- Evento:
trunkOcupado - Transição:
trunkOcupado → TomRápidoOcupado - Ação: Tocar tom rápido de ocupado; indicar congestionamento na rede.
⚠️ Observação: Esses são estados de erro que interrompem o fluxo normal. Devem ser tratados de forma adequada.
3. Mecanismo de Tempo Limite e Aviso
🔹 Discando → Aviso (tempo limite)
- Evento:
tempo limiteapós 30 segundos de inatividade - Transição:
tempo limite → Aviso - Ação: Tocar sinal sonoro de aviso; notificar o usuário para continuar ou desligar.
🔹 Aviso → Tempo Limite (tempo limite)
- Evento:
tempo limitenovamente após 10 segundos - Transição:
timeout → Tempo limite - Ação: Cancelar tentativa de chamada; retornar para
Repouso.
⏱️ A lógica de tempo limite evita a espera indefinida e melhora a experiência do usuário.
4. Chamada Ativa e Desconexão
🔹 Conectando → Toque (encaminhado)
- Evento:
encaminhado(a rede roteia com sucesso a chamada) - Transição:
encaminhado → Toque - Ação: Enviar sinal de toque para o chamado.
🔹 Toque → Conectado (calledPhoneAnswers)
- Evento:
chamadoPhoneRespondeu - Transição:
chamadoPhoneRespondeu → Conectado - Ação: Estabelecer conexão de áudio; iniciar gravação da chamada (se habilitado).
🔹 Conectado → Desconectado (onHook OU chamadoPhoneDesligou)
- Dois Caminhos para a Desconexão:
- Usuário desliga:
onHook → Desconectado - Outra parte desliga:
calledPhoneHangsUp → Desconectado
- Usuário desliga:
🔄 Ambas as transições levam a
Desconectadoantes de alcançarEstado Final.
🔹 Desconectado → Estado Final
- Evento: Nenhum (implícito ou por meio de ação de limpeza)
- Transição:
Desconectado → Final - Ação: Limpar recursos, registrar duração da chamada, atualizar estatísticas.
✅ O Estado Final indica o fim do ciclo de vida da chamada.
🎨 Princípios de Design Visual para Clareza
Para tornar máquinas de estado complexas legíveis e mantidas:
| Princípio | Implementação |
|---|---|
| Caminho Principal Feliz | Mantenha o fluxo principal (Inativo → Tom de discagem → Discando → Conectando → Toque → Conectado) como uma linha vertical ou horizontal limpa. |
| Ramifique para fora em casos de exceção | Coloque estados de erro (Tom de ocupado, Tom de ocupado rápido, Mensagem gravada) como ramos laterais. |
| Agrupe estados relacionados | Use estados compostos para condições de erro (veja abaixo). |
| Use estados pseudos com sabedoria | Inicial e Final deve ser claramente marcado. |
| Evite transições cruzadas | Mantenha as setas sem sobreposição; use regiões ortogonais se necessário. |
🔧 Técnicas Avançadas de Modelagem
✅ Estado Composto: Agrupamento de “Erro”
Em vez de listar BusyTone, FastBusyTone, e RecordedMessage como estados separados, agrupe-os sob um estado composto chamado Erro:
[Erro]
├── BusyTone
├── FastBusyTone
└── MensagemGravada
- Ação de Entrada: Reproduza o tom de erro ou mensagem.
- Ação de Saída: Retorne para
DialToneouOciosoapós a resposta do usuário.
✅ Benefício:Reduz o acúmulo visual e melhora a escalabilidade.
✅ Condições de Guarda (Melhorias Opcionais)
Adicione guardas para refinar as transições:
digito(n) [number.comprimento < 15] → Discando
numeroValido [numero.eInternacional] → Conectando
🛠️ As guardas impedem transições inválidas e suportam lógica condicional.
📌 Principais aprendizados: Melhores práticas para máquinas de estado complexas
| Prática | Por que isso importa |
|---|---|
| Modele caminhos desfavoráveis | Sistemas reais falham. Projetar para numeroInvalido, tempoLimite, troncoOcupado garante a confiabilidade. |
| Use expressões de ação | Inclua / registrarTentativaDeLigação() ou / tocarSinal() para mostrar efeitos colaterais. |
| Mantenha eventos detalhados e orientados à ação | Use desligado, encaminhado, telefoneChamadoRespondeem vez dee1, e2. |
| Nomeie os Estados Claramente | EviteEstado1, Estado2. UseDiscando, Toque, Conectado. |
| Documente Suposições | Por exemplo, “Tempo limite após 30s de inatividade” deve ser anotado nos comentários. |
💻 Geração de Código: PlantUML e Mermaid
Aqui estãoblocos de código prontos para usopara gerar este diagrama no seu formato preferido.
✅ Código PlantUML
@startuml
[*] --> Idle
Idle --> DialTone : onHook
DialTone --> Dialing : digit(n)
Dialing --> Dialing : digit(n) ' Transição interna
Dialing --> Connecting : numeroValido
Dialing --> RecordedMessage : numeroInvalido
Dialing --> Warning : timeout
Warning --> Timeout : timeout
Connecting --> Ringing : encaminhado
Connecting --> BusyTone : numeroOcupado
Connecting --> FastBusyTone : troncoOcupado
Ringing --> Connected : telefoneChamadoRespondeu
Connected --> Disconnected : onHook
Connected --> Disconnected : telefoneChamadoDesligou
Disconnected --> [*] : limpeza
state "Erro" as ErrorState {
state "BusyTone" as BusyTone
state "FastBusyTone" as FastBusyTone
state "MensagemGravada" as RecordedMessage
}
' Ações internas
Idle : entry / Esperar desligamento
DialTone : entry / Reproduzir tom de discagem
Dialing : entry / Coletar dígitos
Connecting : entry / Encaminhar chamada
Ringing : entry / Toque no telefone remoto
Connected : entry / Estabelecer sessão de chamada
Disconnected : entry / Terminar sessão
@enduml 📥 Como usar: Cole em PlantUML ao Vivo ou seu plugin do IDE.
✅ Código Mermaid

stateDiagram-v2
[*] --> Idle
Idle --> ToneDeDiscagem : onHook
ToneDeDiscagem --> Digitando : digit(n)
Digitando --> Digitando : digit(n) ' Transição auto
Digitando --> Conectando : numeroValido
Digitando --> MensagemGravada : numeroInvalido
Digitando --> Aviso : timeout
Aviso --> Timeout : timeout
Conectando --> Toque : roteado
Conectando --> ToneDeOcupado : numeroOcupado
Conectando --> ToneDeOcupadoRapido : troncoOcupado
Toque --> Conectado : telefoneChamadoRespondeu
Conectado --> Desconectado : onHook
Conectado --> Desconectado : telefoneChamadoDesligou
Desconectado --> [*] : limpeza
estado Erro {
ToneDeOcupado
ToneDeOcupadoRapido
MensagemGravada
}
Conectando --> ToneDeOcupado : numeroOcupado
Conectando --> ToneDeOcupadoRapido : troncoOcupado
Digitando --> MensagemGravada : numeroInvalido
nota à direita de ToneDeOcupado
Reproduzir tom padrão de ocupado
fim nota
nota à direita de ToneDeOcupadoRapido
Reproduzir tom de ocupado rápido (congestionamento de rede)
fim nota
nota à direita de MensagemGravada
Reproduzir mensagem gravada: "Número não está em serviço."
fim nota
nota à direita de Timeout
Tentativa de chamada cancelada após 40 segundos
fim nota
📥 Como usar: Cole em Editor ao Vivo do Mermaid ou ferramentas de Markdown compatíveis (VS Code, Obsidian, etc.).
📚 Resumo e Reflexões Finais
Este Sistema de Controle de Chamadas de Telefonia máquina de estados é um exemplo do mundo real de como o UML pode modelar sistemas complexos e orientados por eventos com alta confiabilidade.
✅ O que torna este diagrama eficaz:
- Claro caminho feliz com fluxo lógico.
- Compreensivo tratamento de erros.
- Uso de transições auto, estados compostos, e guardas.
- Clareza visual por meio de agrupamento e anotação.
🛠️ Quando usar este padrão:
- Sistemas de telefonia
- Controle de dispositivos IoT
- Gerenciamento de sessão do usuário
- Engines de fluxo de trabalho
- Sistemas embarcados com lógica de estado finito
📝 Quer expandir isto?
Considere adicionar:
- Gravação de chamada estado (com
iniciarGravacao,pararGravacaoeventos) - Encaminhamento de chamada lógica (encaminhamento condicional)
- Aguardar chamada suporte (estados paralelos)
- Transferência de chamada como um subestado de
Conectado - Histórico de estado (histórico superficial/profundo) para reinício após interrupção
📌 Recomendação Final
Sempre modele os caminhos de sucesso e falha.
Uma máquina de estados que trata apenas os “caminhos felizes” é incompleta e propensa a erros em produção.
Use este guia como um modelo para modelar qualquer sistema em tempo real onde transições de estado, eventos, e resiliência a erros importam.
✅ Pronto para gerar, visualizar ou expandir?
👉 Copie o PlantUML ou Mermaid código acima e integre-o em sua documentação, diagramas de arquitetura ou documentos de projeto de sistema.
Avise-me se você quiser uma versão PDF, diagrama interativo, ou integração em um modelo de sistema maior (por exemplo, com componentes ou diagramas de sequência)!
📘 “Os melhores sistemas não são apenas corretos — eles antecipam falhas.”
— Projeto com Máquinas de Estados UML










