矢沢久雄

●シーケンス図の役割

 今回は,シーケンス図,コラボレーション図,およびステートチャート図の役割とかき方を学習します。シーケンス図とコラボレーション図は,複数のオブジェクト間の相互作用を示すもので,これらを「相互作用図」と総称することもあります。ステートチャート図は,一つのオブジェクトの状態の変化を示すものです。

 シーケンス図では,オブジェクト(クラスのインスタンス)の相互作用を時間軸にそって示します。シーケンス図を使うことで,特定のユース・ケースのシナリオを実現するために必要となるオブジェクトの集合とオブジェクト間の交信を示すことができます。したがって,シーケンス図を作成する前に,クラス図やオブジェクト図,およびユース・ケース図とシナリオを作成しておかなければなりません。

図1●メッセージの種類を表す矢印
 オブジェクトの間の交信は,「メッセージ」によって実現されます。プログラムのソース・コードでは,オブジェクトの持つ操作(関数)を呼び出すことがメッセージの受け渡しになりますが,シーケンス図を作成する段階では,それを抽象的なメッセージとして表すのです。メッセージには,一つのオブジェクトからほかのオブジェクトに制御が移ることを示す「シンプル・メッセージ」,メッセージへの応答を待ってから処理を行うことを示す「同期メッセージ」,メッセージへの応答を待たずに処理を行うことを示す「非同期メッセージ」の3種類があります。これらは,メッセージを表す矢印の形で区別されます。矢印の先が,メッセージを受け取る側になります(図1

●シーケンス図のかき方

 シーケンス図では,縦軸に時間をとり,横方向にオブジェクトを並べます。オブジェクトから垂直に破線をかき,その上にオブジェクトの活性区間を長方形で表します。オブジェクトの活性区間とは,オブジェクトが操作を実行していることを表すものです。最初に操作を実行するオブジェクトの横には,操作を起動するアクターを記述します。シーケンス図全体で一つのユース・ケースを表していることに注意してください。

図2●シーケンス図の例
 図2[拡大表示]は,このセミナーで例としてきた電卓の「ボタンを押す」というユース・ケースのシーケンス図です。連載第2回でオブジェクト図は,「オブジェクト名:クラス名」と表すと説明しましたが,オブジェクト名を省略して「:クラス名」だけで表すこともできます。この場合には,そのクラスのオブジェクト全般を意味するものとなります。電卓のユーザー(アクター)が,ボタンを押したことからオブジェクトの操作が開始され,押したボタンの種類に応じた数値がCPUで識別され,液晶画面に数値が表示されます。これまでに登場しなかった「:CPU」というオブジェクトは,このシーケンス図のために追加したものです。

●コラボレーション図の役割

 コラボレーション図は,シーケンス図と同様に,オブジェクトの相互作用を示すためのものです。コラボレーション図は,オブジェクト図にメッセージの流れを追加した形で作成されます。シーケンス図との違いは,コラボレーション図に時間軸がないということです。オブジェクトの関連とメッセージの流れが複雑な場合は,シーケンス図よりコラボレーション図を使った方が,分かりやすい図がかける場合があります。コラボレーション図でメッセージを表すために使われる矢印の種類は,シーケンス図で使われるものと同じです。

●コラボレーション図のかき方

 コラボレーション図では,オブジェクト間の関連を実線で示し,それに沿ってメッセージの流れを矢印で示します。矢印には,メッセージの順番を示す番号とメッセージの内容を「番号:メッセージの内容( )」という形式で書き添えます。メッセージの内容の後ろのカッコ内には,メッセージの引数を記述できます。

図3●コラボレーション図の例
 図3[拡大表示]は,電卓の「ボタンを押す」というユース・ケースをコラボレーション図で表したものです。このユース・ケースのシナリオをメッセージ交信という観点から整理すると,以下のようになります。電卓のユーザーは,システム内のオブジェクトではないので,「ボタンを押す」という操作には,番号を付けていません。
1.ボタンからCPUへ,ボタンが押されたことを通知するメッセージが送信される
2.CPUから液晶画面へ,押されたボタンに応じて表示する数値が通知される

●ステートチャート図の役割

 システムは,時間の経過やオブジェクト間のメッセージの交信によって変化します。システムの変化とは,システムを構成する個々のオブジェクトの状態(state)の変化に他なりません。システムを機能の集合体と考えた構造化設計では,フローチャートで処理の流れを表しますが,システムをオブジェクトの集合体と考えるオブジェクト指向設計では,ステートチャート図でオブジェクトの状態の変化を表します。

図4●ステートチャートで使われる図記号
 ステートチャート図は,一つのオブジェクトの状態の変化を表します。これは,複数のオブジェクト間の関連を表すシーケンス図やコラボレーション図との違いです。

●ステートチャート図のかき方

 ステートチャート図では,角の丸い長方形に状態名を記述して一つの状態を表します。状態の変化は,2つの状態を実線の矢印で結ぶことで表されます。矢印の上には,状態の変化の要因を書き添えます。初期状態と最終状態は,塗りつぶされた円および内部が塗りつぶされた二重の円で表します(図4)。

図5●液晶画面オブジェクトのステートチャート図
 図5[拡大表示]は,電卓の液晶画面オブジェクトのステートチャート図です。液晶画面オブジェクトには,「計算結果を表示している状態」,「1つ目の数値を表示している状態」,および「2つ目の数値を表示している状態」の3つの状態があり,押されたボタンの種類に応じて状態が変化します。「1つ目の数値を表示している状態」で「数字ボタン」が押されたときのように,同じ状態に戻ることも,状態の変化としています。

 前回説明したクラス図とオブジェクト図は,システムを静的に分析したものだと言えます。それに対して,シーケンス図,コラボレーション図,およびステートチャート図は,システムを動的に分析したものだと言えるでしょう。UMLが,様々な角度からシステムを分析できるというイメージをつかんでいただけましたか?