オブジェクト指向による 分析と設計

47070
オブジェクト指向モデリング
[6]
2001年11月13日
オブジェクト指向モデリング
前回 静的モデル1
5.1 型の認識
5.2 関連
5.3 属性と操作
5.4 汎化関係
2
静的モデル1
型の認識
人
型
氏名:String
身長:Real
 概念
 名前を持つ
 境界を持つ
 定義
 属性
人
氏名
氏名:String
1..*
人
 ユニークであること
氏名
String
1..*
 別名でない
 属性でない
夏目漱石
 集合
 属性か型かは非常に微妙
 基本型
島崎藤村
 UoD,文脈,視点
芥川龍之介
人
氏名
3
静的モデル1
多重度
 インスタンスどうしの対応(リンク)数
 対応の方向
 0,1,*
 関連はリンクの集合
最小値..最大値
 関連の意味
 メッセージパス
 生成
 参照
 ナビゲーション
本
is a copy of
0..*
1..1
著書
1冊め
実践ファンクション
ポイント法
2冊め
3冊め
リファクタリング
UMLを使って
本
著書
4
オブジェクト指向モデリング
第6回 静的モデル2
6.1 概念レベルでの特殊な表現
6.2 リファクタリング
テキスト
6.3 オブジェクト図
6.4 関連についての補足
6.5 型についての補足
6.6 依存性
6.7 パッケージ
テキスト
6.8 知識レベル
第5章
第6章
5
静的モデル2
6.1 概念レベルでの特殊な表現
 汎化
顧客
 多重分類
 動的分類
 区画
一般
 完全区画
 不完全区画
個人
重要
制約
{完全}
個人顧客
法人
顧客
弁別子
(discriminator)
個人顧客
法人顧客
重要度
<<多重>>
<<動的>>
ステレオタイプ
重要顧客
一般顧客
6
静的モデル2
6.2 概念レベルでの特殊な表現
 汎化の記法
{完全}
個人顧客
顧客
個人顧客
法人顧客
重要度
{完全}
<<多重>>
<<動的>>
個人顧客
顧客
重要顧客
個人顧客
法人顧客
一般顧客
重要度
重要顧客
<<多重>>
<<動的>>
一般顧客
7
静的モデル2
6.2 概念レベルでの特殊な表現
 開発過程における型モデル
 型モデルからクラスモデルへ
 モデルの観点
 概念レベル・・・・・・型モデル
 多重分類
 動的分類
 仕様レベル・・・・・・シグニチャ
 実装レベル・・・・・・クラスモデル
 単一分類
 静的分類
重要法人
顧客
重要個人
一般法人
一般個人
8
静的モデル2
6.3 リファクタリング
 リファクタリング
 クラス構造の再構築
 責任の再割付
 システム全体の機能を変えない
実装レベル
 自動テスト
 進化的発展
 最初から理想的な型/クラス構造は作れない
 悪構造であることをどう知るか
不吉なにおい
コードの重複,長すぎるメソッド,巨大なクラス,多すぎる引数,変更の発散,変更
の分散,属性・操作の横恋慕,データの群れ,基本データ型への執着,スイッチ文,
パラレル継承,怠け者クラス,疑わしき一般化,一般的属性,メッセージの連鎖,仲
介人,不適切な関係,クラスのインタフェース不一致,未熟なクラスライブラリ,デー
タクラス,相続拒否,コメント
 ボトムアップの段階的改善
9
静的モデル2
演習問題
 1. クラス名はなぜ単数形?
 2. モデルの観点を形式的に判定できるか?
 3. ドメイン以外のクラスがあってもよいのはいつ?
ユーザインタフェース
概念レベル
仕様レベル
実装レベル
アプリケーション(機能)
ドメイン(概念の世界)
永続化
10
静的モデル2
型図
制約
型
関連名
多重度
関連名の方向
商品種類
0..*
注文する
注文対象
0..*
{完全}
顧客
注文主
個人顧客
法人顧客
関連
ロール
弁別子
(discriminator)
個人顧客
重要度
重要顧客
<<多重>>
<<動的>>
ステレオタイプ
一般顧客
11
静的モデル2
6.4 オブジェクト図
 インスタンス
インスタンス名:型名
実践ファンクション
ポイント法: 著書
実践ファンクションポイント法
リファクタリング
UMLを使って
リファクタリング:
著書
UMLを使って:
著書
「著書」型
12
静的モデル2
6.4 オブジェクト図
 インスタンスのコラボレーション
A
A
*
*
B
B
C
D
型C
A1
A1
B1
A2
型A
A2
B2
A3
型B
a1:A
C1
b1:B
b2:B
型A
D1
A3
型B
a1:A
型D
c1:C
d2:D
13
静的モデル2
6.4 オブジェクト図
 型(クラス)図の理解
勘定
勘定科目名
/残高
*
記入
2..*
取引
取引日
摘要
金額
a:勘定
旅費交通費
8000円
11000円
b:勘定
クレジット
2000円
-5000円
0円
1:記入
3000円
2:記入
1:取引
2001.11.6
つくば
-3000円
1:記入
5000円
c:勘定
現金預金
45000円
50000円
2:記入
2:取引
2001.11.31
精算
-5000円
14
静的モデル2
6.5 関連についての補足
 集約
 集約
 部分-全体関係
 関連名(is a part of)は省略
概念レベルでは
区別をしない
 コンポジション(集約)
 強い所有
 弱いエンティティ(weak entity)
優等コース
ボード
1..*
1
6..*
9
授業科目
マス
15
静的モデル2
6.5 関連についての補足
 ナビゲーション可能性(navigability)の明示
 双方向
 単方向
顧客
顧客
請求先
1
納入先
1
請求先
1
納入先
1
*
注文
*
注文
*
1
商品
*
*
1
商品
*
演習問題46
ナビゲーション可能性はいつ
決定されるべきか
16
静的モデル2
6.5 関連についての補足
 限定子つき関連(qualified association)
 多重度を1にする
 限定子によって一意になるという制約を示す
 辞書などによる実装を暗示
ボード
1
1
ボード
位置
9
マス
1
マス
*
位置
行
列
行:{1,2,3}
列:{1,2,3}
Class ボード {
public マス getSquareMark(int 行, int 列);
:
}
17
静的モデル2
6.5 関連についての補足
 導出関連(derived association)
UML
 計算で導き出せる関連
 冗長
 理解
FP
 導出型
 導出属性
 導出ロール
「著書」型
「/」でマーク
1
2
*
3
著書
4
/borrows
is a copy of
「会員」型
「本」型
*
会員
borrows
*
本
18
静的モデル2
6.5 関連についての補足
 関連に対する制約
 短縮意味宣言
ステレオタイプ <<type>>
制約 {self.noOfStudents > 10}
プロパティ {isAbstract = true}
 { }制約
 {xor}
 {順序}
本
0..*
0..*
1
著作
インスタンス図を
書いてみよう
{xor}
1
雑誌
ライン
{ordered}
*
プロセス
19
静的モデル2
6.5 関連についての補足
 関連に対する制約
{階層}
 オブジェクト図
扉製造:
ライン
*
ライン
{ordered}
*
①
②
③
プロセス
切断:
プロセス
組織
{階層}がないと
どんなオブジェクト
図が書けるでしょう
塗装:
プロセス
組立:
プロセス
梱包:
④ プロセス
20
静的モデル2
6.5 関連についての補足
 制約
 詳細意味宣言
 ノート
 OCL(Object Constraint Language)
勘定
勘定科目名
/残高
*
記入
2..*
金額
借方
貸方
取引
取引日
摘要
inv:
self.the借方->sum(金額)
= self.the貸方->sum(金額)
21
静的モデル1
宿題の解答例
 6親等までを扱うための型モデルを書いてください
 養子縁組はないものとする
 離婚,再婚はないものとする
配偶者
兄弟
子
兄弟
親
兄弟
叔父叔母
子
親
親
従兄弟
親 配偶者
2
0..1
0..1
はとこ *
人
従兄弟 *
叔父叔母 *
0..*
子
子
配偶者
self
子
兄弟 *
*
<<対称>>
/兄弟関係
<<対称>>
/叔父甥関係
<<対称>>
/従兄弟関係
<<対称>>
/はとこ関係
*
*
inv:
self.親=self.兄弟.親 and
self.親.親->intersection(self.従兄弟.親.親)->notEmpty and
self.親.親.親->intersection(self.はとこ.親.親.親)->notEmpty and
self.子.親->includes(self, self.配偶者) and
self.子.子.親->includes(self.子, self.子.配偶者) and
self.子.子.子.親->includes(self.子.子, self.子.子.配偶者)
:
22
静的モデル1
宿題の解答例
 6親等までを扱うための型モデルを書いてください
 養子縁組はないものとする
 離婚,再婚はないものとする
子
配偶者
親
先
<<対称>>
/配偶関係
親 配偶者
2
*
<<対称>>
1
元
/親等関係
親等数
人
*
n
n
先
先
n-1 n-1
0..1
0..1
先1
n
先
*子
元
self
inv:
self.~元(親等関係)->select(p|p.親等数=0).先=self.配偶者 and
Integer.allInstances->select(n|0<n<7)->forAll(n |
self.~元(親等関係)->select(p|p.親等数=n).先=
self.~元(親等関係)->select(p|p.親等数=n-1).先.子)
->union(self.~元(親等関係)->select(p|p.親等数=n-1).先.親)
->union(self.~元(親等関係)->select(p|p.親等数=n).先.配偶者)
)
23