クラス図

クラス図は開発するソフトウェアを構成するクラス及びクラス間の関係を定義します。
クラス図は基本設計段階ではクラス構造の検討に、詳細設計段階では内部仕様の定義に利用します。
それぞれの段階に合わせクラスの表現粒度は適切に選ぶ必要があります。
特に、設計の最終段階ではコーディングに対する作成指示になるので、クラス構造だけでなくクラス名やメンバー名等についても確認する必要があります。

クラス図の書式

クラス名
クラスを表す矩形を上下3つの部分に分けた上段に記入します。
属性(フィールド)
クラスが持つ属性を矩形の中段に記入します。フィールド名の前にクラスの可視性(メンバーに対するアクセス可能範囲)を表す記号(後述)を付け、フィールド名の後に:(セミコロン)を書きフィールドの型を記入します。
メソッド
クラスの振舞い、操作を矩形の下段に記入します。メソッド名の前に可視性を表す記号、メソッド名の後に戻り値の型を記入します。

クラスの可視性

アクセス可能範囲 UMLの可視性記号 説明
public + すべてのクラスからアクセス可能
protected # 同じパッケージ内のクラス、もしくはパッケージ外のサブクラスからアクセス可能
パケージプライベート(指定なし) ~ 同じパッケージ内のクラスからのみアクセス可能
private 同一クラス内からのみアクセス可能

クラス間の関係
関連(association)

クラス間で、一方のフィールドで相手のクラスを参照する(has-a)関係
参照関係にあるクラス間を実線で結びます。
クラスの可視性はこの実線(依存関係では破線)の参照されるクラス側の端周辺にクラス名を、名前の前に可視性を付けて書いたり、実線の両端には多重度を書き、参照するインスタンスの数を明示することもあります。

多重度の表記

文字記号 説明
n 0以上でm及び*より少ない整数
.. 範囲
m 0以上でnより大きい整数
* 0以上でnより大きい任意の整数
nが単体で書かれればクラスのインスタンスがn個参照されることを表し、*が単体で書かれればクラスのインスタンスが任意個参照されることを表します。
また、nが範囲記号を伴ってn..mないしn..*などと書かれれば、クラスのインスタンスがn個からm個まで、ないしn個から任意個まで参照される可能性がある事を表します。

集約(aggregation)

関連と似た関係ですが、クラス同士が全体と部分になっている(owns a)関係
クラス間を実線で結び、全体側に白抜きのひし形を書きます。
部分側のクラスは、別のクラスからも参照される可能性があります。
ちなみにaggregationの意味は「(独立した部分を集めた)集合」です。

コンポジション(composition)

集約の中でも強い関係、全体クラスのインスタンスと部分クラスのインスタンスが同時に生まれ、同時に消滅する関係
クラス間を実線で結び、全体側に黒塗りつぶしのひし形を書きます。
部分側のクラスは、他のクラスから参照される事はありません
ちなみにcompositionの意味は「(すべてが一体になった)合成物」です。

依存(dependency)

一方のクラスが相手のクラスに何らかの影響を与える関係
影響を受ける(依存する)クラスから、影響を与えるクラスに矢印付きの破線をかきます。
影響を与えるとは、クラスが変更された場合、相手のクラスに影響が及ぶという事であり、依存の形態は、メソッド内で別のクラスのインスタンスを使ったり、メソッドの引数や戻り値に別のクラスのインスタンスを使う、などいろいろ考えられます。

実現(realization)

依存の一種ですが、Javaのインターフェースの実装に相当する関係
実装クラスからインタフェースに破線の白抜き三角形矢印を引き、ステレオタイプ<< interface >>をインターフェース名の上に記述します。

汎化(generalization)

あるクラスの性質、振る舞いを一般化して新たなクラスを定義した時の両クラスの関係
一般化して作成したクラスをスーパークラス(親クラス)、一般化するクラスをサブクラス(子クラス)と呼び、一般化の方向(サブクラスからスーパークラス)へ実線の白抜き三角形矢印を引きます。
汎化によって定義したスーパークラスをもとに考えると、スーパークラスと類似の性質や働きを持ちながら一部特殊化した新たなサブクラスを派生させることが出来き、Javaの継承に相当します。
※「一般化する」するとは、ある物から特殊な性質を取り除き、多くに共通する普遍的な性質を抽出、概念化する事です。

設計に戻る

パケージ

パッケージの役割は数多くのプログラムをある単位でまとめ、プログラム群を区分けするため、と一般には説明されています。
確かにパケージは、

特定のOSに依存しない名前空間を提供し、実行時の名前の衝突を避ける
Javaファイル、classファイルの分類を可能にする。

という機能があります。

しかしそれだけではなく、

アクセス修飾子と組む合わせてアクセス制御機能を提供する。

役割も果たしています。

アクセス修飾子はクラスファイルを他のクラスファイルからアクセス可能にするか否かを提供しますが、
アクセス修飾子だけでは、

すべてのクラスからアクセス可能。
同一クラス内からのみアクセス可能(自分以外のクラス外からはアクセス禁止)。

の2者択一しか設定できません。

しかし、アクセス修飾子をパッケージと組み合わせることにより、さらに
同じパックージ内のクラスからアクセス可能(別パケージからはアクセス禁止)。
という設定が可能になります。

同一パケージ内のクラス群は、一般的には同一目的で同一時期に開発されるプログラム群(=プログラム部品)と考えられるので、この設定は同一目的のプログラム間ではアクセス可能で、同一目的を持たないプログラム群からはアクセスできないという事になります。
つまり、プログラム部品をブラックボックス化するため、アクセスを目的が同じプログラム部品を構成する同一パッケージ内のクラスに制限することが出来ます。

カプセル化に戻る