UML シーケンス図

今回は UML のシーケンス図についてです。

UML は統一モデリング言語という、システムの仕様や設計を図法 (ダイアグラム) で表記する為の記法が統一された言語の総称です。UML にはデータ構造を表すものや処理の流れを表すもの等の13種類のダイアグラムと記法があり、シーケンス図もその中の処理の流れを表す振る舞い図の一種になります。

シーケンス図とは

シーケンス図はシステムを構成するプログラム処理の概要や流れを時系列に沿って表すダイアグラムで、イベントの発生順序やオブジェクトの生存期間、相互作用を記述することができます。
シーケンス図は下記のようなダイアグラムです。

上記はEC サイトでクレジットカード決済で購入する時の概要で、ユーザー、EC サイト、カード決済システムの三者間の流れを表しています。

シーケンス図は上から下に向かって時系列の流れを表します。縦軸にライフラインと呼ばれる処理の流れに登場するオブジェクトやクラスを配置し、構成要素を下記の表記で記述します。

表記要素説明
ライフライン処理の流れに登場するオブジェクトやクラスです。
実行仕様ライフラインが実行状態であることを表します。
停止ライフラインの消滅を表します。処理が完了しライフラインが破棄される場合に記述します。

シーケンス図では各オブジェクト間の相互作用が重要で、時系列的にメッセージの送受信を記述することで処理の流れを表します。メッセージは実行方法や送り元、送り先により下記のように記述します。

表記メッセージ説明
同期送り先のライフラインで同期で実行されるメッセージです。送り元のライフラインは応答を受け取るまで次の処理に進まず待機します。
非同期送り先のライフラインで非同期で実行されるメッセージです。送り元のライフラインは応答を受取を待たずに次の処理を実行します。
応答同期メッセージ、非同期メッセージに返却する戻り値のメッセージです。
ファウンドダイアグラム上に存在しない送り元から送られたメッセージです。
ロストダイアグラム上に存在しない送り先に送るメッセージです。

上記のシーケンス図では時系列順にユーザーがEC サイトに対して商品購入を行い、EC サイトはカード決済システムに対して決済実行、カード決済システムは EC サイトに実行結果を返却、EC サイトはユーザーに購入結果を返却しています。

複合フラグメント

プログラム処理の流れを表すにあたり条件により処理の動きが変わることがあります。このような条件分岐やループ処理を表す記述を複合フラグメントといいます。

表記名前説明
alt条件分岐
(Alternative)
条件により処理が分岐することを表します。
opt条件一致
(Option)
条件に一致した場合に処理が実行されることを表します。
ref外部参照
(Reference)
別のシーケンス図を参照することを表します。
par並列処理
(Parallel)
処理が並列で実行されることを表します。
loopループ処理
(Loop)
繰り返し処理を表します。
break中断処理
(Break)
条件に一致した場合に処理が中断されることを表します。
critical排他処理
(Critical)
同時実行時の排他制御を表します。
assertアサーション
(Assertion)
処理が実行される時のアサーション (満たされるべき条件) を表します。
neg否定処理
(Negative)
本来は発生しない不正な処理であることを表します。
consider重要処理
(Consider)
重要な処理であることを表します。
ignore無効処理
(Ignore)
重要ではない処理であることを表します。

alt は条件分岐を表し、条件により実行する処理が分岐する時に記述します。分岐する処理は破線で区切り、分岐する条件は[条件式]になります。

上記の alt の複合フラグメントでは、EC サイトでユーザーが商品を購入する処理において購入金額 >= ¥10,000であれば送料無料、購入金額 < ¥10,000であれば送料 ¥500 と表示することを表しています。

opt は条件一致を表し、特定の条件に一致した時だけ実行したい処理を記述します。指定する条件は[条件式]になります。

上記の opt の複合フラグメントでは、EC サイトで商品を購入する処理において商品にアルコールが含まれていれば成人済の同意を求める処理があることを表しています。

ref は外部参照を表し、詳細は別のシーケンス図を参照する時に記述します。

上記の ref の複合フラグメントでは、EC サイトから決済システムに連携し決済を実行する処理は別シーケンス図を参照することを表しています。

par は並列処理を表し、複数の処理を同時に実行する時に記述します。並列で実施する処理を破線で区切り表します。

上記の par の複合フラグメントでは、EC サイトの商品検索処理で S サイズと M サイズを OR 検索する時に DB に対して S サイズと M サイズをそれぞれ同時に検索することを表します。

loop はループ処理を表し、処理を繰り返し実行する時に記述します。ループが繰り返され続ける条件は loop の横に[開始, 終了]になります。

上記の loop の複合フラグメントでは、EC サイトで商品を購入する処理において購入する商品毎に在庫を購入数分減らす処理の繰り返しを表しています。

break は中断処理を表し、ループ処理が中断される時に記述します。

上記の break の複合フラグメントでは、EC サイトで商品を購入する処理において在庫を減らすループ処理の中でもし在庫数が購入数より少なければ処理を中断することを表しています。

critical は排他処理を表し、処理が外部から干渉や中断されない時に記述します。排他処理は例えば同時に同じ処理を実行した時でも、先に実行した処理は処理完了まで後から実行した処理による干渉、中断をされません。

上記の critical の複合フラグメントでは、EC サイトで商品を購入する処理において DB の在庫減算処理から決済システムの決済処理、DB の購入情報登録処理は別の商品購入や処理の影響を受けないことを表しています。商品購入では在庫数と購入情報の整合性が保たれなければならず、一連の処理の途中で別処理による DB を操作すると不整合が発生する可能性があります。このように別の処理による影響を受けない排他制御が必要な時に記述します。

assert はアサーションを記述します。アサーションは処理が実行される時の満たされるべき条件のことで、{アサーション}になります。

上記の assert の複合フラグメントでは、決済処理において決済システムに請求する決済金額が商品購入金額と送料の合計でなければならないことを表しています。

neg は否定処理を表し、本来は発生しない不正な処理に対するエラーを記述します。

上記の neg の複合フラグメントでは、決済処理において決済金額が商品購入金額と送料の合計と一致しない場合にエラーを返すことを表しています。

consider は重要処理を表し、該当の処理が重要であることを明示したい時に記述します。

上記の consider の複合フラグメントでは、EC サイトの商品検索処理においてユーザーの検索したい商品に加えてオススメ商品も検索する処理が重要な処理であることを表しています。

ignore は無効処理を表し、該当の処理が重要ではないことを明示したい時に記述します。無効処理といいますが何かを無効にする処理というわけではないので注意が必要です。

上記の ignore の複合フラグメントでは、EC サイトの商品検索処理においてユーザーの検索したい商品に加えてオススメ商品も検索する処理が重要な処理ではないことを表しています。

このようにシーケンス図を描くことでプログラム処理の流れをわかりやすくまとめることができるようになります。