【チュートリアル】 - 分析編

bn_state

3. モデル・図の作成
3.6 ステートチャート図(statechart diagram)
jun 今度は、今までとは少し違う視点から分析をしてみよう。あるひとつのオブジェクトの状態の変化について表す「ステートチャート図」を作成しよう。
<< ステートチャート図 >>
◆「ステートチャート図」ってどんな図?
  • ひとつのオブジェクトの状態の変化に注目した図。
◆「ステートチャート図」

wd_state

状態
  • そのオブジェクトが存在し得るひとつの状況、条件を示す。
  • 状態は、リンクが存在するかどうかでも区別できる。
  • 状態は時間と共に変化する。
  • 特別な状態として、開始状態と終了状態がある。
    • 開始状態は必須だが、終了状態は存在しないこともある。
イベント
  • ある時点において起きる出来事。
  • 遷移するきっかけ。
状態遷移
  • ある状態から他の状態への移行。
  • 遷移は、以下のことがらの結果として起こる。
    • あるイベントが発生した
    • ある条件が満たされた
アクション
  • 遷移に付随する操作。
  • 完了するのにかかる時間は無視できる程度。
  • イベントが起きてガード条件がTrueなら遷移が起きる、その時に必ず実行される(瞬間的に)もの。
  • クラスの操作にマッピングされる。
アクティビティ
  • 完了に時間を要する操作。
  • アクティビティは、
    • 対応する状態に入ったときに開始される
    • 正常に実行され完了するか、またはその状態から出て行く遷移によって中断され得る
  • クラスの操作にマッピングされる。
jun 「シーケンス図」がオブジェクトのやりとりを通してユースケースのあるひとつの事例を表現しているのに対して、「ステートチャート図」は普遍的なオブジェクトの状態の変化を表現するんだよ。
chen オブジェクトの状態というのは、どういうことをいうのですか?
jun オブジェクトの状態というのは、そのオブジェクトが存在し得るひとつの状況や条件を示していて、時間に依存しているものなんだよ。だから、ステートチャート図では、オブジェクトが生成されてからの時間の経過によるオブジェクトの状態の変化(これをライフサイクルという)を表すんだよ。
chen オブジェクトの状態の変化は、クラス図とはどういう関係があるのですか?
jun それぞれに識別された状態は、クラスの属性や、関連の有無から判断できないといけないんだよ。
chen 分かりました。Jun先輩、状態には、表記上、何種類かあるのですか?
jun 状態には、角の丸い長方形で描く「状態」のほかに、黒丸で描く開始状態と目玉マークで描く終了状態があるんだよ。開始状態はオブジェクトが生成されるときに入る初期状態で、必ず必要なんだ。それに対して、終了状態はオブジェクトの寿命が終了することを示すが、これは存在しなかったり、複数存在したりすることがありえるよ。
chen 終了状態が存在しなかったり、複数存在するといのはどういうことですか?
jun オブジェクトがある状態でずっと存在し続ける場合は、終了状態が存在しないよね。例えば、永続オブジェクトとして保存される状態や、システムがずっと動き続けている状態などが考えられるよ。複数存在するのは、終了する条件が複数ある場合だよ。

ill_21

chen オブジェクトがある状態から他の状態へ移行することを状態遷移と言うようですが、あるイベントによって状態遷移が起こる場合は、状態遷移にイベント名をラベルとして付ければいいのですか?
jun そうだよ。オブジェクトの状態遷移は、何らかのメッセージを受け取ることによって起こる可能性が高いんだ。つまり、シーケンス図で示しているメッセージがイベントになる場合があるということなんだよ。だから、ステートチャート図を作成するときは、シーケンス図との関係も考えるようにしよう。
chen 分かりました。ステートチャート図とシーケンス図にはそんな関係があるのですね。
jun また、条件が満たされたかどうかで遷移が決まる場合もあるんだ。この条件をガード条件というんだよ。ガード条件は真偽値を値に取り、条件の値が真であるときにのみ、遷移が許されるんだよ。
chen いろいろな状態遷移の仕方があるのですね。
jun では、「注文商品」クラスのオブジェクトについてのステートチャート図を作成してみようか。
 

27_TIT_2

 

図3.6 Chen君が作成したステートチャート図:「注文商品」クラスのオブジェクトについて

state1

 

chen 開始状態から始まって、まずは「未予約」の状態です。そして、「予約」というイベントが起こりますが、在庫数が注文数に満たない場合には予約を受け付けられないので「未予約」の状態のままです。これは [在庫数<注文数] というガード条件で示しています。「予約」というイベントを受けたときに、在庫数が注文数以上の場合に「予約済」状態に遷移します。そして、「出荷作業完了」というイベントによって「出荷済」状態に遷移し、終了します。
jun 「予約」というイベントは、シーケンス図から考えたのかな?
chen はい、そうです。シーケンス図で「注文商品」に対して、予約するというメッセージが送られていることと関連させて考えました。
jun そうだね。これはそれほど複雑なライフサイクルではないので、すぐにできたようだね。

 

ill_31

 

chen でも、条件によって異なる状態に変化するようなオブジェクトの場合は、複雑な図になることも考えられます。
jun ステートチャート図では、状態をネストさせたり、並行状態を破線で区切って並置したりすることもできるんだよ。それによって、見た目の複雑さを実質的に減少させて、より複雑な問題をモデル化することができるんだ。ただし、ネストのレベルが深すぎると逆に分かり難くなる場合もあるから気を付けよう。
chen 分かりました。ところでJun先輩、ステートチャート図は、すべてのクラスのオブジェクトについて作成するものなのですか?
jun 各クラスの振る舞いを考えるという意味では必要なのだが、実践的には、ある程度複雑なライフサイクルをもつクラスについてのみ作成すれば十分だよ。
 

bn_note08

jun 分析段階はここまでだよ。オブジェクト指向による分析の進め方が分かったかな?
Prev. Next Home Top