Class図とは |
---|
クラスの静的な構造や、クラスどうしの静的な構造を描く図。 |
Keywords |
Class(クラス) Property(属性) Operation(操作) ステレオタイプ Generalization(汎化) Realization(実現) Association(関連) Aggregation(集約) Composition(合成) Dependency(依存) |
クラス図の例 |
まずは簡単な例を1つ挙げる。
ここに出てきた様々な要素について、ここから説明したい。
クラスの表現 |
クラスは次のように表される。
クラスの名前だけ。 名前を斜体にしているのは abstractクラスであるため。 |
|
属性と操作の名前を追加 | |
属性と操作の詳細を追加 |
クラスを表すときには、必要に応じてこのように書き方を変えることができる。
詳細の記述方法について説明する。
可視性
属性と操作には、その名前の前に「+」「-」「#」の記号をつ
けて可視性(visibility)を表すことができる。
それぞれの記号は次の意味を持っている。
static
属性や操作がstaticである場合には、名前に下線をつけて表す。
name
getInstance()
abstract
クラスや操作がabstractである場合には、名前を斜体にする。
Person
toString()
属性の表記法
属性を詳しく表すときは、次のように表す。
<可視性> <名前> : <型> = <初期値> {<制 約条件>}
たとえば、可視性がpublic(+)で、名前がtemperature、型がint、初期値が23、 制約条件が0<=temperature<=100であるような属性の場合、次のように表す。
+ temperature : int=23 {0<=temperature<=100}
たとえばこれをJavaで表すと、
public int temperature=23;
となる。(制約条件はここでは表せない)
操作の表記法
操作を詳しく表すときは、次のように表す。
<可視性> <名前> (<引数の名前> : <引数の型 >) : <戻り値の型
たとえば、可視性がprivate(-)、型がStringで名前がnameの引数を持ち、 戻り値がなし(void)の場合の操作setNameは、次のように表される。
- setName (name : String) : void
これをJavaのプログラムで表す場合、
private void setName(String name){...}
となる。
ステレオタイプ |
クラスによってアクターやインタフェースを表現する場合がある。その場合、ク ラスの名前にステレオタイプをつけて表す。
次の例は、インタフェースを表現した例である。
この図をJavaのコードで表すと、
interface vehicle{
public void run();
}
となる。
汎化(Generalization)と特化(specialization) |
次に、クラス間に引かれているパスについて見てみる。
最初に、クラスCarと、クラスTruck、FamilyCarの間の線に着目する。
この線は「汎化」を表している。汎化関係とは、より特化(specialization)した
クラシファイア(*)と、より一般的な
クラシファイアの間の関係のことである。
たとえば、上の例で言うと、CarはTruckやFamilyCarのより一般的な分類であり、
逆にTruckやFamilyCarはCarの中の特定の分類である。
矢印のない側に特化したクラシファイア、矢印のある側に汎化したクラ シファイアを書く。矢印は必ず白抜きの三角形を使い、線は実線を用い る。
上のCarとTruckの関係をJavaで表すと、次のようになる。
class Truck extends Car{}
(*)クラシファイア(classifier) : 分類子。クラスやインタフェースはすべてこ れに含まれる。
実現(Realizaition) |
インタフェースVehicleとクラスCarの間の破線の矢印を見てみる。
「実現」とは、一方が仕様(specification)を表すクラシファイアで、一方がそれを実装
(implementation)しているクラシファイアであるような2つのクラシファイア間
の抽象的関係である。
たとえばVehicleとCarの例では、インタフェースVehicleという仕様を、クラス
Carが実装している。
UMLで書くときには、白抜きの三角矢印と破線を用いる。
上の例をJavaで書くとすると次のようになる。
abstract class Car implements Vehicle{}
関連(Association)、Aggregation(集約)、Composition(合成) |
「関連」というのは、2つの要素間の意味論的な関係のことである。「集約」や
「合成」はどちらも「関連」の種類の1つである。
それぞれ、次のように表す。
関連 | |
集約 | |
合成 |
関連の方向を表示したいときには矢印を用いる。
また、最初の例のPersonとHandleの間の関連の「use」のように、関連名を書い
てもよい。
多重度 |
最初の例では、関連を表す矢印の始点と終点の近くに、数字が書かれている。こ れは「多重度」といって、このクラスがインスタンス化したときの数の 上限と下限を表す。
たとえば、VehicleとPersonの間の関連には、それぞれ「0..*」と「1」という数
字が書かれている。
これは、Person「1人」がVehicleを「0個以上(上限なし)」持つことができる、と
いうことである。(「*」は上限なしを表す)
Role(役割) |
PersonとHandleの関連には、その始点と終点の近くに「driver」「handle」とい う文字がある。これは、この関連でそれぞれが表すRoleを示している。
依存(dependency) |