検索
連載

EclipseUMLプラグインでUML図を描くEclipse徹底活用(3)

Share
Tweet
LINE
Hatena

 第2回「Eclipseをモデリングツールに活用しよう」ではEclipseUMLプラグインの紹介とインストールを行いました。

 今回は、「書籍管理システム」の機能を順次実装していくことを想定し、UMLをEclipse上で作図してみましょう。説明は設計工程の流れに沿いながら行います。前回も触れましたが、Web系のシステムでは、ユースケース図、クラス図、シーケンス図がよく利用されます。ですので、これらについては詳しく見ていきますが、それ以外については本稿では簡単な紹介にとどめます。

[要件抽出/分析]ユースケースを記述する

扱う図 ユースケース図
記述可能アイテム アクター、ユースケース、システム
関連、汎化、包含、拡張

 この図は複雑な表記があまり必要ありませんので、題材が決まっていればすぐに作成できます。要件定義が終わった段階で、オペレータがシステムにログインして検索処理を行うような場合は、次の構成で図を描くことになります。

(1) 「Create an actor」で「オペレータ」を作成
(2) 「Create a system」で「書籍管理システム」を作成
(3) 「Create a use case」で「検索する」を作成し、(2)で作ったシステムの中にユースケースを移動(この時点でユースケースとシステムは同一グループになり、一緒に動かせるようになります)
(4) 「Add an association」で「オペレータ」と「ユースケース」を関連付け
(5) 「Note」、「Indication」で適宜説明を付加


画面1 ユースケース図
画面1 ユースケース図

[基本設計]概念モデルを抽出して記述する

扱う図 クラス図
記述可能アイテム クラス、インターフェイス、パッケージ
関連(プロパティ…「集約」「コンポジション」「ロール名」「多重度」)
依存関係
汎化

 UMLを用いて設計する場合に基礎となる図です。この図を随時修正していくことで、より詳細なクラス図を作成していくことになります。書籍の検索処理と併せて検索履歴も保存しようとした場合、例えばクラスの基になるものとして、「Book」「BookList」「Keyword」「KeywordHistory」の4つを考えることができます。

(1) 「Create a class」で上記4つのクラスを作成
(2) 「Association」で各クラス間を関連付け


 関連付けは、オリジナルのクラスをクリックしてから、ターゲットとなるクラスをクリックし、それぞれのクラスの側で、各種プロパティを入力します。その際には、例えば集約であれば、構成する要素側のプロパティの「Association Type」を「Aggregation」に指定します。また、関連付けの際に自動で作成されるメソッド類については、必要に応じて残したり消したりしてください。そもそも、アクセサメソッドが必要ない場合は、「use accessor」のチェックを外します。

 なお、一連の作業は、パッケージやインターフェイスについてもほぼ同様となります。

ワンポイント

  1. クラス図を作成するときのクラス名、属性名、メソッド名に日本語を入力することは可能ですが、その場合、自動生成されるソースには、その日本語がそのまま使われてしまいます。これについては、何かと不便な場合もありますので、「日本語を使わない」という運用をお勧めします。

  2. デフォルトの設定では、可視性を表すのに色付きアイコンが使われたり、staticやfinalは、頭文字がアイコンと一緒に表示されたりなど、Eclipse用の表示形態になっています。このデフォルト設定は、「ウィンドウ」→「設定」から「UML」→「Class Diagram」を展開した「Class」にある値となります。

 UMLで一般的に使われる「+」「-」「#」に変更したいときは、「ウィンドウ」→「設定」→「UML」→「Appearance」タブにある「presentation style」を、デフォルトの「Eclipse」から「UML Standard」に変更します。一方、クラスの表示方法自体も、右クリックで選択できます。「Maximize」「Minimize」をはじめとする表示方法の変更が可能で、「View Selector」を選択すると、属性やメソッド単位で、表示する/しないを変更することもできます。図の用途に応じて変更するとよいでしょう。

画面2 クラス図
画面2 クラス図

 さて、概念モデルの話はここまでですので、この図はいったん保存して作成をやめ、次の作業に移ります。

[基本設計]概念モデルからシーケンスを記述する

扱う図 シーケンス図
記述可能アイテム アクター、オブジェクト
メッセージ(プロパティ…「生成」「消滅」「条件」「同期(非同期)」「リターンの有無」)
再帰

 先ほどの概念モデルにあるクラスの元を利用して処理の流れを記述します。実際に具体的な検索処理の流れを考慮して、以下のような順で図を作成します。

(1) 「Create an actor」で「オペレータ」を作成
(2) 「Add a new object」で「検索処理画面」「検索管理」を作成(type:Object)
(3) 「Add a new object」で概念モデルで作成した4つのクラスそれぞれの型を指定しオブジェクトを作成
(4) 「Add a message」でそれぞれのオブジェクト間にメッセージを追加


 オブジェクト作成時のプロパティを入力するときに、クラスの型を指定しなくてはなりません(画面3)。このとき、放っておくと何も表示されませんが、1文字でも入力すると、その文字で始まる選択可能なクラスが表示されます。文字を入力するたびに、表示されるものが絞られていきます。

画面3 クラスの型を指定する
画面3 クラスの型を指定する

 メッセージの追加のとき、まずは「ラベル」を記述します。伝達先に、すでに作成してあるクラスを指定した場合は、Operationの欄に当該クラスに作成済みのメソッドが並びますので、それを選択します。

ワンポイント

  1. メッセージの追加に関しては、いったんデフォルトのままで「OK」をクリックして作成した後に、再度それを右クリックしてプロパティを指定して情報を追加した方がよいでしょう。オブジェクトの「生成」など、そうしないと書けない項目がいくつかありますので注意してください。

  2. デフォルトでは表示されませんが、この図には、シーケンス番号が自動的に割り振られています。これを表示したい場合には、「ウィンドウ」→「設定」から「UML」→「Sequence Diagram」の「Show Sequence Numbers」にチェックを入れます。

  3. 複数ある処理の流れを「分岐」として記述することはできませんが、条件の記述である程度カバーできますので、うまく使えば、単純なインスタンス形式の図(1ユースケースにつき1つの図を描く)だけではなく、各イベントフロー(各種ユースケース)に対応するジェネリック形式のシーケンス図(複数のユースケースを1つの図に描く)を作成できますので、活用してください。

  4. すでにクラスが存在し、かつメソッドが作成してあれば、クラス図から当該メソッドを右クリックして「Create/Open sequence diagram」を選択することで、そのメソッドに関するシーケンス図を作成する(開く)ことができます。

 シーケンス図そのものは、別に作成することもできますが、その際は、作成したシーケンス図の名前を適宜変更すると、この操作と連携できるようになります。同様に、クラスを右クリックして「Create/Open state diagram」を選択することで、そのクラスに関するステート図を作成する(開く)こともできます。

画面4 シーケンス図
画面4 シーケンス図

[詳細設計]記述したシーケンス図からクラス図を補う

扱う図 クラス図

 先ほど記述した概念レベルのクラス図をより詳細に記述します。

(1) 新たなクラスの追加、プロパティの編集
(2) メソッド、属性の追加
(3) 関連の追加


 記述方法は「[基本設計]概念モデルを抽出して記述する」とほぼ重なりますので、詳細は割愛します。以下のポイントも参考にしてください。

ワンポイント

  1. 「ステレオタイプ」を記述する場合は、既存のクラスのプロパティを編集するか、新規クラスの作成時に「Next」をクリックして入力します。

  2. メソッドを作成するときは、クラスを右クリックし、「New」→「Method」を選択します。3つのタブが表示されますが、「Properties」タブで各種指定をします。ある程度判断できる場合は、「Implementation」タブにメソッドの実装部分を、「Javadoc」タブにJavadoc用のドキュメントを記述すると、それらはそのままソースに反映されます。

  3. 属性を作成する場合は、クラスを右クリックし、「New」→「Attribute」を選択します。メソッドのときと同様に「Properties」タブで各種指定をします。必要であれば「Javadoc」タブも記述してください。インナークラスやインナーインターフェイスも同様に作成できます。

  4. メソッド名や属性名を変更する時は、それを直接指定して「Properties」から変更しますが、クラス名を変更する場合は、「Refactor」から「Rename Elements」を選択します。ただし、一度作成した属性名を変更した場合、元の属性名に対してソースに作成されたgetter、setterメソッドは、そのままソースに残ってしまいますので、自分で削除する必要があります。

  5. 関連付けの線を引くときは、「Router」のタブで、最初は「Manual」「Fixed at edge」でクラスと線の接点を決めた後、「Manhattan」に変更して調節すると、見栄えがよくなります。

画面5 クラス図
画面5 クラス図

 基本的には、このような形で設計を進めて、クラス図、シーケンス図を整理していきます。ここから先は実装の話とも関連します。

[プログラミング]パッケージの整理

扱う図 クラス図

 パッケージ図を記述する場合はクラス図を作成することになりますが、既存のどのクラスを扱うかを決定する必要があります。ここでは、作成したすべてのクラス(6つ)を使うことにしています。先のクラス図に、新たに以下の操作を行います。

(1) 「Create a package」で「bookdata.view」「bookdata.control」「bookdata.book」「bookdata.keyword」パッケージを作成
(2) クラスの右クリック→「View Selector」でメソッドを非表示化して、おのおのをパッケージ内に移動
(3) パッケージ・エクスプローラ間でのファイル移動
(4) パッケージ間の関連付け


 (2)まで実行すると(画面6)のようになります。ここで保存してもクラス図のみの情報になりますので、次に、パッケージ・エクスプローラ上で、既存の「….java」を当該パッケージ内にドラッグ&ドロップすることで、構成の情報がクラス図やソースにも反映されます。

画面6 パッケージ・エクスプローラから「….java」をドラッグ&ドロップすることで、構成の情報がクラス図に反映される
画面6 パッケージ・エクスプローラから「….java」をドラッグ&ドロップすることで、構成の情報がクラス図に反映される

 今回の流れでは、クラスを作成していきながら、パッケージにまとめられそうなものを抽出、分類しています。コンポーネント構成を決めてから細かいクラス設計を行うのであれば、先にパッケージ図を作成する場合もあるでしょう。その場合クラス図には、エディタから右クリックで「Insert」→「Package」を実行してください。

画面7 パッケージ間の関連付け
画面7 パッケージ間の関連付け

[プログラミング]コンポーネント分割、配置の整理

扱う図 コンポーネント図、配置図
記述可能アイテム コンポーネント
インターフェイス、人工物
汎化、依存、実体化
ノード
関連付け

 ある程度条件が決まっている場合は、描かずに済まされることもありますが、このような図を描くことも可能です。一部、コンポーネントが正しく表示されないのはバグと思われます。

画面8 コンポーネント図
画面8 コンポーネント図
画面9 コンポーネント図
画面9 コンポーネント図

 さて、大まかですが、工程に沿って使われるそれぞれの図についての説明をしてきました。これ以降の図については、位置付けも兼ねて紹介程度に説明します。

その他の図

コラボレーション図

記述可能アイテム アクター
オブジェクト(プロパティ…「ロール」「タイプ」「アクティブ」「マルチプル」)
メッセージ(プロパティ…「引数」「返却値」「シーケンス番号」「同期(非同期)」「先行子」「繰り返し」)

 相互作用図の1つです。基本的にシーケンス図と同じ情報を違う観点から表します。

 仕様レベルコラボレーション図、および、ロールを入れたインスタンスレベルのコラボレーション図を作成できます。特に欄はありませんが、「並行処理」については、「シーケンス番号」にまとめて記述できます。

画面9 コラボレーション図
画面9 コラボレーション図

オブジェクト図

記述可能アイテム インスタンス(プロパティ…「属性」「アクティブ」「多重度」)
関連(プロパティ…「集約」「コンポジション」)
フロー

 コラボレーション図からメッセージをなくした図になります。コラボレーション図がシステムの動的な側面を表すのに対し、このオブジェクト図は静的な側面を表します。

画面10 オブジェクト図
画面10 オブジェクト図

ステートチャート図

記述可能アイテム ステート
履歴(プロパティ…「浅い」「深い」)
開始状態、終了状態(プロパティ…「イベント名」))
遷移(自己遷移)(プロパティ…「イベント名」「引数」「ガード条件」「アクション」))

 例では、自動販売機の内部状態を示していますが、このように状態遷移するものを整理するときに利用します。主に、組み込み系アプリケーションを作成する際に記述されます。

 完了遷移(矢印だけ)を記述するときは、ダイアログに何も入力せずに「OK」をクリックします。また、コンポジット状態は、複数のステートを1つのステートで囲んで記述します。

画面11 インストーラー起動画面。日本語の選択も可能
画面11 インストーラー起動画面。日本語の選択も可能

アクティビティ図

記述可能アイテム アクティビティ、オブジェクト
開始状態、終了状態、デシジョン、マージ
フォーク/ジョイン(プロパティ…「線の向き」)
レーン(partition)、シグナル
遷移(プロパティ…「引数」「ガード条件」「アクション」)
オブジェクトフロー

 ステートチャート図と似ていますが、こちらの図はワークフローを確認できます。そのため、Webアプリケーションを作成する際には、こちらを利用する場合が多いです。Toolbarに並ぶアイテムがステートチャート図と重複していますので、混同しないようにしてください。各アクティビティは、レーンを作成、指定し、その中に記述します。

画面12 アクティビティ図
画面12 アクティビティ図

まとめ

 商用製品と比較した場合に、若干の力不足を感じますが、フリーでこれだけの図が描けるプラグインが存在していることが、Eclipseの大きな魅力です。開発チームのブレーンストーミング用資料として、これを使って手早く図を描き、随時修正していく、といった用途には十分利用できるでしょう。操作も難しくはなく、習うより慣れろで書けるツールであると思います。

 このプラグインについて日本語で情報交換されているWeb「Eclipse Wiki(http://w3.cube-web.net/eclipse/)」もありますので、適宜参照するといいでしょう。

 さらなる可能性を秘めたこのプラグイン、適材適所で使ってコスト削減につなげることができると思いますので、皆さんもどんどん試してみてください。

正しく動いていないような気がする?

すでに、EMFやGMFのプラグインを利用している場合に、このEclipseUMLプラグインをインストールして使っていると、ファイルが作成されなかったり、ウィザードが次に進まなかったり、「おや?」と思うことがあるかもしれません。その状況は、EclipseUMLプラグインで利用しているEMF、GMFとの整合性が取れていない可能性があります。そのような場合は、EclipseUMLプラグインをいったんアンインストールし、再度インストールすることで正しく動くようになります。アンインストールは、「C:\Program Files\eclipse\Uninstaller」配下に「uninstaller.jar」がありますので、コマンドプロンプトから「java -jar uninstaller.jar」を実行します。その後、インストールすれば動作するようになります。なお、各種の図で右クリックしたときに表示されるメニューのうち、「Zoom-In(Out)」については、動作確認されているGEFプラグインの、最新バージョン用機能となっていますのでご注意ください。


筆者プロフィール

山口 卓也(やまぐち たくや)

現在、株式会社NTTデータ ビジネス開発事業本部に所属。社内技術支援業務に携わり、主に、J2EEをベースにしたWebシステムに関する障害対応やトラブルシュートから方式設計、オープンソース製品関連のサポートを担当している。


筆者プロフィール

岡本 隆史(おかもと たかし)

NTTデータ 技術開発本部 所属。Debian GNU/Linuxの優れたメンテナンス性と他のディストリビューションを圧倒するパッケージ数に引かれDebianを使い始めたのをきっかけに、Debian プロジェクトの開発者となりJavaサポートの強化を行う。『Jakartaプロジェクト徹底攻略』(技術評論社)、『WEB+DB PRESS』(技術評論社)、『Java World』(IDGジャパン)、『JAVA Developer』(ソフトバンクパブリッシング)などで執筆活動を行っている。



Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る