このドキュメントは http://edu.net.c.dendai.ac.jp/ 上で公開されています。
UML(Uniformed Modeling Language 統一モデリング言語)は オブジェクト指向のソフトウェアを設計、記述する際に使う、グラフィカルな 記述法です。 オブジェクト指向のプログラミングにおいて、 UML は様々な利用法があります。 まず、設計をする際に構想などをまとめたりすることができます。 さらに既存のソフトウェアを解析するときなどにも使えます。 これらはアイディアを記述し、ソフトウェアの理解を深めるものです。 また、設計図面として利用することもできます。 つまり、ソフトウェアのドキュメントとして活用できるということです。 さらに、CASE(Computer Aided Software Engineering) ツールを 介して UML によるプログラミングもできます。 NetBeans や Eclipse などのエディタで、 UML を利用して Java のプログラ ミングを支援するようなツールを使うことができます。
UML 2.0 では 13 種類の図があります。 13種類の図は、構造を表すもの(構造図)と、振る舞いを表すもの (振る舞い図) に分類できます。 さらに、振る舞い図の中にはオブジェクト同士の関係を表す 相互作用図として分類できるものがあります。 13 種類の図の分類を下記に示します。
分類 | 名称 | 役割 | |
---|---|---|---|
構造図 | クラス図 | クラスの特性や関係 | |
オブジェクト図 | 実際のインスタンスの構 造 | ||
パッケージ図 | プログラムのコンパイルにおける依 存関係など | ||
配置図 | システムにおけるオブジェクトなどの配 置 | ||
コンポーネント図 | システムの機能毎の分類と関連 | ||
コンポジット構造図 | クラスの内部構造の階層的表現 | ||
振る舞い図 | ユースケース図 | ユーザとシステムの関わり合い | |
状態マシン図 | システムの振る舞いの記述 | ||
アクティビティ図 | フローチャートのような並列的 な手続きの流れ | ||
振る舞い図 | 相互作用図 | シーケンス図 | 各オブジェクト間でのメッセージのやり とりの流れ |
コミュニケーション図 | シーケンス図と同様だが、 オブジェクトの配置を自由にできる | ||
相互作用概要図 | アクティビティ図+シーケンス図 | ||
タイミング図 | ソフトウェアのタイミングチャート |
上記の全ての図をマスターする必要はありません。 必要な状況に応じて活用すれば充分です。 また、本資料では上記のうち、赤で示した図のみを紹介します。 このうち特に重要なのが、クラス図とシーケンス図です。
古くは、フローチャート、変数表、関数表などがこの役割を担ってましたが、 多くの専門家が時間をかけて洗練してきたため、UML は従来の記述に比べて記 述性などが高くなっています。
クラス図は 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 | ||||||
---|---|---|---|---|---|---|
|
||||||
|
一番上の欄はクラス名、二番目の欄は属性(メンバ変数)、 三番目の欄は操作(メソッド)を表します。
属性の書式は次の通りです。
可視性 名前: 型 多重度 = デフォルト値{プロパティ文字列}
可視性は +(プラス) が public, -(マイナス) が private です。
多重度は配列変数のように[](角カッコ)で表現し、最小要素数と、最大要素数
を .. (ピリオド二つ)で区切って記述します。0 または 1
は 0..1
で表します。
無制限の場合は *(アスタリスク) で表現します。
上記の -queue: LinkedList<Integer>
は -queue:Integer[*] とも書けます。
なお、この属性の表現において、必須なのは名前だけです。
操作の書式は次の通りです。
可視性 名前(パラメータリスト): 戻り値の型 {プロパティ文字列}
パラメータリストの書式は次の通りです。
方向 名前; タイプ = デフォルト値
ここで、方向は in , out, inout ですが、無指定だと in と見なされます。
上記では、属性は名前と型を記述するように書きましたが、もう一つ指定方法 があります。 それは、他のクラスのオブジェクトを持つ場合に、そのクラス(これも長方形 で書かれています)との間に線を引くというものです。 [クラスA]→[クラスB] のように書かれていたら、これはクラス A がクラス B のオブジェクトを含むと言えます。 また、いくつ含むかは数を矢印に記述します。 上記のクラスはつぎのようにも書けます。
JPanel |
---|
Keyboard | ||||||
---|---|---|---|---|---|---|
|
Integer |
---|
さらに、メソッドなどを引き継いで、クラスを拡張するコンポジションにおい ては、始点に黒い菱形を書きます。 また、継承は白い三角の矢印を書きます。 上記の例では InputStream クラスへ白い矢印が引かれます。
シーケンス図はオブジェクト相互のメッセージのやりとりを表すものです。 アルゴリズムのうち、メッセージのやりとりの関係を記述できます。
始めに、 一番左に、メッセージを受け取るオブジェクト名(a + クラス名など)、その右 には使用するオブジェクト変数を四角で囲んで並べます。 そして、各変数の箱から下に向かって点線の縦線を引きます。 これを生存線と言います。 そして、実際に変数などを使用する場合は下に長細い長方形を書いて active であることを示します。
そして、メッセージを送るオブジェクトから送られるオブジェクトに矢印とメ ソッド名を書き、 もし、戻り値があったら、その型を書いた矢印を受け取る変数へ書きます。
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) □ □ □ □← □ □
前半で紹介した UML のうち、いくつかは Eclipse のプラグインとして利用可 能です。 これは、図を作ると Java のプログラムソースを出力するような フォワードエンジニアリングのほか、既存のソースコードから図 を作成するリバースエンジニアリングも可能にしています。 Eclipse Wiki によると、 UML ツールには以下のようなものがあります。