🎯 Visão Geral
Este guia o acompanha no projeto e na 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 da rede.
O diagrama captura tanto oscaminhos felizes (configuração bem-sucedida da 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 Fundamentais 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 pré-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: Toque o tom de ocupado; informe ao usuário que a linha está ocupada.
🔹 Conectando → TomRápidoOcupado (trunkOcupado)
-
Evento:
trunkOcupado -
Transição:
trunkOcupado → TomRápidoOcupado -
Ação: Toque o tom rápido de ocupado; indique 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: Toque o sinal de aviso; informe ao 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
Inativo.
⏱️ 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(rede encaminha com sucesso a chamada) -
Transição:
encaminhado → Toque -
Ação: Enviar sinal de toque para o chamado.
🔹 Toque → Conectado (chamadoRespondeu)
-
Evento:
chamadoRespondeu -
Transição:
chamadoRespondeu → Conectado -
Ação: Estabelecer conexão de áudio; iniciar gravação da chamada (se habilitado).
🔹 Conectado → Desconectado (desligar OU chamadoDesligou)
-
Dois Caminhos para Desconexão:
-
Usuário desliga:
desligar → Desconectado -
Outra parte desliga:
calledPhoneHangsUp → Desconectado
-
🔄 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 e 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 “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
DialToneouIdleapó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 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, telefoneChamadoRespondeuem 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
[*] –> Ocioso
Ocioso –> TomDeDiscagem : desligado
TomDeDiscagem –> Discando : digito(n)
Discando –> Discando : digito(n) ‘ Transição auto
Discando –> Conectando : numeroValido
Discando –> MensagemGravada : numeroInvalido
Discando –> Aviso : tempo limite excedido
Aviso –> TempoLimite : tempo limite excedido
Conectando –> Toque : encaminhado
Conectando –> TomDeOcupado : numeroOcupado
Conectando –> TomDeOcupadoRapido : troncoOcupado
Toque –> Conectado : telefoneChamadoRespondeu
Conectado –> Desconectado : desligado
Conectado –> Desconectado : telefoneChamadoDesligou
Desconectado –> [*] : limpeza
estado “Erro” como EstadoErro {
estado “TomDeOcupado” como TomDeOcupado
estado “TomDeOcupadoRapido” como TomDeOcupadoRapido
estado “MensagemGravada” como MensagemGravada
}
‘ Ações internas
Inativo : entrada / Aguardar desligamento
TomDeDiscagem : entrada / Reproduzir tom de discagem
Discando : entrada / Coletar dígitos
Conectando : entrada / Encaminhar chamada
Toque : entrada / Toque no telefone remoto
Conectado : entrada / Estabelecer sessão de chamada
Desconectado : entrada / Terminar sessão
@fimuml
📥 Como usar: Cole em PlantUML ao Vivo ou seu plugin de IDE.
✅ Código Mermaid

stateDiagram-v2
[*] --> Idle
Idle --> DialTone : onHook
DialTone --> Dialing : digit(n)
Dialing --> Dialing : digit(n) ' Transição auto
Dialing --> Connecting : validNumber
Dialing --> RecordedMessage : invalidNumber
Dialing --> Warning : timeout
Warning --> Timeout : timeout
Connecting --> Ringing : routed
Connecting --> BusyTone : numberBusy
Connecting --> FastBusyTone : trunkBusy
Ringing --> Connected : calledPhoneAnswers
Connected --> Disconnected : onHook
Connected --> Disconnected : calledPhoneHangsUp
Disconnected --> [*] : cleanup
state Error {
BusyTone
FastBusyTone
RecordedMessage
}
Connecting --> BusyTone : numberBusy
Connecting --> FastBusyTone : trunkBusy
Dialing --> RecordedMessage : invalidNumber
note right of BusyTone
Reproduzir tom de ocupado padrão
end note
note right of FastBusyTone
Reproduzir tom de ocupado rápido (congestionamento de rede)
end note
note right of RecordedMessage
Reproduzir mensagem gravada: "Número fora de serviço."
end note
note right of Timeout
Tentativa de chamada cancelada após 40 segundos
end note
📥 Como usar:Cole noEditor ao vivo do Mermaidou ferramentas de Markdown compatíveis (VS Code, Obsidian, etc.).
📚 Resumo e reflexões finais
EsteSistema de Controle de Chamadas de Telefoniamáquina de estados é umexemplo do mundo realde como o UML pode modelar sistemas complexos e orientados por eventos com alta confiabilidade.
✅ O que torna este diagrama eficaz:
-
Caminho principal clarocaminho principalcom fluxo lógico.
-
Tratamento abrangente de errostratamento de erros.
-
Uso detransições auto, estados compostos, eguardas.
-
Clareza visual por meio deagrupamentoeanotação.
🛠️ Quando usar este padrão:
-
Sistemas de telefonia
-
Controle de dispositivos IoT
-
Gerenciamento de sessões de usuário
-
Engines de fluxo de trabalho
-
Sistemas embarcados com lógica de estado finito
📝 Quer expandir isso?
Considere adicionar:
-
Gravação de chamadas estado (com
iniciarGravação,pararGravaçãoeventos) -
Encaminhamento de chamadas lógica (encaminhamento condicional)
-
Espera de chamada suporte (estados paralelos)
-
Transferência de chamada como um subestado de
Conectado -
Histórico de estado (histórico superficial/profundo) para reentrada 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 importa.
✅ 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 um versão PDF, diagrama interativo, ou integração em um modelo de sistema maior (por exemplo, com diagramas de componentes ou diagramas de sequência)!
📘 “Os melhores sistemas não são apenas corretos—eles antecipam falhas.”
— Projeto com Máquinas de Estado UML












