Document

オブジェクト指向概論
第8回
UMLの基本(2)
立命館大学
情報理工学部
黄 宏軒
1
今回のテーマ
クラス図の書き方(の詳細)
n  なぜクラス図が大事か
n 
クラス図はモデル化の基本
q  オブジェクトのモデル
q  すべてのフェーズを通して使用する
q 
2
8.1 クラスの表示
≪キーワード≫
クラス名
パッケージ名::クラス名
{要素プロパティ}
可視性 属性名:型=初期値
・・・
可視性 操作名(パラメータ名:パラメータ型…):返却値型
・・・
(例)
属性(attribute)
のリスト(省略可)
操作(operation)
のリスト(省略可)
従業員
# 氏名: String
- 住所: String
+ 住所設定(address:String)
+ 氏名取得( ): String
+ 住所取得( ): String
3
クラス表示のバリエーション
簡略形
一般形
詳細形
従業員
従業員
従業員
氏名 住所 )
住所設定(
氏名取得(
)
住所取得( )
# 氏名: String - 住所: String + 住所設定(address:
String)
+ 氏名取得( ): String
+ 住所取得( ): String
4
属性(attribute)の表示
可視性 属性名:型 = 初期値
-
q 
氏名:String = 立命太郎
可視性:属性,操作の公開/非公開
+public
-private
#protected
~package
すべてから参照可能
自分からのみ参照可能
自分とその子孫(サブクラス)からのみ
参照可能
自分と同一パッケージ内のクラスからのみ
参照可能
5
操作(operation)の表示
可視性 操作名 (パラメータ名:型=初期値…) : 返却値型
+
氏名取得 (氏名コード : int = 0 )
: String
6
スコープ
n 
インスタンススコープ
q 
q 
n 
個々のオブジェクトで値が異なる属性
個々のオブジェクトに対する操作
クラススコープ (静的な(static)属性/操作)
q 
q 
あるクラスのすべてのインスタンスで共通の値を持つ属性
クラスに対して呼び出す操作
タクシークラス
運転手=田中さん
運転手=鈴木さん
定員=4名
運転手=山田さん
7
クラススコープの表示
n 
クラススコープにはアンダーラインをつける
タクシー
定員
運転手
生成( ) 配車( )
8
8.2 クラス間の関係
n 
関係(relationship)
関連(association)
集約(aggregation)
弱い集約
強い集約(composition)
その他の関連
汎化(generalization)≒継承関係
実現(realization)
依存(dependency)
9
関係の分類
関係(Relationship)
関連(Association)
汎化関係
(Generalization)
集約(Aggregation)
実現
(Realization)
依存
(Dependency)
10
関係(relationship)の表示
n 
関連:association
集約:aggregation
q  合成集約:composition
q 
汎化:generalization
n  実現:realization
n  依存:dependency
n 
11
8.2.1 関連(association)の表示
n 
オブジェクトとオブジェクトの関係
学生
受講する
衣笠二郎
科目
オブジェクト指向概論
立命太郎
人工知能
山田花子
データベース
鈴木一郎
学生
姓名
学年
・・・
関連名
受講する▶
関連
科目
名称
単位数
・・・
12
ナビゲーション(誘導)可能性
ナビゲーション可能性:ソースのインスタンスがタ
ーゲットのインスタンスにメッセージを送れるかどう
か
=ターゲットのオブジェクト識別子(ID)を知っている
学生
科目
かどうか
n 
一方向の場合
姓名
学年
・・・
受講する▶
学生
双方向の場合
姓名
学年
・・・
名称
単位数
・・・
科目
受講する▶
名称
単位数
・・・
13
関連端
n 
関連端:関連先の特徴,役割(ロール)
q 
ソースのクラスのプロパティ
関連端名
学生
姓名
学年
・・・
科目
受講する▶
受講登録 名称
単位数
0..1
・・・
多重度
14
多重度
n 
一方のクラスのインスタンスから見て,相手のクラスのインス
タンスがつながる個数を,相手のクラスにつながる線の先に
書く
属する研究室は1つだけ
AI研
中田
中村
稲本
0人からN人の
可能性
・・・
学生
0..*
1
研究室
15
多重度の表示
多重度
1
*
0..1
0..*
1..*
0..整数
整数..整数
意味
厳密に1
0以上
0 or 1
0以上
1以上
0から整数まで(例:0..4)
範囲指定(例:2..5)
16
再帰関連
上司
(上司の) 1
上司
1..*
上司
1
1..*
1
1..*
部下
部下
1
1..* (部下の)
部下
1..* 部下
再帰関連
1
上司
社員
17
複数の関連
1 契約者
契約
*
*
*
1
被保険者
1
受取人
契約
*
契約者
*
*
被保険者
人
受取人
18
8.2.2 集約の表示
n 
集約(aggregation):全体と部分の関係
クラス
る
す
◀構成 1
1
1
先生
1..*
生徒
先生
1
クラス
1
1
1..*
生徒
19
合成集約の表示
n 
合成集約(composition):インスタンスが同
時に生成・削除される集約関係
請求書
◀構成する
請求明細
1
*
請求書
1
請求明細
*
20
8.2.3 汎化関係の表示
n 
汎化(generalization)と特化(specialization)
生物
汎化
動物
哺乳類
特化
猫
犬
シャム猫三毛猫
コリー
ブルドッグ
21
汎化の表示
哺乳類
犬
猫
シャム猫
三毛猫
ブルドック
コリー
22
汎化セット
会員
有料会員
無料会員
男性会員
女性会員
会員
汎化セット名
会費有無
性別
有料会員
男性会員
無料会員
女性会員
23
汎化に関する注意
n 
概念レベルでの汎化:集合の包含関係
n 
実装レベルでの汎化:継承関係
24
抽象クラスの表示
n 
抽象クラス:自分自身ではインスタンスを持たず,継
承されることを前提として定義されるクラス
q 
q 
インスタンスを作成できない
抽象メソッド(オーバーライドされることを前提としたメソッ
ド)を定義できる
図形クラス
三角形クラス
四角形クラス
円形クラス
25
抽象クラスの表示
抽象クラスはクラス
名をイタリックに
AbstractPerson
AbstractPerson
イタリックのメソッドは抽
象メソッド
(サブクラスで必ず実装
しなくてはならない)
name address
setAddress(
)
getName(
)
getIncome(
)
AbstractPerson
# name: String
- address: String + setAddress(address:String)
+ getName( ): String
+ getIncome( ): Int
26
8.2.4 実現(realization)の表示
n 
インタフェース
コピー機
コピー機として
の使い方
コピー機
インタフェース
FAX
FAXとして
の使い方
FAX
インタフェース
プリンタとして
の使い方
プリンタ
インタフェース
プリンタ
複合型コピー機
27
インタフェースの表示
インタフェースには
≪interface≫をつける
(”I”ではじめる)
≪interface≫
IPerson
≪interface≫
≪interface≫
IPerson
IPerson
setAddress(
)
getName( )
getAddress(
)
getIncome( )
インタフェースには
メソッドの定義のみ
(実装はない)
+ setAddress(address:
String)
+ getName( ): String
+ getAddress( ): String
+ getIncome( ): Int
28
実現の表示
n 
インタフェースと,このインタフェースを実装したクラ
スとの間の関係
≪interface≫
IPrinter
IPrinter
インタフェース
の簡略表現
実現
MultifuncPrinter
MultifuncPrinter
29
8.2.5 依存の表示
n 
依存(dependency):クラス間の利用関係
会社
雇う▶
社員
依存
30
8.3 関連のオブジェクト化
n 
n 
関連に属性を持たせたくなることがある
例:「学生」と「科目」の関係
q 
q 
「受講する」という“関連”が存在する
「受講する」自体にもいろいろな情報を保持しておく必要が
ある
n 
出席数,試験点数,最終評価,etc.
学生
10..400
受講する▶
10..30
科目
31
関連クラス
n 
関連に属性を持たせるためのクラス
学生
氏名
学生証番号
回生
・・・
科目
10..400
受講する
出席数
試験点数
最終評価
・・・
科目コード
10..30 科目名
担当教員
授業時間
教室
・・・
関連クラス
32
関連クラスの実装
n 
関連の実装
q 
クラスの属性として相手のクラスを定義
// 学生クラス Student
public class Student {
private Lecture lec ;
lect = obj; //lectにオブジェクトをセット
}
}
n 
関連クラスの実装
片方のクラスの属性に紛れ込ませる
q  普通のクラスにする
q 
33
広義の関連クラス
n 
関連クラスを普通のクラスとして定義
(「もの-こと-もの」の構造)
学生
1
10..30
受講
動詞から
名詞に
10..400
1
科目
広義の
関連クラス
34