最終回 振る舞いをUMLで表現する − アクティビティ図


河合昭男
(有)オブジェクトデザイン研究所

2003/5/31

 UMLの2種類の動的モデルについて「振る舞いをUMLで表現する」というテーマで、「第6回 振る舞いをUMLで表現する−相互作用図」は2つの相互作用図(シーケンス図とコラボレーション図)、「第7回 振る舞いをUMLで表現する−ステートチャート図」はステートチャート図の説明をしました。今回はアクティビティ図について説明します。相互作用図やステートチャート図を描くにはオブジェクトが必要ですが、アクティビティ図を描くのにクラスやオブジェクトは不要です。

 前回宿題として挙げておきました「弁当作成」の第3のモデルを考える前に、UMLのアクティビティ図について弁当作成の例題で説明します。
アクティビティ図

 アクティビティ図は処理の流れを表現するのに使用し、フローチャート図と似ています。お母さんが弁当を作成する手順は大きくは、「(1)材料を準備する」「(2)弁当を作る」という2つのステップからなります。アクティビティ図で表現すると図1のようになります。黒丸で表された開始点からスタートし、(1)、(2)のアクティビティを順番に実行して終了します。アクティビティは何かの処理を行っている状態です。処理が終了すると次のアクティビティに遷移します。

図1 アクティビティ図

並行処理

 アクティビティ図がフローチャートと異なる特徴は、並行処理が記述できることです。「(1)材料を準備する」には次の2つの作業が含まれます。

a ご飯を準備する
b 卵焼きを準備する

 この2つは並行処理が可能です。実際は1人で行うので同時並行ではないですが、どちらを先に行っても構いません。並行処理を表す「同期バー」を用いて図1図2のように表現することができます。

図2 並行処理

 同期バーには並行処理を開始する“fork”と、並行処理を終了する“join”があり、どちらも太線で表します。“join”につながるすべてのアクティビティが終了すると次のアクティビティに遷移します。

サブアクティビティ

 アクティビティは非アトミックです。アトミック(原子的)とはそれ以上分解できないことです。アクティビティの粒度は大きくすることも小さくすることもできます。つまりアクティビティはより小さなアクティビティに分解可能です。

 図2の3つのアクティビティを分解して、それぞれをアクティビティ図で表現することができます(図3)。

図3 サブアクティビティ

分岐と合流

 条件分岐はひし形で表現します。フローチャートの条件分岐はYES/NOの2分岐ですが、アクティビティ図は2つ以上の分岐を表現できます。条件は、ひし形の出口となるすべての遷移矢印の横にガード条件として記述します。ガード条件は文章または式で記述して[]でくくって表します(図4a)。

 条件分岐のひし形は省略可能です。図4bは1つのアクティビティから2つの遷移矢印が出ていますが、ガード条件を満足する方に遷移します。それぞれのガード条件は排他的に記述します。両方に同時に遷移することはできません。

 条件分岐したフローが1つに合流する場合も同じひし形で表現します(図4c)。この場合ガード条件は不要です。合流のひし形は省略可能で、1つのアクティビティに入力となる複数の遷移を直接記述することもできます(図4a図4b)。

 図4a図4b図4cは同じ意味で、ひし形は分岐・合流を特に明示したい場合に使用します。

図4 分岐と合流

アクティビティ図のネスト

 アクティビティは非アトミックで、各アクティビティはさらに詳細なアクティビティ図で記述できると上で述べました。これらは別のアクティビティ図として記述してもよいですが、図5のように1つのアクティビティ図として直接アクティビティ内部に入れ子にして記述することもできます。

図5 サブアクティビティを含むアクティビティ図

 レーン(lane)とは一般的に通路、車線のことです。UMLでは、水泳のコースとイメージが似ているのでswimlaneと呼ばれます。レーンを用いてアクティビティ図でワークフローを記述することができます。

 ここまで例として挙げてきたアクティビティ図を、レーンを用いて記述してみましょう。Aさん、お母さん、妹をレーンで区分けしたアクティビティ図を図6に示します。3人の役割を明確に表現することができます。

図6 レーン付きアクティビティ図

前回の宿題

 ここで「第7回 振る舞いをUMLで表現する−ステートチャート図」で挙げておきました弁当作成の第3のモデル(図7)について、アクティビティ図を参考にしてシーケンス図を考えてみましょう。

図7 第7回の「弁当作成」の第3のモデル

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

  1. Aさんは、母に弁当を依頼する

  2. 母は、米びつから米1合を取得する

  3. 母は、炊飯器に米1合をセットしてご飯を炊く

  4. 母は、冷蔵庫から卵を取り出そうとしたがなかった

  5. 母は、妹に買ってくるように依頼する

  6. 妹は、卵を買ってきて母に渡す

  7. 母は、フライパンで卵焼きを作る

  8. 母は、弁当箱を洗って、ご飯と卵焼きをセットする

  9. Aさんは、母から弁当を受け取る。

 図7のシーケンス図はAさんがお母さんに弁当を依頼したところから始まります。お母さんの作業は、図1のアクティビティ図のとおり大きくは材料の準備と、弁当の作成です。

  1. 母は「材料を準備する()」という再帰呼び出しを行う

  2. 母は「弁当を作る()」という再帰呼び出しを行う

 それぞれの内部処理は次のようになります。

 1は図2のアクティビティ図のとおり、大きくはご飯の準備と卵焼きの準備です。この2つはどちらを先に実行しても構わないので非同期型で呼び出します。

 2は図3および図5のアクティビティ図のとおり、ご飯と卵焼きの完成を待ってそれぞれを弁当箱にセットすることです。この2つもどちらを先に実行しても構わないので非同期型で呼び出します。

 そのほか詳細は図8とその説明に示します。

図8 第3のモデルのシーケンス図(クリックすると拡大)

図8の説明
1 母は「材料を準備する()」という再帰呼び出しを行う

 1-1 母は「ご飯を準備する()」という再帰呼び出しを行う【非同期】

  1-1-1 母は米びつの「米を取得する()」を呼び出し、米1合を取得する
  1-1-2 母は炊飯器の「炊飯器をセットする()」を呼び出す【非同期】

    1-1-2-1 炊飯器は「米を炊く()」という再帰呼び出しを行う

 1-2 母は「卵焼きを準備する()」という再帰呼び出しを行う【非同期】

  1-2-1 母は冷蔵庫の「材料を取得する()」を呼び出す(シナリオとしてここではエラーが返る)

  1-2-2 母は妹の「材料を取得する()」を呼び出す

   1-2-2-1 妹は「買い物をする()」という再帰呼び出しを実行し、卵を母に渡す
  
  1-2-3 母はフライパンの「フライパンをセットする()」を呼び出す【非同期】
  
   1-2-3-1 フライパンは「調理する()」という再帰呼び出しを行う

2 母は「弁当を作る()」という再帰呼び出しを行う

 2-1 母は「調理待ち()」という再帰呼び出しを行う【非同期】

  2-1-1 母はご飯の炊き上がりを待って弁当箱の「弁当をセットする()」を呼び出し、ご飯をセットする

 2-2 母は「調理待ち()」という再帰呼び出しを行う【非同期】

  2-2-1 母は卵の焼き上がりを待って弁当箱の「弁当をセットする()」を呼び出し、卵焼きをセットする


最後のまとめ

 第1回から第8回までの内容を振り返ってまとめてみましょう。

 第1回から第3回まではオブジェクト指向の基本的考え方、第4回からはUMLを用いました。

第1回 オブジェクト指向の考え方−どこでもオブジェクト

 ソフトウェアの世界は知らない間にオブジェクト指向の考え方が広く浸透して「どこでもオブジェクト」といった状況です。最近広まりだした1つの理由はインターネットの普及があります。オブジェクト指向の「自律分散協調動作」の考え方がインターネットやユビキタスコンピュータという時代の要請と方向性がよく合っているからです。

 人間をオブジェクトと考え、日常の人間社会をオブジェクト指向でとらえる考え方が自然にできます。今回の企画に用いた例題も日常生活をベースにしました。

 オブジェクトとは単に存在する「もの」ではなく、まず認識する主体が存在し、その主体が認識する対象物がオブジェクトです。

第2回 オブジェクトに必要な4つの特性とは?

 認識の対象物で次の条件を満たすものをオブジェクトと呼びます。

    固有の姿・形・性質を持つ(属性)

    固有の振る舞いを持つ(操作)

    ほかのオブジェクトと何らかの関係を持つ

    個別のオブジェクトとして識別できる

 1つ1つ具体的なものをオブジェクトと呼び、同様のオブジェクトをグループ化して抽象化したものをクラスと呼びます。クラスに属するオブジェクトをインスタンスと呼びます。オブジェクトとインスタンスは結局同じですが、インスタンスといったときはクラスを明確に意識しています。

第3回 複雑なものを単純に−分類と分解

 複雑なものを単純化して理解するための一般的な2つの手法「分類と分解」はオブジェクト指向にも取り込まれています。

 汎化/特化関係によるクラス階層はクラスの「分類」です。オブジェクトを全体と部分でとらえる複合オブジェクトはオブジェクトの「分解」です。

第4回 オブジェクトをUMLで表現する

 ここからUMLを用いますが、当企画はUMLそのものの形式的説明よりもあくまでオブジェクト指向の考え方を理解することに重点を置いています。クラスの関連、多重度およびインスタンスのリンクをUMLで表現します。

第5回 分類と分解をUMLで表現する

 クラスを階層化して分類する汎化/特化関係と、オブジェクトを分解して全体と部分でとらえる集約関係をUMLで表現します。

 UMLの最も基本的なダイアグラムであるクラス図は、関連/汎化/集約などで表現します。クラス図は静的構造を表すモデルです。

第6回 振る舞いをUMLで表現する−相互作用図

 相互作用図は、オブジェクト間のメッセージによる協調動作を表現します。相互作用図にはメッセージの時系列に焦点を当てるシーケンス図と、オブジェクト間のコラボレーションに焦点を当てるコラボレーション図があります。

第7回 振る舞いをUMLで表現する−ステートチャート図

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

第8回 振る舞いをUMLで表現する−アクティビティ図

 最終回は処理の流れを表現するアクティビティ図です。アクティビティ図で処理の流れを示し、それを利用してシーケンス図を記述する例を示しました。


 オブジェクト指向基礎講座は今回でいったん終了し、次は応用編として新たに企画したいと考えています。オブジェクト指向の考え方や、UMLのダイアグラムがごく自然なもので、そんなに難しいものではないと感じていただければ幸いです。ご愛読ありがとうございました。

◇関連記事

【改訂版】初歩のUML
第1回 まずはUMLのクラス図を書いてみよう
第2回 クラス図の詳細化とその目的
第3回 モデリングにおける「汎化」と「特化」
第4回 関連クラスと集約、コンポジション
第5回 クラスの依存関係と実現関係
第6回 「関連」の理解をさらに深める

Development Style FAQ UML篇

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』(リックテレコム)ほかの専門誌に多数執筆。ホームページ「オブジェクト指向と哲学」


 


[an error occurred while processing this directive]
[an error occurred while processing this directive]
[an error occurred while processing this directive]