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