🎯 概要
このガイドでは、以下の設計とモデリングについてステップバイステップで説明します。電話通話制御システムを用いてUMLステートマシン図。特に注目するのは発信通話のライフサイクルであり、ユーザー操作やネットワークイベントに応じて電話回線が状態間をどのように遷移するかを説明します。
この図は、ハッピーパス(成功した通話設定)(成功した通話設定)とアンハッピーパス(エラー、タイムアウト、回線が忙しいなど)(エラー、タイムアウト、回線が忙しいなど)を捉えており、耐障害性、例外処理、明確な状態遷移——リアルタイム通信システムにおける重要な原則を強調しています。
🧩 UMLステートマシンのコアコンセプト
図の詳細に入る前に、これらの基礎的なUMLの概念を理解してください:
| 概念 | 説明 |
|---|---|
| 状態 | オブジェクトが特定の条件を満たす、または動作を実行している状態。 |
| 遷移 | イベントによって引き起こされる、一つの状態から別の状態への変化。 |
| イベント | 遷移を引き起こす出来事(例:オンフック, 有効な番号). |
| 自己遷移 | 同じ状態から始まり、同じ状態で終わる遷移(例:digit(n) while in ダイヤル). |
| 擬似状態 | 特別な制御ポイント、例えば 初期 または 最終 実際の状態ではない。 |
| 複合状態 | サブステートを含む状態(例: エラー 状態で ビジーターン, 高速ビジーターン, 録音メッセージ). |
| ガード条件 | 遷移が発生するためには、真でなければならないブール式。 |
✅ プロのヒント: 使用する
event [guard] / actionUMLの構文で、トリガー、条件、副作用を文書化する。
🔄 外線通話ライフサイクル:ステップバイステップの分解
1. 発信およびダイヤルフェーズ
🔹 初期擬似状態 → 待機
- システムは 初期擬似状態.
- まだ活動なし。電話は受話器にかけてある。
🔹 待機 → 電話音色 (受話器かけ)
- イベント:
受話器かけ(ユーザーが受話器を上げる) - 遷移:
受話器かけ → 電話音色 - 動作: 発話音を生成;桁入力の準備を行う。
📌 これは通話ライフサイクルにおける最初の可視状態変化である。
🔹 電話音色 → 発話中 (桁(n))
- イベント:
桁(n)(ユーザーが桁を入力) - 遷移:
桁(n) → 発話中 - 状態: 入力
発話中モード。
🔹 自遷移: 発話中 → 発話中 (桁(n))
- イベント:
桁(n)(複数の桁が入力された) - ガード: なし(常に許可)
- アクション: 通話中の番号に桁を追加する。
- 目的: 状態を離さずに連続した桁の入力を許可する
通話入力状態。
💡 自己遷移は、電話番号のような入力シーケンスを処理するために不可欠である。
2. 接続ロジックおよび例外処理
🔹 通話入力 → 接続中(有効な番号)
- イベント:
有効な番号(完全な番号が検証済み) - 遷移:
有効な番号 → 接続中 - アクション: ネットワークとの通話セットアップを開始する。
🔹 通話入力 → 再生メッセージ(無効な番号)
- イベント:
無効な番号(例:長さが誤り、無効な接頭辞) - 遷移:
無効な番号 → 再生メッセージ - アクション: 事前に録音されたメッセージを再生する: 「おかけになった番号は現在ご利用できません。」
🔹 接続中 → 忙音(番号が使用中)
- イベント:
通話中番号 - 遷移:
numberBusy → 忙音 - 動作:忙音を再生する;ユーザーに回線が使用中であることを通知する。
🔹 接続中 → ファストビジー音 (回線混雑)
- イベント:
回線混雑 - 遷移:
回線混雑 → ファストビジー音 - 動作:ファストビジー音を再生する;ネットワークの混雑を示す。
⚠️ 注意:これらはエラー状態通常の流れを中断するものであり、適切に処理されなければならない。
3. タイムアウトおよび警告メカニズム
🔹 電話中 → 警告(タイムアウト)
- イベント:
タイムアウト非活動状態が30秒経過した後 - 遷移:
タイムアウト → 警告 - 動作:警告ビープ音を再生する;ユーザーに継続するか、通話を終了するよう通知する。
🔹 警告 → タイムアウト(タイムアウト)
- イベント:
タイムアウト10秒後に再度 - 遷移:
タイムアウト → タイムアウト - アクション:通話試行をキャンセル;戻る
アイドル.
⏱️ タイムアウトロジックにより、無限に待つことを防ぎ、ユーザー体験を向上させます。
4. 通話中と切断
🔹 接続中 → 鳴動中(ルーティング済み)
- イベント:
ルーティング済み(ネットワークが通話を正常にルーティングしました) - 遷移:
ルーティング済み → 鳴動中 - アクション:鳴動信号を通話相手に送信する。
🔹 鳴動中 → 接続中(相手が応答)
- イベント:
相手が応答 - 遷移:
相手が応答 → 接続中 - アクション:音声接続を確立;通話録音を開始(有効な場合)
🔹 接続中 → 切断中(受話器を下ろす OR 相手が通話を終了)
- 切断の2つの経路:
- ユーザーが通話を終了:
受話器を下ろす → 切断中 - 相手側が通話を切る:
通話相手の電話が切れる → 切断済み
- ユーザーが通話を終了:
🔄 両方の遷移は に到達する
切断済み到達する前に最終状態.
🔹 切断済み → 最終状態
- イベント: なし(暗黙的またはクリーンアップアクション経由)
- 遷移:
切断済み → 最終 - アクション: リソースのクリーンアップ、通話時間の記録、統計情報の更新。
✅ 最終状態は通話ライフサイクルの終了を意味する。
🎨 明確さを目的とした視覚的デザイン原則
複雑な状態機械を読みやすく、保守しやすくするため:
| 原則 | 実装 |
|---|---|
| 中心的な正常経路 | メインの流れ(アイドル → ダイアルトーン → ダイアル中 → 接続中 → リング → 接続済み)を明確な垂直または水平線として維持する。 |
| 例外用に外側へ分岐させる | エラー状態(ビジートーン、ファストビジートーン、録音メッセージ)を側面の分岐として配置する。 |
| 関連する状態をグループ化する | 使用する 複合状態 エラー条件用(以下参照)。 |
| 擬似状態を賢く使用する | 初期および最終明確にマークされるべきです。 |
| 遷移の交差を避ける | 矢印が重ならないようにする。必要に応じて直交領域を使用する。 |
🔧 高度なモデリング技術
✅ コンポジット状態:「エラー」グループ化
以下のように個別にリストする代わりにビジートーン, ファストビジートーン、および録音メッセージを個別の状態としてリストする代わりに、それらを次のコンポジット状態の下にグループ化するコンポジット状態と呼ばれるエラー:
[エラー]
├── ビジートーン
├── ファストビジートーン
└── 録音メッセージ
- エントリーアクション:エラートーンまたはメッセージを再生する。
- エグザイトアクション:に戻る
ダイアルトーンまたはアイドルユーザーの応答後に。
✅ 利点:視覚的なごちゃごちゃを軽減し、スケーラビリティを向上させます。
✅ ガード条件(オプションの強化)
遷移を細かく調整するためにガードを追加します:
digit(n) [number.length < 15] → ダイアル中
validNumber [number.isInternational] → 接続中
🛠️ ガードは無効な遷移を防ぎ、条件付き論理をサポートします。
📌 主なポイント:複雑なステートマシンのベストプラクティス
| 実践 | なぜ重要なのか |
|---|---|
| 不満なパスをモデル化する | 実際のシステムは失敗します。 無効な番号, タイムアウト, 回線が混雑信頼性を確保します。 |
| アクション式を使用する | 含める / logCallAttempt() または / playTone() 副作用を示すために使用します。 |
| イベントを詳細かつアクション指向に保つ | 使用する 受話器を置く, ルーティング済み, 通話した電話が応答代わりにe1, e2. |
| 状態の名前を明確に | 避けるState1, State2。使用する発信中, 着信中, 接続済み. |
| 前提条件を文書化する | 例:「30秒間の非活動後にタイムアウト」はコメントに記載するべきである。 |
💻 コード生成:PlantUML と Mermaid
以下は使用可能なコードブロックお好みの形式でこの図を生成するためのもの。
✅ PlantUML コード
@startuml
[*] --> Idle
Idle --> DialTone : onHook
DialTone --> Dialing : digit(n)
Dialing --> Dialing : digit(n) ' 自移動
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" as ErrorState {
state "BusyTone" as BusyTone
state "FastBusyTone" as FastBusyTone
state "RecordedMessage" as RecordedMessage
}
' 内部アクション
Idle : entry / off-hookを待機
DialTone : entry / ダイアルトーンを再生
Dialing : entry / デジットを収集
Connecting : entry / 通話をルーティング
Ringing : entry / リモート電話を鳴らす
Connected : entry / 通話セッションを確立
Disconnected : entry / セッションを終了
@enduml 📥 使い方: 貼り付けます PlantUML Live またはお使いのIDEのプラグイン。
✅ Mermaid コード

stateDiagram-v2
[*] --> Idle
Idle --> DialTone : onHook
DialTone --> Dialing : digit(n)
Dialing --> Dialing : digit(n) ' 自遷移
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
標準のビジー音を再生
end note
note right of FastBusyTone
ファストビジー音を再生(ネットワーク混雑)
end note
note right of RecordedMessage
再生されたメッセージ:「番号はサービス外です。」
end note
note right of Timeout
40秒後に通話試行がキャンセルされます
end note
📥 使い方: 貼り付けます Mermaid Live Editor またはサポートされているMarkdownツール(VS Code、Obsidianなど)。
📚 概要と最終的な考察
この 電話通話制御システム 状態機械は 現実世界の例 UMLが高信頼性を持つ複雑なイベント駆動型システムをモデル化する方法の実例です。
✅ この図が効果的な理由:
- 明確な ハッピーパス 論理的な流れを備えています。
- 包括的な エラー処理.
- 使用されている 自己遷移, 複合状態、およびガード.
- 視覚的な明確さを実現するためのグループ化および注釈.
🛠️ このパターンを使うべきタイミング:
- 電話システム
- IoTデバイス制御
- ユーザー セッション管理
- ワークフロー エンジン
- 有限状態論理を備えた組込みシステム
📝 この機能を拡張したいですか?
次のような追加を検討してください:
- 通話録音状態(
startRecording,stopRecordingイベント) - 通話転送ロジック(条件付きルーティング)
- 通話待機サポート(並列状態)
- 通話転送のサブステートとして
接続済み - 状態履歴 (浅い/深い履歴) 中断後の再入力用
📌 最終的な推奨
成功経路と失敗経路の両方をモデル化するべきである。
「幸せな経路」しか扱わない状態機械は不完全であり、本番環境でバグを起こしやすい。
このガイドを テンプレート リアルタイムシステムのモデル化に使用するもので、状態遷移, イベント、および エラー耐性 が重要である場合に使用する。
✅ 生成、可視化、または拡張の準備はできましたか?
👉 以下の PlantUML または Mermaid コードをコピーして、ドキュメント、アーキテクチャ図、またはシステム設計書に統合してください。
必要であれば、 PDF版, インタラクティブな図、または より大きなシステムモデルへの統合(例:コンポーネント図やシーケンス図を含む)!
📘 「最高のシステムは正しいだけでなく、失敗を予見している。」
— UML状態機械を用いた設計









