クラス図

出典: フリー百科事典『ウィキペディア(Wikipedia)』

ソフトウェア工学における統一モデリング言語 (UML)クラス図(クラスず、: class diagram)は、クラスの定義およびクラス間の関係性を記述した図である。

クラス図はオブジェクト指向モデリングオブジェクト指向プログラミングでよく使われる。クラス図とソースコードの同期が可能なUMLモデリングツールも存在する。

クラスの定義[編集]

クラスの定義

クラス図において、個々のクラスは長方形で表される(図を参照)。クラス定義の長方形は基本的に更に3つに区分けされ、それぞれクラス名、属性フィールド)の一覧、クラス操作(メソッド)の一覧が記述される[1][2]

属性は以下の要素で構成される:

クラス操作は以下の要素で構成される:

  • 名前
  • 返値のデータ型
  • 引数の名前とデータ型のリスト
  • 可視性

クラス定義においてクラス名の記述は必須だが、属性一覧およびクラス操作一覧は省略してよい[1]。またクラス名は必ずクラス定義の一番上に記述しなければならない。

可視性

  • + public - どこからでも可視(visibility)
  • # protected - 自クラスとその特化クラスから可視
  • - private - 自クラスからのみ可視
  • ~ package - 同パッケージ内のクラスから可視

その他

  • 通常の属性と操作は、インスタンスメンバ(instance members)となり、インスタンス別のThisを要するものになる。
  • アンダーラインが引かれた属性と操作は、クラスメンバ(class members)となり、インスタンス共有の静的プロパティと静的メソッドになる。
  • /が先頭に付記された属性は、導出プロパティ(derived property)になる。これは属性ではなく、属性間の計算から得られる値になる。

クラス間の関係[編集]

クラスの関係線

インスタンスレベル関係 / 使用関係[編集]

関連[編集]

関連

クラスA・Bのインスタンスがあるとする。A・Bのインスタンスの間で、お互いにまたは片方による知覚(know)認識(aware)があるならば、AとBの間には関連線が引かれる[1]

知覚とはAが、Bの型情報を持っていて、かつBのインスタンスの存在および個数も把握していることを意味する。AがBの型情報からBのメソッド呼出しやプロパティ参照をする可能性は、操縦可能性(navigability)と言われる。AインスタンスによるBインスタンスの存在把握想定数は、多重度で記される。また、AにとってのBの役割を関連線のBサイド上に付記できて、これは役割名(role name)と言われる。

  • AだけがBを知覚しているならば、A -> Bの単方向関連になる。
  • BだけがAを知覚しているならば、B -> Aの単方向関連になる。
  • AとBが互いに認識しているならば、A -- Bの双方向関連になる。
  • AとBの相互認識関係を、Cが知覚しているならば、A --C-- Bの三方向関連になる。Cは関連クラスと言われる。

関連(association)は、直線矢印かただの直線で表記される。関連線の両サイドには相方の役割名を付記できる。関連線の中央にはその関係自体の役割名を付記できる。関連線の両サイドには多重度が付記される。

関連は、ウィーク集約と別称される。

集約[編集]

集約

Aインスタンスが、Bインスタンスを保持し、AとBのライフサイクル(生成と破棄)が異なるなら集約になる[1][2]。Aは自由にBを分離できて又は追加できる。BはA以外からも共有されることがあり、どこからも保持されない時もある。A Has-a Bとされる。

集約(aggregation)は、白抜き菱形の直線で表記され要素 -◇ コンテナとされる。集約線の両サイドには多重度が付記される。

集約は関連の特別形であり、シェア集約またはベーシック集約と別称される。関連より強い関係とされる。関連線の矢印を重ねて要素 <-◇ コンテナとすると、コンテナによる要素の操縦可能性を表わす。

合成[編集]

Aインスタンスが、Bインスタンスを保持し、AとBのライフサイクル(生成と破棄)が同じなら合成になる[1][2]。AのコンストラクタでBも生成され、AのデストラクタでBも破棄される。BはAのみに保持されて共有されない。A Has-a Bとされる。

合成(composition)は、黒塗り菱形の直線で表記され要素 -◆ コンテナとされる。合成線の両サイドには多重度が付記される。

合成は関連の特別形である集約のもう一つの形であり、コンポジション集約と別称される。集約より強い関係とされる。

一般関係 / 使用関係[編集]

依存[編集]

依存

クラスA、Bがあるとする。Aのメソッド内でBのメソッドを呼び出すなら、AはBに依存している。またはAのメソッドがその引数の型、返り値の型、ローカル変数の型に、Bを使用するなら、AはBに依存している[2]。Aの振る舞いがBによって変動することが依存になる。Aはclient/sourceとされ、Bはserver/targetとされる。A …> Bと表記される。

依存でのAはBの型情報を持つが、Bのインスタンスの存在および個数までは把握していない。故に依存は、関連・集約・合成より弱い関係とされる。

依存(dependency)は、破線矢印で表記される。client …> serverとされる。依存線の中央には依存内容を« »で囲って付記できる。

クラスレベル関係 / 継承関係[編集]

汎化[編集]

汎化としての継承

クラス間の継承関係には、汎化線が引かれる。リスコフの置換原則に従った継承でなければならない[1][2]サブクラス -> スーパークラスの矢印方向になる。汎化線上ではサブクラスから見たスーパークラスは汎化になり、スーパークラスから見たサブクラスは特化になる。サブクラス Is-a スーパークラスとされる。

UMLクラス図では、抽象クラス(抽象メソッドと実装メソッドの混合)使用は推奨されていないようである。

汎化(generalization)は、白抜き三角の直線で表記される。汎化では特化(specialization)という概念が合わせて扱われる。

実現[編集]

クラスインターフェース継承関係には、実現線が引かれる[1][2]。インターフェースは純粋抽象クラス(抽象メソッドだけ)である。その継承関係は、インターフェースをクラスが実装するとも呼ばれるので、実現線は実装と説明されることがある。実装クラス …> インターフェースの矢印方向になる。実装クラス Is-a インターフェースとされる。

インターフェース間の継承関係にも実現線が引かれるが、この場合は実装という説明はされない。子インターフェース …> 親インターフェースの矢印方向になる。

実現(realization)は、白抜き三角の破線で表記される。実現では実装(implementation)という概念が合わせて扱われる。

多重度[編集]

多重度(Multiplicity)は、関連線・集約線・合成線の両端に付記される数値である。AとBの間に線が引かれる場合、その関係へのAインスタンスの参加想定数と、Bインスタンスの参加想定数が記される[1][2]

表記 インスタンス数
0..1 ゼロか一つ
1 一つのみ
* ゼロ以上
0..* ゼロ以上
1..* 一つ以上

出典[編集]

参考文献[編集]

関連項目[編集]

外部リンク[編集]