第 12 回 UML

本日の内容


このドキュメントは http://edu.net.c.dendai.ac.jp/ 上で公開されています。

12-1. UML とは

UML(Uniformed Modeling Language 統一モデリング言語)は オブジェクト指向のソフトウェアを設計、記述する際に使う、グラフィカルな 記述法です。 オブジェクト指向のプログラミングにおいて、 UML は様々な利用法があります。 まず、設計をする際に構想などをまとめたりすることができます。 さらに既存のソフトウェアを解析するときなどにも使えます。 これらはアイディアを記述し、ソフトウェアの理解を深めるものです。 また、設計図面として利用することもできます。 つまり、ソフトウェアのドキュメントとして活用できるということです。 さらに、CASE(Computer Aided Software Engineering) ツールを 介して UML によるプログラミングもできます。 NetBeans や Eclipse などのエディタで、 UML を利用して Java のプログラ ミングを支援するようなツールを使うことができます。

UML 2.0 では 13 種類の図があります。 13種類の図は、構造を表すもの(構造図)と、振る舞いを表すもの (振る舞い図) に分類できます。 さらに、振る舞い図の中にはオブジェクト同士の関係を表す 相互作用図として分類できるものがあります。 13 種類の図の分類を下記に示します。

分類名称役割
構造図 クラス図 クラスの特性や関係
オブジェクト図実際のインスタンスの構 造
パッケージ図プログラムのコンパイルにおける依 存関係など
配置図システムにおけるオブジェクトなどの配 置
コンポーネント図システムの機能毎の分類と関連
コンポジット構造図クラスの内部構造の階層的表現
振る舞い図 ユースケース図ユーザとシステムの関わり合い
状態マシン図システムの振る舞いの記述
アクティビティ図フローチャートのような並列的 な手続きの流れ
振る舞い図 相互作用図 シーケンス図各オブジェクト間でのメッセージのやり とりの流れ
コミュニケーション図シーケンス図と同様だが、 オブジェクトの配置を自由にできる
相互作用概要図アクティビティ図+シーケンス図
タイミング図ソフトウェアのタイミングチャート

上記の全ての図をマスターする必要はありません。 必要な状況に応じて活用すれば充分です。 また、本資料では上記のうち、赤で示した図のみを紹介します。 このうち特に重要なのが、クラス図とシーケンス図です。

古くは、フローチャート、変数表、関数表などがこの役割を担ってましたが、 多くの専門家が時間をかけて洗練してきたため、UML は従来の記述に比べて記 述性などが高くなっています。

12-2. 構造図

クラス図

クラス図は CRC カードのようなもので、長方形の中にクラス名、メンバ変数 名、メソッド名が書かれているものです。

基本書式

例えば下記のようなプログラムを考えます。


public class Keyboard extends InputStream {
    final private JPanel panel= new JPanel();
    public Keyboard(){
...
    }
    public JPanel getPanel(){
...
    }
    public ActionListener getCloseAction(){
...
    }
    private LinkedList<Integer> queue= new LinkedList<Integer>();
    @Override
    public int read() throws IOException {
...
    }
    @Override
    public int available() throws IOException {
...
    }
    @Override
    public int read(byte[] b, int off, int len) throws IOException {
...
    }
}

この時、クラス図は以下のようになります。

Keyboard
-panel: JPanel
-queue: LinkedList<Integer>
+Keyboard():Keyboard
+getPanel():JPanel
+getCloseAction():ActionListener
+read():int
+available():int
+read(byte[], int , int ):int

一番上の欄はクラス名、二番目の欄は属性(メンバ変数)、 三番目の欄は操作(メソッド)を表します。

属性の書式は次の通りです。

可視性 名前: 型 多重度 = デフォルト値{プロパティ文字列}

可視性は +(プラス) が public, -(マイナス) が private です。 多重度は配列変数のように[](角カッコ)で表現し、最小要素数と、最大要素数 を .. (ピリオド二つ)で区切って記述します。0 または 1 は 0..1 で表します。 無制限の場合は *(アスタリスク) で表現します。 上記の -queue: LinkedList<Integer> は -queue:Integer[*] とも書けます。 なお、この属性の表現において、必須なのは名前だけです。

操作の書式は次の通りです。

可視性 名前(パラメータリスト): 戻り値の型 {プロパティ文字列}

パラメータリストの書式は次の通りです。

方向 名前; タイプ = デフォルト値

ここで、方向は in , out, inout ですが、無指定だと in と見なされます。

クラス間の関係

上記では、属性は名前と型を記述するように書きましたが、もう一つ指定方法 があります。 それは、他のクラスのオブジェクトを持つ場合に、そのクラス(これも長方形 で書かれています)との間に線を引くというものです。 [クラスA]→[クラスB] のように書かれていたら、これはクラス A がクラス B のオブジェクトを含むと言えます。 また、いくつ含むかは数を矢印に記述します。 上記のクラスはつぎのようにも書けます。

JPanel
1↑-panel
Keyboard
+Keyboard():Keyboard
+getPanel():JPanel
+getCloseAction():ActionListener
+read():int
+available():int
+read(byte[], int , int ):int
*↓-queue
Integer

さらに、メソッドなどを引き継いで、クラスを拡張するコンポジションにおい ては、始点に黒い菱形を書きます。 また、継承は白い三角の矢印を書きます。 上記の例では InputStream クラスへ白い矢印が引かれます。

オブジェクト図

パッケージ図

配置図

12-3. 振る舞い図

ユースケース図

状態マシン図

アクティビティ図

相互作用図

  1. シーケンス図
  2. コミュニケーション図

シーケンス図

シーケンス図はオブジェクト相互のメッセージのやりとりを表すものです。 アルゴリズムのうち、メッセージのやりとりの関係を記述できます。

始めに、 一番左に、メッセージを受け取るオブジェクト名(a + クラス名など)、その右 には使用するオブジェクト変数を四角で囲んで並べます。 そして、各変数の箱から下に向かって点線の縦線を引きます。 これを生存線と言います。 そして、実際に変数などを使用する場合は下に長細い長方形を書いて active であることを示します。

そして、メッセージを送るオブジェクトから送られるオブジェクトに矢印とメ ソッド名を書き、 もし、戻り値があったら、その型を書いた矢印を受け取る変数へ書きます。

例12-1


class Rei {
    public static void main(String[] arg) throws IOException {
	final MyFrame frame = new MyFrame();
	final Container contentPane = frame.getContentPane();
	final MyLabel label = new MyLabel();
	final ActionListener listener = label.getActionListener();
	contentPane.add(label,BorderLayout.CENTER);
        ...
    }
}

これをシーケンス図を書くとつぎのようになります。

aRei frame contentPane label listener 
□     |         |       |      |
□→new□        |       |      |
□     □→getContentPane       |
□     □       □    →new     |
□     □       □      □      |
□     □       □      □→getActionListener
□     □       □-+    □-+    □
□     □       □add(label)    □
□     □       □←    □      □

コミュニケーション図

12-4. Eclipse による利用

前半で紹介した UML のうち、いくつかは Eclipse のプラグインとして利用可 能です。 これは、図を作ると Java のプログラムソースを出力するような フォワードエンジニアリングのほか、既存のソースコードから図 を作成するリバースエンジニアリングも可能にしています。 Eclipse Wiki によると、 UML ツールには以下のようなものがあります。

フリー
AmaterasUML, Visual UML Editor Plugin for Eclipse, Slime UML, Violet UML Editor Plugin, UMLet, UNIMOD , JUPE , Octopus , UML2 , Papyrus UML , TOPCASED
商用
SystemDirector Application Modeler UML Editor , OMONDO EclipseUML , SDE for Eclipse , MagicDraw , Borland Together for Eclipse , eUML2 , Pattern Weaver , Enterprise Architect

坂本直志 <sakamoto@c.dendai.ac.jp>
東京電機大学工学部情報通信工学科