🎯 Visión general
Esta guía te guía a través del diseño y modelado de unSistema de control de llamadas telefónicasutilizandoDiagramas de máquina de estados UML. Se centra en elciclo de vida de la llamada saliente, ilustrando cómo una línea telefónica cambia entre estados en respuesta a acciones del usuario y eventos de red.
El diagrama captura tanto loscaminos exitosos (configuración exitosa de la llamada) como loscaminos problemáticos (errores, tiempos de espera agotados, líneas ocupadas), enfatizando la robustez, el manejo de excepciones y las transiciones de estado claras, principios clave en los sistemas de comunicación en tiempo real.
🧩 Conceptos fundamentales en las máquinas de estados UML
Antes de adentrarte en el diagrama, comprende estos conceptos fundamentales de UML:
| Concepto | Descripción |
|---|---|
| Estado | Una condición durante la cual un objeto satisface ciertas condiciones o realiza acciones. |
| Transición | Un cambio de un estado a otro, desencadenado por un evento. |
| Evento | Una ocurrencia que provoca una transición (por ejemplo, descolgado, número válido). |
| Transición autónoma | Una transición que comienza y termina en el mismo estado (por ejemplo, dígito(n) mientras en Marcando). |
| Estado pseudo | Puntos de control especiales como Inicial o Final que no son estados reales. |
| Estado compuesto | Un estado que contiene subestados (por ejemplo, Error estado con TonoOcupado, TonoOcupadoRápido, MensajeGrabado). |
| Condición de guarda | Una expresión booleana que debe ser verdadera para que ocurra una transición. |
✅ Consejo profesional: Utilice
evento [guarda] / acciónsintaxis en UML para documentar desencadenantes, condiciones y efectos secundarios.
🔄 Ciclo de vida de llamada saliente: Desglose paso a paso
1. Fase de iniciación y marcado
🔹 Estado pseudo inicial → Ocupado
- El sistema comienza en el Estado pseudo inicial.
- Aún no hay actividad; el teléfono está colgado.
🔹 Ocupado → Tonada de marcado (colgado)
- Evento:
colgado(el usuario levanta el auricular) - Transición:
colgado → Tonada de marcado - Acción: Generar tonada de marcado; prepararse para la entrada de dígitos.
📌 Este es el primer cambio de estado visible en el ciclo de vida de la llamada.
🔹 Tonada de marcado → Marcando (dígito(n))
- Evento:
dígito(n)(el usuario ingresa un dígito) - Transición:
dígito(n) → Marcando - Estado: Ingresar
Marcandomodo.
🔹 Transición auto: Marcando → Marcando (dígito(n))
- Evento:
dígito(n)(varios dígitos ingresados) - Guarda: Ninguno (siempre permitido)
- Acción: Añadir dígito al número que se está marcando.
- Propósito: Permitir la entrada continua de dígitos sin salir del
Marcadoestado.
💡 Las transiciones internas son esenciales para manejar secuencias de entrada como números de teléfono.
2. Lógica de conexión y manejo de excepciones
🔹 Marcado → Conectando (númeroVálido)
- Evento:
númeroVálido(número completo validado) - Transición:
númeroVálido → Conectando - Acción: Iniciar la configuración de la llamada con la red.
🔹 Marcado → Mensaje grabado (númeroInválido)
- Evento:
númeroInválido(por ejemplo, longitud incorrecta, prefijo inválido) - Transición:
númeroInválido → Mensaje grabado - Acción: Reproducir mensaje grabado: “El número que marcó no está en servicio.”
🔹 Conectando → Tonada de ocupado (númeroOcupado)
- Evento:
númeroOcupado - Transición:
númeroOcupado → tonoOcupado - Acción: Reproducir tono de ocupado; informar al usuario que la línea está ocupada.
🔹 Conectando → tonoRápidoOcupado (trunkBusy)
- Evento:
trunkOcupado - Transición:
trunkOcupado → tonoRápidoOcupado - Acción: Reproducir tono de ocupado rápido; indicar congestión de red.
⚠️ Nota: Estos son estados de error que interrumpen el flujo normal. Deben manejarse de forma adecuada.
3. Mecanismo de tiempo de espera y advertencia
🔹 Marcando → Advertencia (tiempo de espera)
- Evento:
tiempo de esperadespués de 30 segundos de inactividad - Transición:
tiempo de espera → Advertencia - Acción: Reproducir pitido de advertencia; notificar al usuario que continúe o cuelgue.
🔹 Advertencia → Tiempo de espera (tiempo de espera)
- Evento:
tiempo de esperade nuevo después de 10 segundos - Transición:
timeout → Tiempo de espera agotado - Acción: Cancelar el intento de llamada; regresar a
Ocupado.
⏱️ La lógica de tiempo de espera evita la espera indefinida y mejora la experiencia del usuario.
4. Llamada activa y desconexión
🔹 Conectando → Sonando (enrutado)
- Evento:
enrutado(la red enruta correctamente la llamada) - Transición:
enrutado → Sonando - Acción: Enviar señal de sonido a la parte llamada.
🔹 Sonando → Conectado (el teléfono llamado responde)
- Evento:
el teléfono llamado responde - Transición:
el teléfono llamado responde → Conectado - Acción: Establecer conexión de audio; iniciar grabación de llamada (si está habilitada).
🔹 Conectado → Desconectado (colgar OR el teléfono llamado cuelga)
- Dos caminos para la desconexión:
- El usuario cuelga:
colgar → Desconectado - La otra parte cuelga:
calledPhoneHangsUp → Desconectado
- El usuario cuelga:
🔄 Ambas transiciones conducen a
Desconectadoantes de alcanzarEstado final.
🔹 Desconectado → Estado final
- Evento: Ninguno (implícito o mediante una acción de limpieza)
- Transición:
Desconectado → Final - Acción: Limpiar recursos, registrar la duración de la llamada, actualizar estadísticas.
✅ El Estado final indica el final del ciclo de vida de la llamada.
🎨 Principios de diseño visual para claridad
Para hacer que las máquinas de estado complejas sean legibles y mantenibles:
| Principio | Implementación |
|---|---|
| Camino feliz central | Mantenga el flujo principal (Inactivo → Tonos de marcado → Marcando → Conectando → Sonando → Conectado) como una línea limpia vertical o horizontal. |
| Ramificar hacia afuera para excepciones | Coloque los estados de error (Tonos de ocupado, Tonos de ocupado rápido, Mensaje grabado) como ramas laterales. |
| Agrupar estados relacionados | Use estados compuestos para condiciones de error (ver más abajo). |
| Use los estados pseudo con sabiduría | Inicial y Final debe marcarse claramente. |
| Evite transiciones cruzadas | Evite que las flechas se solapen; use regiones ortogonales si es necesario. |
🔧 Técnicas avanzadas de modelado
✅ Estado compuesto: Agrupación de “Error”
En lugar de listar BusyTone, FastBusyTone, y MensajeGrabado como estados separados, agrúpelos bajo un estado compuesto llamado Error:
[Error]
├── BusyTone
├── FastBusyTone
└── MensajeGrabado
- Acción de entrada: Reproduzca tono de error o mensaje.
- Acción de salida: Volver a
DialToneoOcupadodespués de la respuesta del usuario.
✅ Beneficio:Reduce el desorden visual y mejora la escalabilidad.
✅ Condiciones de guardia (mejoras opcionales)
Agregue condiciones de guardia para refinar las transiciones:
dígito(n) [number.length < 15] → Marcando
número válido [number.isInternational] → Conectando
🛠️ Las condiciones de guardia evitan transiciones inválidas y apoyan la lógica condicional.
📌 Conclusiones clave: mejores prácticas para máquinas de estado complejas
| Práctica | ¿Por qué importa? |
|---|---|
| Modelar caminos desfavorables | Los sistemas reales fallan. Diseñar para número inválido, tiempo de espera agotado, troncal ocupada garantiza la confiabilidad. |
| Use expresiones de acción | Incluya / registrarIntentoDeLlamada() o / reproducirTonos() para mostrar efectos secundarios. |
| Mantenga los eventos descriptivos y orientados a acciones | Use colgado, enrutado, el teléfono llamado respondeen lugar dee1, e2. |
| Nombra los estados claramente | EvitaEstado1, Estado2. UsaMarcando, Sonando, Conectado. |
| Documenta las suposiciones | Por ejemplo, «Tiempo de espera después de 30 segundos de inactividad» debe indicarse en los comentarios. |
💻 Generación de código: PlantUML y Mermaid
Aquí tienesbloques de código listos para usarpara generar este diagrama en el formato preferido.
✅ Código PlantUML
@startuml
[*] --> Idle
Idle --> DialTone : onHook
DialTone --> Dialing : digit(n)
Dialing --> Dialing : digit(n) ' Transición interna
Dialing --> Connecting : númeroVálido
Dialing --> RecordedMessage : númeroInválido
Dialing --> Warning : tiempoAgotado
Warning --> Timeout : tiempoAgotado
Connecting --> Ringing : enrutado
Connecting --> BusyTone : númeroOcupado
Connecting --> FastBusyTone : troncalOcupado
Ringing --> Connected : teléfonoLlamadoContesta
Connected --> Disconnected : onHook
Connected --> Disconnected : teléfonoLlamadoColgó
Disconnected --> [*] : limpiar
state "Error" as ErrorState {
state "BusyTone" as BusyTone
state "FastBusyTone" as FastBusyTone
state "RecordedMessage" as RecordedMessage
}
' Acciones internas
Idle : entry / Esperar descolgado
DialTone : entry / Reproducir tono de marcado
Dialing : entry / Recopilar dígitos
Connecting : entry / Enrutamiento de llamada
Ringing : entry / Sonar teléfono remoto
Connected : entry / Establecer sesión de llamada
Disconnected : entry / Terminar sesión
@enduml 📥 Cómo usar: Pegar en PlantUML en vivo o su complemento para IDE.
✅ Código Mermaid

diagramaEstado-v2
[*] --> Idle
Idle --> ToneDeMarcado : onHook
ToneDeMarcado --> Marcando : digito(n)
Marcando --> Marcando : digito(n) ' Transición auto
Marcando --> Conectando : numeroValido
Marcando --> MensajeGrabado : numeroInvalido
Marcando --> Advertencia : tiempoAgotado
Advertencia --> TiempoAgotado : tiempoAgotado
Conectando --> Sonando : enrutado
Conectando --> TonodeOcupado : numeroOcupado
Conectando --> TonodeOcupadoRapido : troncalOcupado
Sonando --> Conectado : telefonoLlamadoContesto
Conectado --> Desconectado : onHook
Conectado --> Desconectado : telefonoLlamadoColgo
Desconectado --> [*] : limpiar
estado Error {
TonodeOcupado
TonodeOcupadoRapido
MensajeGrabado
}
Conectando --> TonodeOcupado : numeroOcupado
Conectando --> TonodeOcupadoRapido : troncalOcupado
Marcando --> MensajeGrabado : numeroInvalido
nota a la derecha de TonodeOcupado
Reproducir tono de ocupado estándar
fin nota
nota a la derecha de TonodeOcupadoRapido
Reproducir tono de ocupado rápido (congestión de red)
fin nota
nota a la derecha de MensajeGrabado
Reproducir mensaje grabado: "Número no en servicio."
fin nota
nota a la derecha de TiempoAgotado
Intento de llamada cancelado después de 40 segundos
fin nota
📥 Cómo usar: Pegar en Editor en vivo de Mermaid o herramientas de Markdown compatibles (VS Code, Obsidian, etc.).
📚 Resumen y reflexiones finales
Este Sistema de control de llamadas telefónicas máquina de estados es un ejemplo del mundo real de cómo UML puede modelar sistemas complejos y basados en eventos con alta confiabilidad.
✅ Lo que hace efectivo este diagrama:
- Claro camino feliz con un flujo lógico.
- Comprehensive manejo de errores.
- Uso de transiciones auto, estados compuestos, y guardas.
- Claridad visual mediante agrupación y anotación.
🛠️ ¿Cuándo usar este patrón?
- Sistemas de telefonía
- Control de dispositivos IoT
- Gestión de sesiones de usuario
- Motores de flujo de trabajo
- Sistemas embebidos con lógica de estado finito
📝 ¿Quieres ampliar esto?
Considera agregar:
- Grabación de llamadas estado (con
iniciarGrabación,detenerGrabacióneventos) - Reenvío de llamadas lógica (enrutamiento condicional)
- Espera de llamadas soporte (estados paralelos)
- Transferencia de llamadas como un subestado de
Conectado - Historial de estado (histórico superficial/profundo) para reingreso tras una interrupción
📌 Recomendación final
Siempre modela tanto las rutas de éxito como las de fracaso.
Una máquina de estados que solo maneja las “rutas felices” es incompleta y propensa a errores en producción.
Utiliza esta guía como un modelo para modelar cualquier sistema en tiempo real donde transiciones de estado, eventos, y resiliencia ante errores tengan importancia.
✅ ¿Listo para generar, visualizar o ampliar?
👉 Copia el PlantUML o Mermaid código anterior e intégralo en tu documentación, diagramas de arquitectura o documentos de diseño de sistemas.
Avísame si deseas una versión PDF, diagrama interactivo, o integración en un modelo de sistema más grande (por ejemplo, con componentes o diagramas de secuencia)!
📘 “Los mejores sistemas no son solo correctos: anticipan el fracaso.”
— Diseño con máquinas de estado UML










