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












