クラス図

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

統一モデリング言語 (UML)におけるクラス図(クラスず、: class diagram)とは、クラス、属性、クラス間の関係からシステムの構造を記述する静的な構造図である。

クラス図とソースコードの同期が可能なUMLモデリングツールも存在する。

クラス[編集]

クラス図におけるクラスの例

ソフトウェアシステムにおけるクラスは、中にクラス名の記述された四角で表現する。クラスはドメイン等、ソフトウェア要素ではない要素であっても良い。(訳注:例えば、車のタイヤであったり、化学物質の一種であったり、料理の材料であるかも知れない)

オプションとして、クラス名の下に属性(つまりプロパティ)の区画を設けることができる。どの属性も最低でも名前を記述せねばならず、オプションとしてその型、初期値、その他の特性を記述することができる。

更にその下に、クラスの関数(つまりメソッド)の区画を設けることができる。どの関数も最低でも名前を記述せねばならず、オプションとしてその引数や戻り値を記述することができる。

他の区画を定義しても良い。例えば、保存する義務や必要条件、制限などである。

属性と関数には以下の可視性を付けることができる:

  • " + "はpublic
  • " # "はprotected
  • " - "はprivate
  • " ~ "はpackage(パッケージ内で可視)

また、クラス図でクラス変数クラス関数を表現するには、区画内の項目に下線を引けばよい。

関係[編集]

関係は、クラス図とオブジェクト図に見られる、以下に示すような論理的な連結の種類を総称する用語である。

このように関係という用語は列挙により定義されるのみなので、その本質に関する具体的イメージをつかみにくい。そこであえて大雑把にいえば、クラス図においては、関係とは「そのクラスのソースコードに型名が出現する(ことになるであろう)」ことを意味する。オブジェクト図において、関係とは「そのオブジェクトが参照を持っている(ことになるであろう)」ことを意味する。

なお、いうまでもないことだが、クラス図に出現するすべてのクラスは、同一のクラス図(あるいはシステム)に出現するという論理的なつながりを持っているので、単に関係を「論理的な連結」とだけ定義すると概念が破たんする。

UMLでは、以下の関係を表現できる。

インスタンスレベルの関係[編集]

リンク[編集]

リンクとは、基本的なオブジェクト間の関係である。クラスを表す四角を二つ以上、線でつなぐことで表現する。これはオブジェクト図にも見られる。オブジェクト図では、インスタンスの関連を示す。

関連[編集]

関連とは、リンクの一種であり、"has-a" の関係を表す。ロール名と呼ばれる、関連先の役割を表す名前を記すことができる。

UML では、参照するクラスの方向に開いた矢印の実線を引く事で、誘導可能性 (navigability) を表現する。複数の関連を表現することもできる。

集約[編集]

2つのクラス間の集約を表すクラス図

集約とは、関連の一種であり、"part-of" の関係を表す。

集約は、部分インスタンスと全体インスタンスとの結びつきからなり、両インスタンス間に強いライフサイクルの依存が無い場合に使用する。つまり、全体インスタンスが破棄されても、部分インスタンスが破棄されるとは限らない。

UML では、関連の全体を表すクラス側に中抜きの菱形を記述する事で表現する。

現実世界で全体-部分の関係の例を挙げるとすれば、例えば車に対するエンジンの例が挙げられる。エンジンENG01は車のモデルCM01の部分であり、集約の関係がベストと言える。エンジンとしては、ENG01は他の車のモデルに搭載することも可能だからだ。例えばCM02等。これはしばしば「カタログ」関係と呼ばれる。

コンポジション[編集]

コンポジションとは、集約と同じく"part-of" の関係を表すが、集約よりも結びつきが強い。

コンポジションは、1つの部分インスタンスに対し最大1つの全体インスタンスの結びつきからなり(コンポジションの共有不可制約による)、両インスタンス間に強いライフサイクルの依存がある場合に使用する。つまり、全体インスタンスが破棄されると、部分インスタンスがすべて破棄される。ただし、全体インスタンスが破棄される前に部分インスタンスを取り外した場合は、この限りでない。

UMLでは、関連の全体を表すクラス側に黒塗りの菱形を記述する事で表現する。

集約とコンポジションの違い[編集]

コンポジションは、前述した共有不可制約により、全体インスタンスの多重度が0..1か1でなければならない。ただし、集約の場合は、この限りでない。

クラスレベルの関係[編集]

汎化・特化[編集]

KP-UML-Generalization-20060325.svg

汎化とは、クラスの一方(スーパークラス)がもう一方(サブクラス)に対してより一般的であると考えられることを表す。これはサブクラスのインスタンスがスーパークラスのインスタンスでもあることを意味している。

UMLでは、スーパークラス側に中抜きの三角を記述する事で表現する。

汎化・特化の関係は、継承または"is-a"の関係としても知られる。

汎化・特化の関係において、スーパータイプは""、"スーパークラス"、"基底クラス"、"規定タイプ"としても知られる。

汎化・特化の関係において、サブタイプは""、"サブクラス"、"派生クラス"、"派生タイプ"、"派生型"としても知られる。

特化の関係は、汎化の関係の逆である。つまり、サブタイプスーパータイプを特化したものである。

この関係が生物学的な親/子の関係との類似を全く持っていない事に注意すること。

  • 汎化 - 特化の関係:
BはAの一種
例えば、"オークは木の一種"、"貨物自動車は車の一種"

実現[編集]

実現とは、クラスの一方(クライアント)がもう一方(サプライヤ)の振る舞いを実現していることを表す。(訳注:例えば、抽象クラスやインターフェイスのメソッドの内容をサブクラスで具体的に記述すること)

UMLでは、サプライヤを表すクラス側に中抜きの三角を記述し破線を引く事で表現する。

一般的な関係[編集]

依存[編集]

依存とは、片方のインスタンスを変更すればもう片方のインスタンスに変更が生じることを表す。依存はインスタンス間、クラス間、インスタンス-クラス間にあり得る。

UMLでは、依存するクラス又はインスタンスの方向に開いた矢印の破線を引く事で表現する。また、破線上には、ステレオタイプと呼ばれるテキストを二重山括弧 (« ») で囲むことで、依存の意味を記すことができる。

多重度[編集]

関連の関係は、関連するクラスの一方がもう一方を参照していることを意味する。

UMLでは、それらのインスタンスにおける多重度をクラス間の両端に記述することができる。多重度とは、その関連に参加するオブジェクトの数を示すものである。

記述 インスタンス数
0..1 無し又は一つ
1 一つのみ
0..* または * ゼロ個以上
1..* 1個以上

関連項目[編集]

外部リンク[編集]