シーケンス図の書き方
IT専科というサイトを参考にするとシーケンス図とは。。。
シーケンス図とは、クラスやオブジェクト間のやりとりを時間軸に沿って表現する図です。
アジャイルモデリング(AM)というサイトを参考にして学習します。そして、下のような図があります。
これは、手書きなのでちょっとわかりずらいですが、ポイントとしては、次のような部分です。
-
登場人物が3人(アプリケーションを含む)
-
それぞれの時間軸が縦に伸びている
-
縦軸に対して、横軸は「何かしらの動きを示す」
大まかに、このようなところがポイントになります。
アジャイルモデリング(AM)というサイトには、下のような説明がありました。
これがシーケンス図と呼ばれている理由は明らかでしょう。ロジックの実行順序(シーケンス)がメッセージ(横向きの矢印)の順序で示されています。最初のメッセージは左上から始まり、次のメッセージはそのすぐ下に書く、というように表していきます。
シーケンス図の内訳
参考サイトには、下のような説明があります。
図の上部に横に並んでいる箱は、分類子またはそのインスタンスを表します。この分類子は通常、ユースケース、オブジェクト、クラス、またはアクターです。オブジェクトとクラスにはメッセージを送ることができるため(オブジェクトは操作の呼び出しを通じて、クラスは静的操作の呼び出しを通じてメッセージに応答します)、これらをシーケンス図に含めるのは筋が通っています。アクターも、利用シナリオを開始したり、利用シナリオで能動的な役割を果たすので、シーケンス図に含めることができます。オブジェクトにはUML標準の「名前: クラス名」という書式でラベルをつけます。この名前は必須ではありません(図で名前の付いていないオブジェクトのことを無名オブジェクトと呼びます)。クラスには「クラス名」という書式でラベルを付け、アクターには「アクター名」の書式で名前を付けます。オブジェクトのラベルには下線が引かれていますが、クラスとアクターには引かれていないことに注意してください。たとえば、図3の学生オブジェクトにはある学生という名前が付けられています。これが名前付きオブジェクトです。それに対してゼミのインスタンスは無名オブジェクトです。Studentのインスタンスに名前が付けられているのは、複数の場所でメッセージのパラメータとして使われているためです。ゼミのインスタンスの方は、図の他の場所で参照する必要がないので、無名にしておくことができます。図2では、学生クラスが永続性フレームワーククラスにメッセージを送っています(永続性フレームワーククラスには\<\
>というステレオタイプを付けてもよかったのですが、図を簡潔にしておくために付けませんでした)。クラスに対して送られたメッセージは、すべて静的メソッドとして実装します。これについては後で説明します。
まとめると次のようになります。
上の図で示した「登場人物」は、「ユースケース、オブジェクト、クラス、またはアクター」
- ユースケース:「申込用紙を書く」とか、「送信ボタンを押下」などのように人の動き、作業を示す。
- オブジェクト:クラスとかインスタンスのこと(厳密にはインスタンスの事)
- アクター ;人のモデル(人を示す絵)
そして、オブジェクトはメッセージを送信することができるので、ほかのオブジェクトを呼び出し、何かしらの処理を行わせることができます。その処理が終わったら、また元のオブジェクトの線に戻ってきます。下のような矢印のことです。
※引用した文言の中に「すべて静的メソッドとして実装します」とありますが、これはこちらのサイトでそのように実装しているということです。別に静的メソッドである必要はありません。
そして、上記の手書きの画像をきれいに書くと下のようになるようです。
ここで、シーケンス図に使用される図をまとめると、IT専科というサイトの表を借りると下のようになります。
要素 | 表示形式 | 意味 | |
ライフライン(Lifeline) | 使用するオブジェクトやクラスを表現します。どちらか一方なら省略可能です。 | ||
実行仕様(ExecutionSpecification) | 生成されているライフラインが実行状態であることを意味します。 | ||
停止(Stop) | 生成されたライフライン自体の消滅を意味します。 | ||
メッセージ(Message) | 同期(Synchronous)メッセージ | 送り先のライフラインの実行に同期されるメッセージを意味します。メッセージ名には具体的な関数やINCLUDEディレクティブ等を記入します。 | |
非同期(Asynchronous)メッセージ | 送り先のライフラインの実行に同期されないメッセージを意味します。メッセージ名には具体的な関数やINCLUDEディレクティブ等を記入します。 | ||
応答(Reply)メッセージ | 送り先のライフラインから送り手への戻り値を意味します。メッセージ名には戻り値を格納する具体的な変数名等を記入します。 | ||
ファウンド(Found)メッセージ | 図解上にない送り手から送られた、もしくは送り手がダイアグラム上にないことを意味します。 | ||
ロスト(Lost)メッセージ | 意図された受け手に送られていない、もしくは受け手がダイアグラム上にないことを意味します。 |
制御構造の記述
シーケンス図では、制御構造を表現するために「複合フラグメント」を使用します。種類および、記述例は次の通りです。
複合フラグメントの種類
複合フラグメントには、次の種類があります。
InteractionOperator | 読み | 意味 |
ref | 相互作用使用(InteractionUse) | 別のシーケンス図を参照することを表します。 |
alt | オルタナティブ(Alternative) | 分岐処理を表します。 |
opt | オプション(Option) |
条件を満たした場合のみ実行される処理を表します。 |
par | パラレル(Parallel) | 並列処理を表します。 |
loop | ループ(Loop) | ループ(繰り返し)処理を表します。 |
break | ブレイク(Break) | 処理の中断を表します。 |
critical | クリティカル(Critical) | マルチスレッド環境での同期処理など、排他制御を表します。 |
assert | アサーション(Assert) | 処理が妥当であるための定義を表します。 |
neg | 否定(negation) |
本来、実行されるはずがない処理(メッセージ)であることを表します。 |
ignore | 無効(ignore) | あまり重要な処理(メッセージ)ではないことを表します。 |
consider | 有効(Consider) | 重要な処理(メッセージ)であることを表します。 |
基本的な処理を表現する
ここでいう「基本的な処理」とは、次のものを指します。
- 参照(REF)
- 条件分岐(ALT)
- 条件判断(OPT)
- 並列処理(PAR)
- 反復処理(LOOP)
- 中断(BREAK)
- クリティカルセッション(CRITICAL)
- アサート(ASSERT)
- 不正なシーケンス(NEG)
- 無効(IGNORE)
- 有効(CONSIDER)
このような形で記述します。あとは、どのような動きを表現したいのか?を考えるだけです。
しかし、これらの「動き」を考えるためには、プログラミングの基礎を理解する必要があります。
※よかったら参考にどうぞ、Java Basic学習フロー
具体的には、「じゃんけんゲーム」を作成しようと考えたときには、どのような画面で、ユーザーの入力はどのように行うのか?などの「人間レベル」の動きから、「入力値からどのような処理をして勝敗の判定を行うか?」という「プログラムレベル」の動きを考える必要があるためです。
こんなところで失礼します。
でわでわ。。。