最終回 振る舞いをUMLで表現する − アクティビティ図 河合昭男 (有)オブジェクトデザイン研究所 2003/5/31 UMLの2種類の動的モデルについて「振る舞いをUMLで表現する」というテーマで、「第6回 振る舞いをUMLで表現する−相互作用図」は2つの相互作用図(シーケンス図とコラボレーション図)、「第7回 振る舞いをUMLで表現する−ステートチャート図」はステートチャート図の説明をしました。今回はアクティビティ図について説明します。相互作用図やステートチャート図を描くにはオブジェクトが必要ですが、アクティビティ図を描くのにクラスやオブジェクトは不要です。 前回宿題として挙げておきました「弁当作成」の第3のモデルを考える前に、UMLのアクティビティ図について弁当作成の例題で説明します。
アクティビティ図は処理の流れを表現するのに使用し、フローチャート図と似ています。お母さんが弁当を作成する手順は大きくは、「(1)材料を準備する」「(2)弁当を作る」という2つのステップからなります。アクティビティ図で表現すると図1のようになります。黒丸で表された開始点からスタートし、(1)、(2)のアクティビティを順番に実行して終了します。アクティビティは何かの処理を行っている状態です。処理が終了すると次のアクティビティに遷移します。
アクティビティ図がフローチャートと異なる特徴は、並行処理が記述できることです。「(1)材料を準備する」には次の2つの作業が含まれます。
この2つは並行処理が可能です。実際は1人で行うので同時並行ではないですが、どちらを先に行っても構いません。並行処理を表す「同期バー」を用いて図1を図2のように表現することができます。
同期バーには並行処理を開始する“fork”と、並行処理を終了する“join”があり、どちらも太線で表します。“join”につながるすべてのアクティビティが終了すると次のアクティビティに遷移します。
アクティビティは非アトミックです。アトミック(原子的)とはそれ以上分解できないことです。アクティビティの粒度は大きくすることも小さくすることもできます。つまりアクティビティはより小さなアクティビティに分解可能です。 図2の3つのアクティビティを分解して、それぞれをアクティビティ図で表現することができます(図3)。
条件分岐はひし形で表現します。フローチャートの条件分岐はYES/NOの2分岐ですが、アクティビティ図は2つ以上の分岐を表現できます。条件は、ひし形の出口となるすべての遷移矢印の横にガード条件として記述します。ガード条件は文章または式で記述して[]でくくって表します(図4a)。 条件分岐のひし形は省略可能です。図4bは1つのアクティビティから2つの遷移矢印が出ていますが、ガード条件を満足する方に遷移します。それぞれのガード条件は排他的に記述します。両方に同時に遷移することはできません。 条件分岐したフローが1つに合流する場合も同じひし形で表現します(図4c)。この場合ガード条件は不要です。合流のひし形は省略可能で、1つのアクティビティに入力となる複数の遷移を直接記述することもできます(図4a、図4b)。 図4a、図4b、図4cは同じ意味で、ひし形は分岐・合流を特に明示したい場合に使用します。
アクティビティは非アトミックで、各アクティビティはさらに詳細なアクティビティ図で記述できると上で述べました。これらは別のアクティビティ図として記述してもよいですが、図5のように1つのアクティビティ図として直接アクティビティ内部に入れ子にして記述することもできます。
レーン(lane)とは一般的に通路、車線のことです。UMLでは、水泳のコースとイメージが似ているのでswimlaneと呼ばれます。レーンを用いてアクティビティ図でワークフローを記述することができます。 ここまで例として挙げてきたアクティビティ図を、レーンを用いて記述してみましょう。Aさん、お母さん、妹をレーンで区分けしたアクティビティ図を図6に示します。3人の役割を明確に表現することができます。
ここで「第7回 振る舞いをUMLで表現する−ステートチャート図」で挙げておきました弁当作成の第3のモデル(図7)について、アクティビティ図を参考にしてシーケンス図を考えてみましょう。
【シナリオ:卵焼き弁当を取得する】
図7のシーケンス図はAさんがお母さんに弁当を依頼したところから始まります。お母さんの作業は、図1のアクティビティ図のとおり大きくは材料の準備と、弁当の作成です。
それぞれの内部処理は次のようになります。 1は図2のアクティビティ図のとおり、大きくはご飯の準備と卵焼きの準備です。この2つはどちらを先に実行しても構わないので非同期型で呼び出します。 2は図3および図5のアクティビティ図のとおり、ご飯と卵焼きの完成を待ってそれぞれを弁当箱にセットすることです。この2つもどちらを先に実行しても構わないので非同期型で呼び出します。 そのほか詳細は図8とその説明に示します。
第1回から第8回までの内容を振り返ってまとめてみましょう。 第1回から第3回まではオブジェクト指向の基本的考え方、第4回からはUMLを用いました。 ソフトウェアの世界は知らない間にオブジェクト指向の考え方が広く浸透して「どこでもオブジェクト」といった状況です。最近広まりだした1つの理由はインターネットの普及があります。オブジェクト指向の「自律分散協調動作」の考え方がインターネットやユビキタスコンピュータという時代の要請と方向性がよく合っているからです。 人間をオブジェクトと考え、日常の人間社会をオブジェクト指向でとらえる考え方が自然にできます。今回の企画に用いた例題も日常生活をベースにしました。 オブジェクトとは単に存在する「もの」ではなく、まず認識する主体が存在し、その主体が認識する対象物がオブジェクトです。 認識の対象物で次の条件を満たすものをオブジェクトと呼びます。
固有の振る舞いを持つ(操作) ほかのオブジェクトと何らかの関係を持つ 個別のオブジェクトとして識別できる 1つ1つ具体的なものをオブジェクトと呼び、同様のオブジェクトをグループ化して抽象化したものをクラスと呼びます。クラスに属するオブジェクトをインスタンスと呼びます。オブジェクトとインスタンスは結局同じですが、インスタンスといったときはクラスを明確に意識しています。 複雑なものを単純化して理解するための一般的な2つの手法「分類と分解」はオブジェクト指向にも取り込まれています。 汎化/特化関係によるクラス階層はクラスの「分類」です。オブジェクトを全体と部分でとらえる複合オブジェクトはオブジェクトの「分解」です。 ここからUMLを用いますが、当企画はUMLそのものの形式的説明よりもあくまでオブジェクト指向の考え方を理解することに重点を置いています。クラスの関連、多重度およびインスタンスのリンクをUMLで表現します。 クラスを階層化して分類する汎化/特化関係と、オブジェクトを分解して全体と部分でとらえる集約関係をUMLで表現します。 UMLの最も基本的なダイアグラムであるクラス図は、関連/汎化/集約などで表現します。クラス図は静的構造を表すモデルです。 相互作用図は、オブジェクト間のメッセージによる協調動作を表現します。相互作用図にはメッセージの時系列に焦点を当てるシーケンス図と、オブジェクト間のコラボレーションに焦点を当てるコラボレーション図があります。 ステートチャート図は、ある特定のオブジェクトに注目してその状態変化を表現します。あるオブジェクトの生成から消滅までのライフサイクルを表現することもできます。 最終回は処理の流れを表現するアクティビティ図です。アクティビティ図で処理の流れを示し、それを利用してシーケンス図を記述する例を示しました。 オブジェクト指向基礎講座は今回でいったん終了し、次は応用編として新たに企画したいと考えています。オブジェクト指向の考え方や、UMLのダイアグラムがごく自然なもので、そんなに難しいものではないと感じていただければ幸いです。ご愛読ありがとうございました。 ◇関連記事
【参考文献】 『まるごと図解 最新 オブジェクト指向がわかる』、河合昭男、技術評論社 『まるごと図解 最新UMLがわかる』、河合昭男、技術評論社【2002/12新刊】 『ゼロからわかるオブジェクト指向の世界』、岩田裕道+手島歩三、日刊工業新聞社 『Object-Oriented Methods:A Foundation』、James Martin+James Odell、Prentice Hall
|
[an error occurred while processing this directive] |