第6回 振る舞いをUMLで表現する−相互作用図
河合昭男
(有)オブジェクトデザイン研究所
2003/3/26
「第5回 分類と分解をUMLで表現する」はクラス図解説の2回目として、クラスの汎化関係、集約関係について説明しました。クラス図はクラス間の静的な関係を表現するモデルです。今回は動的モデルの第1回としてオブジェクト間のコラボレーションを表す相互作用図について説明します。
はじめに前回の復習の意味で、宿題として挙げておきました問題について考えてみましょう。
【前回の問題】
電気スタンドには電球式と蛍光灯式があります。汎化と集約関係を用いて以下の条件を満たすクラス図を作成してください。
電球式と蛍光灯式 |
電球式は電球を、蛍光灯式は蛍光灯を持つ |
蛍光灯式にはインバータ型とグロー型 |
グロー型はグローを持つ |
電気スタンドはスイッチを持つ |
図1 電気スタンドのクラス図
|
これは、クラスの分類を汎化関係で表現し、オブジェクトの分解を集約関係で表現するという問題です。UMLのクラス図で表現すると図1のようになります。汎化関係により親クラスの属性、操作および関連を子クラスが継承すると前回説明しましたが、集約関係も関連の一種であり継承します。図ではスイッチは一番おおもとの電気スタンドの部品として集約関連で接続されています。これは電気スタンドのすべてのサブクラスがスイッチを持つことを意味します。
オブジェクト図を描いてみるとクラス図の意味が理解できます。図2(a)はインバータ式蛍光灯スタンドの例です。クラス図の汎化関係をたどっていくと、インバータ式蛍光灯スタンドはスイッチおよび蛍光灯とリンクします。図2(b)はグロー式の例です。グロー式は、スイッチ、蛍光灯とさらにグロー球とリンクします。この問題で汎化と集約の使い方を少しは理解できたと思います。
図2 オブジェクト図の例
|
相互作用図 |
【自律分散協調動作】
オブジェクトは1つ1つは自律していますが、それらが「メッセージを通して、協調しながら全体として1つの仕事をする」というのがオブジェクト指向の自律分散協調動作の考え方です。人間をオブジェクトと考えると、会話がメッセージということになります。「第1回
オブジェクト指向の考え方」の例についてもう一度考えてみましょう。
ある日あなたは、お母さんに「明日持っていくお弁当を作ってください」とお願いします。お母さんは冷蔵庫を開けましたが、卵が入っていなかったので、あなたの妹にお金を渡して「卵を買ってきて」と頼みます。妹は買い物をして、卵とお釣りを渡します。明日の朝、お母さんは弁当を作ってあなたに渡します。 |
図3 第1回で解説したコラボレーションの例
|
【相互作用図】
相互作用図はオブジェクトとオブジェクトとのメッセージによる協調動作を表現します。UMLではシーケンス図とコラボレーション図の2つのダイアグラムが定義されています。
【コラボレーション図】
相互作用図を描くときは1つのシナリオを想定します。例えば前述のシナリオに従ってコラボレーション図を描いてみましょう。
コラボレーション図を描くにはまずシナリオに参加するオブジェクトを抽出します。弁当、冷蔵庫、卵などもオブジェクトですが、ここでは単純化して「自分」「母」「妹」の3つのオブジェクトを対象としてモデルを考えます。次にこれらのオブジェクト間でどのようにメッセージを送ってシナリオを完成させるかを書き込んでいきます。メッセージを送る相手との間をリンクでつなぎ、その近くにメッセージと矢印を記述します。メッセージで渡すパラメータは()で記述します。シナリオに従って個条書きにすると次のようになります(図4)。なお、オブジェクトは下線を引いて表記します。
- 「自分」から「母」に「弁当を頼む(卵焼き)」というメッセージを送ります
- 「母」から「妹」に「買い物を頼む(卵)」というメッセージを送ります
- 「妹」は自分自身に「買い物をする(卵)」というメッセージを送ります
- 「妹」はメッセージ2の依頼により、買ってきた卵を「母」に渡します
- 「母」はメッセージ1の依頼を達成するため、自身に「弁当を作る(卵焼き)」というメッセージを送り、完成したら弁当を「自分」に渡します
こうして母と妹の協力により、自分は弁当を受け取ることができるわけです。
図4 コラボレーション図の例
|
【シーケンス図】
シーケンス図もコラボレーション図と意味内容は同じです。ただし、コラボレーション図はメッセージの順番を重視しませんが、シーケンス図はメッセージの順番を時系列で表現する点でコラボレーション図と違いがあります。
シーケンス図は、オブジェクトを上に並べ、その下に生存線と呼ばれる点線を引きます。これはオブジェクトが存在する時間を表します。メッセージはこの生存線の間に、シナリオの時間の流れに沿って上から順に並べていきます(図5)。2つの相互作用図(図4と図5)を比べると、意味内容は同じであることが分かるでしょう。
図5 シーケンス図の例
|
【メッセージの同期、非同期】
メッセージを送信した後、受け取り側でその処理が終了してリターンが返されるまで次に進めないメッセージを同期型と呼びます。一方、メッセージを送信してもリターンを期待せず、次に進めるメッセージを非同期型と呼びます。リターンは煩雑さを避けるため、記述しないのが普通です。
UMLでは、「矢印の先を塗りつぶし」て同期型のメッセージを記述します。「開いている矢印」が非同期型です。リターンは点線矢印で記述します(図6)。
図6 メッセージの同期と非同期
|
例えば前述のシナリオの例では、卵を買ってきてもらわないと卵焼きは作れません。しかし、例えばシナリオを少し変更して、すでに冷蔵庫に卵があったとしましょう。また、お母さんは忙しいので、妹に観葉植物の水やりを頼んだとします。この場合、水やりの作業は弁当を作る作業と関係ないので、頼んだ時点ですぐに次の作業を行うことができます。つまり、「買い物を頼む()」が同期型、「水やりを頼む()」が非同期型です(図7)。
図7 同期型と非同期型の例
|
【責務と操作】
自律分散協調動作を行うための前提は、各オブジェクトが自分自身の責務あるいは役割を持っていることです。その責務を果たすための操作を呼び出すのがメッセージです。
上のシナリオの例では、母には「弁当を作る()」、妹には「買い物をする()」や「水をやる()」という責務があると考えられます。「弁当を頼む()」や「買い物を頼む()」というメッセージは、それぞれ「弁当を作る()」、「買い物をする()」という責務を果たすための操作を呼び出していることになります(図8)。
図8 メッセージと操作
|
このように、メッセージは結局、受け側の操作を呼び出していることになるので、先ほどのシーケンス図をそのように書き直すと、図9のようになります。図9の生存線上の長方形は、呼び出された操作がアクティブな時間を表すもので、活性化区間または制御フォーカスと呼びます。
図9 操作を呼び出す
|
【問題】
ここまでの説明では、お母さんと妹が協力して弁当を作るというモデルを作成しました。今度はちょっと違うモデルを考えてみましょう。
図10 卵焼き弁当を作るには?
|
図10を見てください。「卵焼き弁当が欲しい」と思っているAさんがいるとします。このモデルに登場するオブジェクトは、弁当箱、炊飯器、米びつ、フライパンおよび冷蔵庫です。冷蔵庫には卵が入っています。これらのオブジェクトが、Aさんの要求を達成するにはどうすればよいでしょう。オブジェクトを擬人化して、ちょっと遊び心を加えて考えてみてください。次回、この問題の解説を行います。
今回はUML解説の第3回目として、シーケンス図とコラボレーション図という2つの相互作用図について、具体例を示しながら説明しました。
クラス図はクラス間の静的関係を表す静的モデルですが、2つの相互作用図はオブジェクト間のメッセージによる協調動作を表す動的モデルです。そのほか、UMLには、1つのオブジェクトのライフサイクルを表すステートチャート図があります。次回はUMLのこのもう1つの動的モデルについて説明します。
IT Architect 連載記事一覧 |
【参考文献】
『まるごと図解 最新 オブジェクト指向がわかる』、河合昭男、技術評論社
『まるごと図解 最新UMLがわかる』、河合昭男、技術評論社【2002/12新刊】
『ゼロからわかるオブジェクト指向の世界』、岩田裕道+手島歩三、日刊工業新聞社
『Object-Oriented Methods:A Foundation』、James Martin+James Odell、Prentice Hall
プロフィール |
河合昭男(かわいあきお) 大阪大学理学部数学科卒業、日本ユニシス株式会社にてメインフレームのOS保守、性能評価の後、PCのGUI系基本ソフト開発、クライアント/サーバシステム開発を通してオブジェクト指向分析・設計に携わる。 オブジェクト指向の本質を追究すべく1998年に独立後、有限会社オブジェクトデザイン研究所設立、理論と実践を目指し現在に至る。 事業模型倶楽部、日本XPユーザ会、パターン言語のコミュニティなどソフトウェア新技術の学習と普及を行うコミュニティ活動に参画。著書『まるごと図解 最新オブジェクト指向がわかる』(技術評論社)、『まるごと図解 最新UMLがわかる』(技術評論社)。『UML Press』(技術評論社)、『ソリューションIT』(リックテレコム)ほかの専門誌に多数執筆。ホームページ「オブジェクト指向と哲学」。 |