クラス図

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

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

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

クラス[編集]

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

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

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

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

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

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

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

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

関係[編集]

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

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

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

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

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

リンク[編集]

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

関連[編集]

関連は、リンクの一種である。オブジェクト間の関係は線で表現する。三つ以上の関連を表現することもできる。そのような場合、各オブジェクトから出た線は菱形に接続される。(訳注:これをN項関係という)

集約[編集]

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

集約とは、"has-a" もしくは関連の一種であるが、特殊な関係である。関連の一種で、名前付けなど「関連」で可能なオプションを付けることができる。しかし、集約は二つ以上のクラスを含むことができない。(訳注:つまり、集約にはN項関係は存在し得ない)

集約は、一方がもう一方のクラスの一部であるが、両クラス間に強いライフサイクルの依存が無い場合に使用する。つまり、集約しているクラスのオブジェクトが削除されても、されている側のオブジェクトが消えるとは限らない。

UML では、集約するクラスと集約されるクラスの間を線で結び、集約するクラス側の線の端に中抜きの菱形を記述する事で表現する。

コンポジション[編集]

コンポジションとは、"has-a"もしくは関連の変種のより強いものである。集約より特殊である。

コンポジションは、両クラス間に強いライフサイクルの依存がある場合に使用する。つまり、コンポジション関係にあるクラスの集約しているオブジェクトが削除されると、必ず集約されている側のオブジェクトはすべて削除される。

UMLでは、視覚的には黒い菱形を集約する側のクラスの線の端に記述する事で表現する。

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

すべてのコンポジションは、0..1か1の多重度でなければならない。集約されるインスタンスは、される対象が一つだけでなければおかしいからだ。対して、集約の場合は、これに限らない。

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

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

汎化・特化[編集]

KP-UML-Generalization-20060325.svg

汎化の関係とは、関係するクラスの一方(スーパークラス)がもう一方(サブクラス)に対してより一般的であると考えられることを表す。実際問題、これはサブクラスのインスタンスがスーパークラスのインスタンスでもあることを意味している(このタイプの汎化の例は「binomial nomenclature」に見られる:人間は猿のサブタイプであり、猿は哺乳動物のサブタイプであり以下略)。この関係は、'AはB'とすると最も簡単に理解できる(人間は哺乳動物、哺乳動物は動物)。

UMLでの視覚的な記述方法としては、スーパークラス側の線の端に白抜きの三角を描くことで表現する。

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

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

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

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

この関係が生物学的な親/子の関係との類似を全く持っていない事に注意すること:これらの用語は非常に一般的だが、使用方法によっては紛らわしい場合がある。

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

実現[編集]

実現の関係とは、関係するクラスの一方(クライアント)がもう一方(サプライヤ)の振る舞いを実現していることを表す。(訳注:例えば、抽象クラスやインターフェイスのメソッドの内容をサブクラスで具体的に記述すること)実現は視覚的には、白抜きされた三角を先端に持つ破線で表現する。

一般的な関係[編集]

依存[編集]

定義されている要素間に、片方を変更すればもう片方に変更が生じる依存が存在する。この関係は、依存する側からされる側への破線矢印で表現する。幾つかの名前付けされた種類がある。依存はインスタンス間、クラス間、インスタンス-クラス間にあり得る。

多重度[編集]

関連の関係は、関連するクラスの一方がもう一方を参照していることを意味する。汎化の関係と対比して、'AはBを持っている'というフレーズで最も簡単に理解できる(母猫には子猫がいる、子猫には母猫がいる)。

UMLでは、関係にオブジェクトのロールを矢印で示唆して表現する。オプションとして、それらのエンティティのインスタンスの多重度を両端に記述することができる。多重度とは、その関連に参加するオブジェクトの数を示すものである。一般的な多重度は以下:

記述 インスタンス数
0..1 無しか一つ
1 確実に一つ
0..* または * ゼロ個以上
1..* 1個以上

この関係は、"has-a"の関係としても知られている。

関連項目[編集]

外部リンク[編集]