UML 通信ダイアグラムは、歴史的にはコラボレーションダイアグラムとして知られており、システム内のオブジェクトがどのように相互作用するかを空間的な視点で示します。時間を重視するシーケンスダイアグラムとは異なり、通信ダイアグラムはコンポーネント間の構造的関係に重点を置きます。この記法で使用される特定のシンボルを理解することは、複雑なオブジェクトの相互作用を明確に文書化する必要があるアーキテクトや開発者にとって不可欠です。
このガイドでは、標準的な通信ダイアグラムに見られるすべての要素を分解して解説します。視覚的な構文、矢印が持つ意味、そしてデザインを煩雑にすることなく多重度を表現する方法を探求します。これらのコンポーネントをマスターすることで、システムドキュメントが正確で読みやすい状態を保証できます。

🏗️ ダイアグラムの主要コンポーネント
通信ダイアグラムは本質的に、ノードとエッジからなるグラフです。各ノードはシステムの一部を表し、各エッジは接続または相互作用を表します。以下のセクションでは、これらのグラフを構築するために使用される特定のシンボルを詳しく説明します。
1. オブジェクトインスタンス(ノード)
最も基本的な構成要素はオブジェクトです。通信ダイアグラムにおいて、オブジェクトは相互作用に参加するクラスのインスタンスを表します。これらは以下の特徴を持つ長方形として描かれます:
- 形状:シンプルな長方形。
- ラベル付け:長方形内のテキストは通常、インスタンス名に続けてコロンとクラス名を示します(例:”customer: Customer).
- 書式:インスタンス名は、クラス名と区別するために通常下線が引かれます。
- 多重度:場合によっては、オブジェクトがコレクションを表す場合、多重度がオブジェクトラベルの近くに表示されます。
これらのノードはすべてのメッセージの終点として機能します。オブジェクトがなければ、通信の文脈は存在しません。これらを描画する際は、曖昧さを避けるために、ダイアグラムの範囲内で名前が一意であることを確認してください。
2. リンク(関連)
リンクはオブジェクトインスタンスを接続します。これらはクラス図で定義された関連を表します。これらの線は、あるオブジェクトが別のオブジェクトへの参照を持っていることを示し、メッセージを送信可能にします。
- 視覚的表現:2 つのオブジェクト長方形を結ぶ実線の直線。
- 方向性:デフォルトでは、リンクは双方向です。ただし、特定のナビゲーション可能性は線上の矢印頭部で示すことができます。
- 役割名:リンクの近くに配置されたテキストは、接続されたオブジェクトが果たす役割を説明します(例:”manager, client).
重要な点として、リンクはシナリオの実行中に変わらないことに注意してください。リンクは、メッセージによって示される動的な振る舞いを可能にする静的な構造を表します。
| シンボル | 視覚的表現 | 意味 |
|---|---|---|
| オブジェクト | テキスト付きの矩形 | 相互作用に参加するクラスのインスタンス |
| リンク | 実線 | 通信を可能にする構造的な接続 |
| ナビゲーション矢印 | 線上の空の矢印頭 | 関連の走査方向を示す |
| 多重度 | 1..*、0..1 などの数値 | 接続できるインスタンスの数を定義する |
📩 メッセージシンボルとフロー
メッセージは通信図の心臓部です。これらはオブジェクト間の制御とデータのフローを示します。シーケンス図とは異なり、これらは垂直タイムライン上に配置されるのではなく、オブジェクトを接続するリンクに沿って配置されます。
3. メッセージ矢印
メッセージは 2 つのオブジェクトを結ぶ矢印で表されます。矢印は送信者から受信者へ向かいます。矢印頭のスタイルは通信の種類を示します:
- 実線の矢印頭:同期呼び出しを表します。送信者は、受信者が操作を完了するまで待機してから続行します。
- 破線の矢印頭:非同期メッセージを表します。送信者はメッセージを送信した後、待機せずにすぐに続行します。
- 塗りつぶしの矢印頭:返却メッセージを示すために使用されることがありますが、明確さのため返却メッセージは省略されることが多いです。
矢印のラベルには、呼び出されている操作またはメソッドの名前が含まれます。パラメータは括弧内に含めることができます。例えば、calculateTotal(price, tax).
4. シーケンス番号
図が時間順に縦に並べられていないため、シーケンス番号が極めて重要です。これらは、メッセージが発生する順序を読者に伝えます。
- 形式: 数字の後にピリオドを付けたもの(例:”1, 1.1, 2).
- ルートメッセージ: 開始は 1.
- 再帰メッセージ:あるメッセージが最初の呼び出し内にネストされた別のメッセージをトリガーする場合、以下のような小数点付き番号を使用します:”1.1, 1.2.
- 並列メッセージ:同時に発生するがネストされていないメッセージは、順次番号を振る場合があります(例:”2, 3).
これらの番号により、読者はインタラクションのタイムラインを再構築できます。これらはメッセージ矢印の近く、通常は矢印線の始点または終点に配置されます。
5. 戻りメッセージ
戻りメッセージは、結果が呼び出し元に返されることを示します。通信図では、これらは任意です。含める場合、通常は送信者へ向かう点線の矢印で表されます。特定の戻り値が重要でない限り、通常はラベルは付けられません。これらを省略することで、制御の流れはシーケンス番号から推測できるため、図がより簡潔になります。
🔢 多重度と制約
通信図では、多くの場合、オブジェクトの集合を扱います。多重度記号は、リンクに関与するクラスのインスタンスの数を示します。
- 単一インスタンス: 記号なし、または 1.
- 多数インスタンス: アスタリスク * または 0..* はゼロまたはそれ以上を示します。
- 特定の範囲: 2..5 は特定の個数範囲を示します。
- 配置: 多重性は、リンクの端に配置され、記述するオブジェクトインスタンスの隣に置かれます。
マネージャーが複数の従業員を監督するシナリオをモデル化する際、マネージャーオブジェクトと従業員オブジェクト間のリンクには、1 がマネージャー側に、0..* が従業員側に設定されます。これにより、システムの構造的容量が明確になります。
🔄 複雑な構造
標準的な通信図は線形フローに焦点を当てますが、UMLではより複雑なモデル化構文が許可されています。これらは、相互作用内の条件付きロジックやループを表すために使用されます。
6. 相互作用フレーム(ループとAlt)
純粋なコラボレーション図ではあまり一般的ではありませんが、フレームはメッセージをグループ化するために使用できます。それらは、関連するオブジェクトとメッセージを囲む大きな四角形として描画されます。
- ループフレーム: 囲まれたメッセージが繰り返されることを示します。loop または while (condition) というラベルがフレームの上部に配置されます。
- Alt フレーム: 代替パス(if/else)を表します。水平線で区切られたセクションに分かれています。各セクションには、角括弧で囲まれたガード条件(例:”)でラベル付けされます。[有効] または “[無効].
これらのフレームは、特定のシナリオを分離することで複雑さを管理するのに役立ちます。ただし、使いすぎると図が読みづらくなります。インタラクションロジックが大幅に分岐する場合のみ使用してください。
🧭 ナビゲーションと責任
オブジェクトが互いを見つけ合う方法を理解することが、図のロジックの鍵となります。これは通常、リンク矢印の方向によって示されます。
- 一方向: 矢印がオブジェクト A からオブジェクト B を指している場合、オブジェクト A はオブジェクト B を知っていますが、オブジェクト B が必ずしもオブジェクト A を知っているわけではありません。
- 双方向: 矢印のない実線は、両方のオブジェクトが互いにアクセスできることを示唆します。
この区別は結合を緩くするために不可欠です。図に”から”への直接リンクが表示されている場合、Orderオブジェクトから”へのDatabaseオブジェクトは、強い結合を意味します。より良い設計では、”を経由してルーティングするかもしれません。OrderServiceオブジェクトです。リンクの視覚的レイアウトは、このアーキテクチャ上の決定を反映すべきです。
🆚 比較:通信図 vs. シーケンス図
記号を完全に理解するには、それらが何でないかを知ることが役立ちます。” でない。通信図は、シーケンス図と比較されることがよくあります。
| 機能 | 通信図 | シーケンス図 |
|---|---|---|
| 焦点 | オブジェクト間の関係 | 時間と順序 |
| レイアウト | 構造的/幾何学的 | 垂直タイムライン |
| 時間 | 暗黙的(シーケンス番号経由) | 明示的(垂直位置) |
| アクティベーションバー | 使用しない | アクティブな実行を示すために使用 |
| 最適な用途 | 複雑なオブジェクトのナビゲーション | 詳細なタイミング分析 |
通信図のシンボルセットはシーケンス図のセットの部分集合です。垂直ライフラインやアクティベーションバーがありません。代わりに、オブジェクトの空間的配置とリンクラインに大きく依存しています。
🛠️ 明確さのためのベストプラクティス
シンボルを正しく使用することは一つのことですが、効果的に使用することは別のことです。以下は、図がプロフェッショナルで読みやすいことを保証するためのガイドラインです。
7. レイアウト戦略
- 中央配置:メインコントローラーまたは開始オブジェクトを中央に配置します。
- グループ化:関連するオブジェクトを近くに配置して、線の交差を最小限に抑えます。
- フロー:可能であれば、メッセージが左から右、または上から下へ論理的に流れるように配置します。
8. 表記規約
- 一貫した命名:図全体で同じインスタンス名を使用します。
- メソッド名:コード規約に合わせてメソッド名にはキャメルケースを使用します。
- 番号:シーケンス番号が一意で論理的であることを確認します。
9. 混乱の回避
- リンクの簡略化:相互作用に関与していないリンクは表示しないでください。これにより視覚的なノイズが軽減されます。
- メッセージの制限:相互作用が複雑すぎる場合は、複数の図に分割してください。1 つの図は 1 つの特定のシナリオをカバーすべきです。
- 戻りメッセージの非表示:必要でない限り、戻りメッセージの矢印は描画しないでください。スペースを節約し、混乱を減らすことができます。
📝 詳細な記号リファレンス
以下のリストは、遭遇する特定の視覚要素のクイックリファレンスとして機能します。
- インスタンス名:四角形内のテキスト。特定のオブジェクトを示します。
- クラス名:コロン後のテキスト。オブジェクトのタイプを示します。
- リンク線:インスタンスを接続する実線。
- 関連付け矢印:ナビゲーション可能性を示すリンク線上の矢印頭。
- メッセージ矢印:呼び出しを示す矢印。
- メッセージラベル:操作を説明するテキスト。
- シーケンス番号:メッセージの先頭にある数値プレフィックス。
- 多重度:リンクの末尾にある数値。
- フレーム:ループまたは条件のためのメッセージのグループを囲むボックス。
- ガード条件:フレーム内の角括弧内のテキスト(例:”[if open]).
🧩 実践的応用
ユーザーがログインするシナリオを考えてみましょう。図は次のように始まります。ユーザーオブジェクトが次のオブジェクトにメッセージを送信します。ログインサービスオブジェクトです。このログインサービスは次にデータベースオブジェクトに連絡して認証情報を検証します。最後に、応答をユーザー.
記号は以下のように配置されます。
- オブジェクト:三角形に配置された3つの長方形。
- リンク:これら3つすべてを結ぶ実線。
- メッセージ:
- 次の矢印:ユーザーからログインサービスへ、ラベル付き1: 認証.
- 次の矢印:ログインサービスからデータベースへ、ラベル付き1.1: 検証.
- からへの矢印データベースからログインサービス(戻り値)。
- からへの矢印ログインサービスからユーザー(戻り値)。
このレイアウトは依存関係を明確に示しています。もしログインサービスが削除された場合、ユーザーとデータベースは直接接続されなくなり、潜在的なアーキテクチャ上のリスクが浮き彫りになります。
🔍 一般的な問題のトラブルシューティング
これらの図を作成する際、特定のミスが誤解を招くことがあります。以下の落とし穴に注意してください。
- シーケンス番号の欠落:番号がないと、並行メッセージの順序が曖昧になります。チェーンの最初のメッセージには必ず番号を付けてください。
- 線の交差:交差するリンクが多すぎると、図が絡まった網のように見えます。オブジェクトの位置を再整理してください。
- 多重性の不一致:リンク上の多重性がクラス定義と一致していることを確認してください。クラスが1..1と示している場合、図には0..*.
- メッセージの過負荷:1 つの矢印に複数の操作を配置しないでください。それらを個別のメッセージに分離してください。
🎓 重要なポイントのまとめ
UML 通信図は、空間的な文脈におけるオブジェクトの相互作用を可視化するための強力なツールです。記号は単純ですが、重要な意味論的価値を持っています。オブジェクトはアクターを定義し、リンクは接続を定義し、メッセージはアクションを定義します。
標準表記に従うことで、図をレビューする誰もが追加の文脈なしにシステムアーキテクチャを理解できるようになります。シーケンス番号は時間の縦軸に代わり、より柔軟なレイアウトを可能にします。多重度記号は、構造的な関係に精度を加えます。
図の目的は単なる文書化ではなく、コミュニケーションであることを忘れないでください。記号が不適切に配置されると、情報が失われます。厳密なグリッド配置への準拠よりも、読みやすさを優先してください。複雑さを管理するためにフレームは控えめに使用し、メッセージラベルは簡潔に保ってください。
すべての記号の知識を身につけることで、明確で効果的かつプロフェッショナルなシステム設計を作成する準備が整います。コンポーネント間の関係に焦点を当てれば、動作は明確になります。











