用途

  • オブジェクト指向開発の中心となる図
  • プログラムの実装時に参照
  • システムメンテナンス時も使用

種類と関係

クラス間の関連、集約、コンポジション
汎化、依存、実現関係などを表現。

定義

クラスとは、複数のオブジェクトから共通する属性や操作を見つけ、
オブジェクトの方として抽象化したもの。

クラス図はクラス同士の論理的かつ静的な関係を表現。
また、個々のクラスは属性と操作、クラス同士の関連の種類などを表す。

クラスの属性や操作、クラスとクラスの間の関係を明らかにしていき、
システムの静的な構造を明らかにしていく必要があります。
その際、利用するのがクラス図です。



クラスのいろいろな表記法

属性と操作を省略

クラスA

クラスA

属性のみ

クラスA
属性1
属性2

操作のみ

クラスA
操作1( )
操作2( )

属性と操作

クラスA
属性1
属性2
操作1( )
操作2( )



可視性

属性や操作に対する外部からのアクセス制限を表す。
可視性を適切に設定することにより、カプセル化を実現する。

可視性の種類

表記(タイプ) 意味
+ (public) すべてのクラスからアクセス可能
# (protected) すべてのサブクラスからだけアクセス可能
- (private) そのクラス自身からだけアクセス可能
〜 (package) パッケージ内のクラスからアクセス可能

構文

可視性 属性名 : 型 = 初期値

<<entity>>
顧客
------------
-顧客ID:String
-名前:String
-住所:String
-電話番号:String=""
-FAX番号:String=""

操作

可視性 操作名 (引数リスト) : 戻り値の型

引数リストは缶まで区切って指定します。
入出力種別 仮引数名 : 型 = デフォルト値
入出力種別は in, out, inout のいずれか。デフォルトは in (入力)

<<control>>
閲覧予約コントローラ
-----------------
-----------------
+閲覧予約登録(予約者:利用者, 図書番号:String, 閲覧希望日:Date):int



派生属性

ほかの属性から計算して求めることが出来る属性。
毎回計算し直すことをさけ、パフォーマンスを向上させるために属性として保持する。

四角形
-縦の長さ:int
-横の長さ:int
/-面積:int

クラススコープ

属性や操作が、そのクラスのすべてのオブジェクトで共通の値をとる場合、
クラススコープを持つという。
クラススコープを持つ属性や操作には、下線を引く。
下線を引かない場合は、インスタンススコープとなる。

四角形
-縦の長さ:int
-横の長さ:int
-デフォルトサイズ:int
デフォルトサイズを取得する():int

UMLでは、定義時にメモリを占めるものにはアンダーラインを引く。



関連

クラス同士の意味的な結びつき。
あるオブジェクト間にメッセージをやり取りする関係があれば、
それらのオブジェクト間にはリンクが必要であり、
オブジェクト間にリンクがあれば、
各オブジェクトに対応するクラス間には関連があることになります。

ロール

一方のクラスからみた、もう一方のクラスの役割や立場を表す。
関連の一方、または両方の端に付加する。

多重度

関連するクラス間のオブジェクト数の対応関係を表す。
意味 表記
多数 * (=0..*)
1 1
0以上 0..* (=*)
1以上 1..*
0または1 0..1 (=0,1)
指定範囲 1..5
値の列挙 1,3,5

限定子

クラスの属性によって関連するオブジェクト数を絞り込むための条件。
限定子を使うと多重度を減らすことが出来る。

誘導可能性

関連の方向性を定める。
関連が単なる実践で表記され、方向性を示す矢印がない場合は、
誘導可能性が未定か、あるいは誘導可能性が双方向のいずれかである。
双方向の誘導可能性は単方向の場合よりもリンクなどの管理が難しいので、
設計段階では出来るだけ単方向になるように配慮します。
誘導可能性は、ユースケース、シナリオ、相互作用図から明らかになることが多い。

集約

関連の一種であり、クラスのインスタンスが全体と部分の関係にあるとき、
これらのクラス間の関連を集約といいます。
集約であることは必ず一対多の関係であり、
また一対多の関係であることは必ず集約である。

コンポジション

集約の特殊な形であり、全体側のオブジェクトの
ライフサイクルに部分側のオブジェクトのライフサイクルが依存する。
全体側のオブジェクトが消滅すれば部分側のオブジェクトも消滅する。

汎化

あるオブジェクトがあるオブジェクトを包含する場合、
包含する側のオブジェクトは、包含される側のオブジェクトに対して、
汎化関係を持つといえる。

依存関係

あるクラスがほかのクラスの変更に依存している関係。
クラス間に関係はあるが、関連はない。
  • ほかのクラスのオブジェクトを生成し、メソッドの中でローカル変数として一時的に使用するような場合。
  • 大域的なクラスの操作をリンクなしで呼び出す場合。
  • メッセージの引数としてあつかったり、戻り値として扱う場合。

インターフェース

クラス、コンポーネント、パッケージなどが
外部に公開している操作を表す。
インターフェースは操作のみを持ち、属性、関連を持たない。
実装を持たないため、実装はそのインターフェースを所有するクラス内で行う。

関連クラス

クラスとクラスの間の関連についての情報を持つクラス。
普通のクラスと同様、属性、操作、関係を定義出来る。
関連クラスは、1つの関連に月、1つだけ作成出来る。
多重度が一対多や多対多の場合や、
将来的に多重度がかわる可能性がある場合に多く使用する。

N項関連

3つ以上のクラス間の関連を表す。
中心の菱形からクラスへの実践で表す。
集約と限定子は使用出来ない。



クラス図作成演習 課題4.1

  1. A ~ G の7つのクラスがあります。
  2. A には 2 つの属性、ata1ata2 があり、可視性はそれぞれ、privateprotected です。
    また、A には2つの操作が opa1()opa2() があり、可視性はいずれも public です。
  3. B は A から派生したクラスで、クラススコープを持つ private な属性 atb3 が追加されています。
  4. C は A の一部分となるクラスで、private な属性 atc1 と、
    atc1 からの派生属性である public な属性 atc2 を持っています。
    A のインスタンス 1 個につき C のインスタンスは 0 以上 5 以下が対応します。
    A のインスタンスと C のインスタンスのライフサイクルは一致しません
  5. D は A の一部分となるクラスで、private な文字列型の
    属性atd1public な整数型を返す操作 opd1() を持っています。
    D のインスタンスと A のインスタンスは 1 対 1 対応で、
    なおかつライフサイクルが一致します。
    また、A から見た D の役割は「freq」で、A と A の派生クラスからのみ参照されます。
  6. E はインターフェースで、2 つの操作 ope1()ope2() を持っていますが、
    その操作の実装はF で行われています。
    E の提供する操作は D から使用されます。
  7. G は B と関連があり、B のインスタンスから
    G のインスタンスに対してメッセージが投げかけられますが、
    G のインスタンスから B のインスタンスに対して
    メッセージが投げかけられることはありません。



クラス図作成演習 課題4.2

  1. 複数の社員が、社内にあるいくつかの会議室を予約して使用します。
  2. 社員の属性として、社員番号氏名があります。
  3. また、会議室の属性として、会議室名定員があるとします。
  4. さらに、予約は、予約者(代表)の社員会議室と関連を持ち、
    属性としては予約日使用開始時間及び終了時間が考えられます。
  5. ある社員がある会議室の予約をするには、予約一覧に照会して、
    希望日の希望時間帯に希望する会議室が空いているかどうか調べる必要があります。
  6. そして、運良く空いていれば予約をします。
    行われた予約は予約一覧に登録されます。
  7. 「社員」、「会議室」、「予約」、「予約一覧」を
    クラスとした場合のクラス図を作成してください。
最終更新:2009年04月30日 21:30