UML2.4(3) -クラス図-
投稿日: | |
---|---|
修正日: | |
タグ: |
クラス図
クラス図とは、クラス同士の静的な関係を表現した図である。オブジェクト図が処理の流れのある瞬間の関係を表しているのに対し,クラス図は処理の流れ全体を通した関係を示している。クラス図で表現する関係は以下の通りである。
- 汎化
- 実現
- 関連
- 誘導可能性
- 集約
- コンポジション
- 依存
名称 | 図 | 意味 | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
クラス
|
|
| ||||||||||||||||||
集約 | 集合-要素の関係。例えば"A has a B"の時,AはBを集約するという意味となる。関連の一種で,JavaではAの属性としてBがある場合にこの記号で表す。 | |||||||||||||||||||
コンポジション | 集約の中でも強い関係のこと。 例えば"A is part of B"の時,コンポジションで表す。Javaでは,集合クラスのインスタンスが消滅すると、要素クラスのインスタンスも消滅するような関係の時にコンポジションで表現する。 | |||||||||||||||||||
関連 | 2つのクラスのインスタンス間に長期的な繋がりがあること。Javaでは属性として相手のオブジェクトを持つような場合に関連とする。集約やコンポジションがどちらのクラスの属性なのか明示しているのに対して,関連はどちらかの属性である場合や,それぞれ対等な関係の場合に関連で表現する。 | |||||||||||||||||||
誘導可能性 | 関連がある2つのクラスのインスタンスで一方のクラスがもう一方のクラスを参照(メッセージを送信)できるか否か。参照できる場合は矢印、できない場合は✕印、未定義の場合はそのどちらでもない。Javaで使用する場合,例えば"A has a B"の関係で,かつCがBを属性として保持しなければならない場合で,概念的にはCとBが集約関係でない場合は,誘導可能性で"C→B"のように表現する。これにより,開発者はどちらのクラスの属性かを判断できる。 | |||||||||||||||||||
関連端(ロール)名 | 属性を関連で表現した場合,属性名や可視性は関連端名で表現する。 | |||||||||||||||||||
多重度 |
あるクラスの複数のインスタンスと別のクラスのインスタンスに関連がある時、それをまとめることができる。数は次のように表現する。
|
|||||||||||||||||||
依存 | 2つのクラスが一時的な関係がある時に依存で表現する。Javaでは,引数として一時的にそのクラスを利用するような場合やローカル変数で利用する場合に依存で表現する。例えばクラスAのあるメソッドがクラスBを引数として使用する場合に,"A→B"の方向で記述する。 | |||||||||||||||||||
汎化 | 抽象-具象の関係(class)。 Javaでは"class B extends A"の時,"A→B"の方向で記述する。 | |||||||||||||||||||
実現 | 抽象-具象の関係(interface)。Javaでは"class B implements A"の時,"A→B"の方向で記述する。 |
以下のコードは記事『UML2.4(2) -オブジェクト図-』 と同じものである。
import java.util.ArrayList;
class Guest {
/*- 属性 -*/
private ApplicationForm memAddAF;
/*- 操作 -*/
public Guest(){
memAddAF = new ApplicationForm("鈴木太郎", "ZZZZZ", 012345, "XXX");
}
public ApplicationForm getMemAddAF(){return memAddAF;}
}
class ApplicationForm {
/*- 属性 -*/
public String name;
public String address;
public int tel;
public String work;
/*- 操作 -*/
public ApplicationForm(String name, String address, int tel, String work){
this.name = name;
this.address = address;
this.tel = tel;
this.work = work;
}
}
class Receptionist {
/*- 属性 -*/
/*- 操作 -*/
public void postApplicationForm(ApplicationForm memAddAF){
// 受付処理
}
}
class Sample {
/*- 属性 -*/
/*- 操作 -*/
/** エントリポイント */
public static void main(String args[]){
Guest suzuki = new Guest();
Receptionist receptionist = new Receptionist();
receptionist.postApplicationForm(suzuki.getMemAddAF());
}
}
これをクラス図で抽象的に表現すると次のようになる。