振る舞いをUMLで表現する−ステートチャート図ここから始めるオブジェクト指向(7)

» 2003年04月19日 12時00分 公開
[河合昭男(有)オブジェクトデザイン研究所]

 第6回「振る舞いをUMLで表現する−相互作用図」は、オブジェクト間のコラボレーションを表現する相互作用図について説明しました。相互作用図はオブジェクト指向の基本的考え方である自律分散協調動作をモデリングするものです。UMLには、メッセージの時系列を重視するシーケンス図とオブジェクト間のコラボレーションを簡単に表現するコラボレーション図の2つのダイアグラムが定義されています。

 今回は「振る舞いをUMLで表現する」の第2回として、UMLのもう1つの動的モデルであるステートチャート図について説明します。ステートチャート図はある特定のオブジェクトに注目して、そのライフサイクルをモデリングするものです。

 はじめに前回の復習の意味で、最後に宿題として挙げておきました問題について考えてみましょう。前回の説明では、お母さんと妹が協力して弁当を作るというシナリオで相互作用モデルを作成しました。これとはちょっと違う視点で相互作用モデルを考えてみましょう。

前回の問題

 Aさんは卵焼き弁当を欲しいと思ったとします。モデルに登場するオブジェクトは弁当箱、炊飯器、米びつ、フライパンおよび冷蔵庫です。冷蔵庫には卵が入っています。これらのオブジェクトが協力してAさんの要求をどのように達成すればよいかを、オブジェクトを擬人化してちょっと遊び心で考えてください。

 子ども向け漫画やアニメの世界では、しばしば「もの」を擬人化することがあります。例えばディズニーの『美女と野獣』では、ろうそく、時計、ポットなどが人のように話したり歩いたりします。それぞれは自分の責務・役割を持っています。ろうそくは周りを照らし、時計は時刻を示し、ポットはお茶をサービスします。

 このようなアニメ風のシナリオで弁当作りの問題を考えてみましょう。

シナリオ「卵焼き弁当を取得する」

 Aさんは弁当箱さんに「卵焼き弁当を作ってください」とお願いします。弁当箱さんは炊飯器さんのところに行ってご飯を1合お願いします。炊飯器さんは米びつさんのところに行って米を1合もらいます。一方、弁当箱さんはフライパンさんのところに行って卵焼きをお願いします。フライパンさんは冷蔵庫さんのところに行って卵をもらって卵焼きを作ります。しばらくたって、弁当箱さんは炊飯器さんからご飯を、フライパンさんから卵焼きを受け取ります。材料がそろったら、弁当をセットアップしてAさんのところに届けに行きます(図1)。


ALT 図1 卵焼き弁当を作るには?

 このシナリオをUMLのコラボレーション図で表現したものを図2に示します。

ALT 図2 シナリオをコラボレーション図で表現した

 さらに、このシナリを2通りのシーケンス図で表現したものを図3図4で示します。図3は流れが理解しやすいようにリターンを記述しましたが、実際には図4のように省略するのが普通です。また図4には活性化区間を記述しています。再帰型メッセージはもう1つ小さな活性化区間を追加します。

ALT 図3 シナリオをシーケンス図で表現した(1)
ALT 図4 シナリオをシーケンス図で表現した(2)

クラスの操作

 第6回「振る舞いをUMLで表現する−相互作用図」の【責務と操作】の中で説明しましたが、メッセージは、呼ばれる側のクラスの操作と考えることができます。相互作用図に現れるメッセージをクラスの操作として図5にまとめます。

ALT 図5 クラスの操作

 これらの操作により、各クラスはその責務を果たすことができます。Aさんに弁当を提供するために、これら5つのオブジェクトに必要な責務を割り当てたわけです。

 操作名に「xxを取得する()」とあり何か変な感じがすると思いますが、操作名は呼び出す側を主語にするというのが1つのガイドラインです。

 さて、弁当作成の相互作用モデルとして、人間をオブジェクトと考えた第1のモデルと「もの」を擬人化した第2のモデルを考えましたが、次は人間と「もの」を組み合わせた第3のモデルを考えてみましょう。ここではシナリオを見やすくするために個条書きにしました(図6)。

シナリオ「卵焼き弁当を取得する」を個条書きにした

  1. Aさんは、母に弁当を依頼する
  2. 母は、米びつから米1合を取得する
  3. 母は、炊飯器に米1合をセットしてご飯を炊く
  4. 母は、冷蔵庫から卵を取り出そうとしたがなかった
  5. 母は、妹に買ってくるように依頼する
  6. 妹は、卵を買ってきて母に渡す
  7. 母は、フライパンで卵焼きを作る
  8. 母は、弁当箱を洗って、ご飯と卵焼きをセットする
  9. Aさんは、母から弁当を受け取る

ALT 図6 「弁当作成」第3のモデル

 第3のモデルのコラボレーション図シーケンス図宿題としておきますので、皆さんで考えてください。

オブジェクトの状態

 次はステートチャート図の説明に入りますが、その前にオブジェクトの状態について考えてみましょう。オブジェクトの状態は変化します。その状態は属性の値または他オブジェクトとのリンクで表現することができます。

 図7は、米びつの在庫量を属性で表現した例です。2合入っている状態から1合取り出すと1合入っている状態になります。そこからさらに1合取り出すと空の状態となり、そこに2合追加すると2合入っている状態に戻ります。これらの状態はオブジェクトの属性の値で表現することができます。

ALT 図7 状態の変化を属性値で表す

 図8は、冷蔵庫の卵の在庫量をリンクで表現した例です。冷蔵庫に卵が2個入っている状態は「:冷蔵庫」と2つの「:卵」とのリンクで表現します。この状態から1個取り出すとリンクが1つ外れた状態となります。そこからさらに1個取り出すと「:冷蔵庫」と「:卵」のリンクは存在しない状態となります。そこへ2個追加すると2つリンクのある状態に戻ります。このようにリンクの有無で状態変化を示すこともあります。

ALT 図8 状態の変化をリンクで表す

 次に「弁当箱」という1つのオブジェクトに注目してその状態の変化を追ってみましょう。

 初期状態は空の状態です。次に弁当を作り始めると、ご飯と卵焼きのどちらが先に準備できるか分かりませんが、最終的に卵焼きとご飯が入った状態になります。次にAさんが食べ終わった後、また空になりますが汚れている状態です。洗うと最初の(きれいな)空の状態に戻ります(図9)。

ALT 図9 弁当箱の状態の変化

ステートチャート図

 ステートチャート図は、ある1つのオブジェクトに注目してその状態の変化をモデリングします。オブジェクトの生成から消滅までのライフサイクルを表現することもできます。

 図9をUMLのステートチャート図で表現したものを図10に示します。オブジェクトの状態は角丸四角で表し、中に状態名を記入します。初期状態は黒丸で示します。ある状態から別の状態への状態遷移は矢印で関係付けます。状態遷移を引き起こすイベントを矢印の横に記述します

ALT 図10 ステートチャート図の例

 以上、前回と今回の2回で、UMLの2つの動的モデル−相互作用図とステートチャート図について弁当作成のシナリオを使って説明しました。普通の図とUMLのダイアグラムを並べて表現しましたが、UMLのダイアグラムがごく自然でそんなに難しいものではないと感じていただければ幸いです。

 次回は最終回として補足説明とまとめを行います。



【参考文献】
▼『まるごと図解 最新 オブジェクト指向がわかる』、河合昭男、技術評論社
▼『まるごと図解 最新UMLがわかる』、河合昭男、技術評論社【2002/12新刊】
▼『ゼロからわかるオブジェクト指向の世界』、岩田裕道+手島歩三、日刊工業新聞社
▼『Object-Oriented Methods:A Foundation』、James Martin+James Odell、Prentice Hall


プロフィール

河合昭男(かわいあきお)

 大阪大学理学部数学科卒業、日本ユニシス株式会社にてメインフレームのOS保守、性能評価の後、PCのGUI系基本ソフト開発、クライアント/サーバシステム開発を通してオブジェクト指向分析・設計に携わる。

 オブジェクト指向の本質を追究すべく1998年に独立後、有限会社オブジェクトデザイン研究所設立、理論と実践を目指し現在に至る。

 事業模型倶楽部、日本XPユーザ会、パターン言語のコミュニティなどソフトウェア新技術の学習と普及を行うコミュニティ活動に参画。著書『まるごと図解 最新オブジェクト指向がわかる』(技術評論社)、『まるごと図解 最新UMLがわかる』(技術評論社)。『UML Press』(技術評論社)、『ソリューションIT』(リックテレコム)ほかの専門誌に多数執筆。ホームページ「オブジェクト指向と哲学」。


Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ