オブジェクト間のメッセージのやり取りを時間順に表すUMLの図。
シーケンス図とは、オブジェクト間のメッセージのやり取りを時間順に表すUMLの図のことです。横方向に登場人物(オブジェクト)、縦方向に時間を取り、上から下へ処理が進みます。
身近な例で考えると、レストランでの注文のやり取りに似ています。客が店員に注文し、店員が厨房に伝え、料理ができて客に届く。「誰が誰に何を頼み、どう返ってきたか」を時系列で並べたものがシーケンス図です。
上のツールで▶ボタンを押すと、ATMで残高照会をする流れを題材に、メッセージの矢印が上から下へ1本ずつ描かれ、処理が進んでいく様子を確認できます。
シーケンス図は、次の要素を順番に置いていくと描けます。
・ライフライン:登場するオブジェクトを上に並べ、下へ点線を伸ばす(存在する時間軸)
・同期メッセージ:処理の依頼を表す実線の矢印。上から下へ時間順に引く
・実行仕様:処理中のオブジェクトの線上に置く細長い長方形
・戻りメッセージ:依頼への応答を表す破線の矢印。逆向きに戻す
ポイントは「上にあるメッセージほど先に起きる」こと。縦の位置がそのまま時間の前後を表します。依頼(実線)と応答(破線)を区別して描くと、処理の往復が読み取りやすくなります。上のツールで矢印が上から順に増えていく様子を確認してみてください。
シーケンス図は、システムが動くときのオブジェクトどうしの連携の流れを表すために使います。クラス図が「静的な構造」を表すのに対し、シーケンス図は「動的な振る舞い」を表します。
具体的な使い道は次のとおりです。
・処理の流れの設計:ある機能を実現するのに、どのオブジェクトがどの順で連携するかを決める
・仕様の共有:開発者どうしで「この操作のときの内部の動き」を正確に伝える
・不具合の調査:どこで処理が止まったか、応答が返らないかを追う手がかりにする
同じ「動的な振る舞い」を表す図でも、シーケンス図は「時間順のやり取り」に注目するのが特徴です。一連の処理で誰がいつ動くかを順番に見たいときに最も力を発揮します。クラス図で骨組みを決め、シーケンス図で動きを設計する、という流れで使い分けます。
シーケンス図には、メッセージの送り方が2種類あります。「応答を待つか・待たないか」の違いです。
・同期メッセージ(実線・塗りつぶし矢印):メッセージを送ったあと、送り手は相手の処理が終わるまで待ちます。「電話して、相手が話し終えるまで聞く」イメージです。上のツールで使われているのがこのタイプです。応答(破線)が返ってきて初めて次へ進みます
・非同期メッセージ(実線・開き矢印):メッセージを送っても、送り手は応答を待たずにすぐ次の処理へ進みます。「メールを送って、返信が来る前に別の作業をする」イメージです。受け手は独立して処理を進めます
なぜ2種類あるのか。システムによっては「応答が来るまで他のことを一切しない」ほうが安全な場合と、「待ち時間に別の処理を進めて効率を上げたい」場合があるからです。Webページを読み込む際に、画像の到着を待ちながら他の部品も並行して取得するのは非同期メッセージの考え方です。
シーケンス図の読み方を理解するには、ライフラインと実行仕様バーの2つの見た目の意味を押さえておくと便利です。
・ライフライン(縦の点線):オブジェクトのヘッダー(上の箱)から下へ伸びる点線です。「このオブジェクトがここに存在している」ことを示す時間軸です。上から下へ時間が進むので、縦の位置がそのまま「いつ」を表します
・実行仕様バー(ライフライン上の細長い長方形):オブジェクトが実際に処理を行っている時間帯を表します。メッセージを受け取ってから応答を返すまでの間が「処理中」としてハイライトされます。この長方形がある間は「そのオブジェクトがアクティブ(活動中)」という意味です
なぜ実行仕様バーが必要なのか。点線だけでは「処理中かどうか」が分かりません。バーを描くことで「メッセージを受けてから返答するまでの処理時間がどのくらいか」を視覚的に示せます。複数のオブジェクトが同時に動いているときに、「今どこで処理が詰まっているか」を一目で見つけやすくなります。上のツールでオレンジ色の細長い箱がそれにあたります。