3. モデル・図の作成 |
3.6 ステートチャート図(statechart diagram) |
今度は、今までとは少し違う視点から分析をしてみよう。あるひとつのオブジェクトの状態の変化について表す「ステートチャート図」を作成しよう。 | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
「シーケンス図」がオブジェクトのやりとりを通してユースケースのあるひとつの事例を表現しているのに対して、「ステートチャート図」は普遍的なオブジェクトの状態の変化を表現するんだよ。 | ||||||||||||||||||||||||||||||||||||
オブジェクトの状態というのは、どういうことをいうのですか? | ||||||||||||||||||||||||||||||||||||
オブジェクトの状態というのは、そのオブジェクトが存在し得るひとつの状況や条件を示していて、時間に依存しているものなんだよ。だから、ステートチャート図では、オブジェクトが生成されてからの時間の経過によるオブジェクトの状態の変化(これをライフサイクルという)を表すんだよ。 | ||||||||||||||||||||||||||||||||||||
オブジェクトの状態の変化は、クラス図とはどういう関係があるのですか? | ||||||||||||||||||||||||||||||||||||
それぞれに識別された状態は、クラスの属性や、関連の有無から判断できないといけないんだよ。 | ||||||||||||||||||||||||||||||||||||
分かりました。Jun先輩、状態には、表記上、何種類かあるのですか? | ||||||||||||||||||||||||||||||||||||
状態には、角の丸い長方形で描く「状態」のほかに、黒丸で描く開始状態と目玉マークで描く終了状態があるんだよ。開始状態はオブジェクトが生成されるときに入る初期状態で、必ず必要なんだ。それに対して、終了状態はオブジェクトの寿命が終了することを示すが、これは存在しなかったり、複数存在したりすることがありえるよ。 | ||||||||||||||||||||||||||||||||||||
終了状態が存在しなかったり、複数存在するといのはどういうことですか? | ||||||||||||||||||||||||||||||||||||
オブジェクトがある状態でずっと存在し続ける場合は、終了状態が存在しないよね。例えば、永続オブジェクトとして保存される状態や、システムがずっと動き続けている状態などが考えられるよ。複数存在するのは、終了する条件が複数ある場合だよ。 |
||||||||||||||||||||||||||||||||||||
オブジェクトがある状態から他の状態へ移行することを状態遷移と言うようですが、あるイベントによって状態遷移が起こる場合は、状態遷移にイベント名をラベルとして付ければいいのですか? | ||||||||||||||||||||||||||||||||||||
そうだよ。オブジェクトの状態遷移は、何らかのメッセージを受け取ることによって起こる可能性が高いんだ。つまり、シーケンス図で示しているメッセージがイベントになる場合があるということなんだよ。だから、ステートチャート図を作成するときは、シーケンス図との関係も考えるようにしよう。 | ||||||||||||||||||||||||||||||||||||
分かりました。ステートチャート図とシーケンス図にはそんな関係があるのですね。 |
||||||||||||||||||||||||||||||||||||
また、条件が満たされたかどうかで遷移が決まる場合もあるんだ。この条件をガード条件というんだよ。ガード条件は真偽値を値に取り、条件の値が真であるときにのみ、遷移が許されるんだよ。 | ||||||||||||||||||||||||||||||||||||
いろいろな状態遷移の仕方があるのですね。 | ||||||||||||||||||||||||||||||||||||
では、「注文商品」クラスのオブジェクトについてのステートチャート図を作成してみようか。 |
||||||||||||||||||||||||||||||||||||
図3.6 Chen君が作成したステートチャート図:「注文商品」クラスのオブジェクトについて
|
||||||||||||||||||||||||||||||||||||
開始状態から始まって、まずは「未予約」の状態です。そして、「予約」というイベントが起こりますが、在庫数が注文数に満たない場合には予約を受け付けられないので「未予約」の状態のままです。これは [在庫数<注文数] というガード条件で示しています。「予約」というイベントを受けたときに、在庫数が注文数以上の場合に「予約済」状態に遷移します。そして、「出荷作業完了」というイベントによって「出荷済」状態に遷移し、終了します。 | ||||||||||||||||||||||||||||||||||||
「予約」というイベントは、シーケンス図から考えたのかな? | ||||||||||||||||||||||||||||||||||||
はい、そうです。シーケンス図で「注文商品」に対して、予約するというメッセージが送られていることと関連させて考えました。 | ||||||||||||||||||||||||||||||||||||
そうだね。これはそれほど複雑なライフサイクルではないので、すぐにできたようだね。 | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
でも、条件によって異なる状態に変化するようなオブジェクトの場合は、複雑な図になることも考えられます。 | ||||||||||||||||||||||||||||||||||||
ステートチャート図では、状態をネストさせたり、並行状態を破線で区切って並置したりすることもできるんだよ。それによって、見た目の複雑さを実質的に減少させて、より複雑な問題をモデル化することができるんだ。ただし、ネストのレベルが深すぎると逆に分かり難くなる場合もあるから気を付けよう。 | ||||||||||||||||||||||||||||||||||||
分かりました。ところでJun先輩、ステートチャート図は、すべてのクラスのオブジェクトについて作成するものなのですか? | ||||||||||||||||||||||||||||||||||||
各クラスの振る舞いを考えるという意味では必要なのだが、実践的には、ある程度複雑なライフサイクルをもつクラスについてのみ作成すれば十分だよ。 | ||||||||||||||||||||||||||||||||||||
分析段階はここまでだよ。オブジェクト指向による分析の進め方が分かったかな? |