Transcript ppt形式

オブジェクト指向モデリング
[12]
2004年1月13日
12. 概念モデルから実装まで
12.1 実装作業の概要(2)
 ドメインの実装
 機能の実装
 アーキテクチャの実装
 レイヤー構造
 役割の分担
人工物の作り込み
ユーザインタフェース
アプリケーション(機能)
アプリケーション(機能)
ドメイン(概念の世界)
ドメイン(概念の世界)
永続化
概念レベル
実装レベル
2
13. 概念モデルの理解
13.1 アナリシスパターン(1)
 パターンランゲージ
 Christopher Alexander
 パターンの記述
よい建築がもつ性質
無名の質(Quality Without A Name)
生き生きと生きること(alive)
パターンの重層
パターン名
得も言われる心地よさをもつ
背景,問題意識
システムってどんなもの?
解決策
フォース(有効である状況,他のパターンとの関係)
 体系づけられたパターンの順序
 ソフトウェアにおけるパターン
デザインパターン(GoF)
アナリシスパターン(Fowler)
アーキテクチャパターン(POSA)
3
13. 概念モデルの理解
13.1 アナリシスパターン(1)
 Fowler, M., ”Analysis Patterns”
 分析に現れるパターン
要求のエスカレーション
変更に強いモデル
 知識レベル
 制約記述
 実装の考慮
アプリケーションファサード
サポートパターン
 よいモデル例
4
13. 概念モデルの理解
13.2 責任関係(7)
 知識レベルと操作レベル
 操作レベルの型の制約を記述
 鏡像関係
inv:
let collx:set(責任関係)=self.the責任関係 in
collX->forALL( x |
x.型.依頼者->includes(x.依頼者.型)
and
x.型.実行者->includes(x.実行者.型))
責任関係型
依頼者
*
実行者
*
*
*
依頼者
1
*
*
型 1
知識レベル
責任関係
*
パーティ型
1..*
1..*
型 1
*
作業
*
操作レベル
パーティ
実行者
1
1 有効期限
期間
人
組織
5
オブジェクト指向モデリング
シラバス
 授業計画
回
1
2
3
4
5
6
7
8
9
10
11
12
13
月日
9月 30日
10月 7日
10月14日
10月21日
10月28日
11月 4日
11月11日
11月18日
12月 2日
12月 9日
12月16日
1月13日
1月20日
内容
オリエンテーション:モデルとは何か。
モデリング言語:UMLの概要
静的モデル1:概念とクラス
静的モデル2:関連
静的モデル3:オブジェクト図
静的モデル3:オブジェクト図(続き),モデリング
機能モデル1:ユースケース,シナリオ
機能モデル2:要求抽出,協調図,シーケンス図,状態モデル:状態図
機能モデル2:活動図,静的モデル4:ユースケースに基づくモデリング
静的モデル4:モデルの揺さぶり
実装レベル:実装モデルとプログラム,概念モデルの理解:アナリシスパターン
概念モデルの理解:アナリシスパターン,実装モデルの理解:デザインパターン
モデリング:例題によるモデル図の作成
6
13. 概念モデルの理解
13.3 勘定(1)
 移動の記録
 勘定(account)
 勘定科目
 口座
実施日
04/1/12
借方
貸方
勘定科目
金額
勘定科目
金額
04/1/12 売上げ
30,000円 売掛金
31,500円
消費税
1,500円 預かり消費税 1,500円
計上日
摘要
商品販売
 多肢トランザクション
勘定科目
/残高 : 量
仕訳記入
1
*
数量 : 量
会計取引
2..*
実施日:時点
1 計上日:時点
《business rule》
inv:
self.仕訳記入.数量->sum = 0
7
 シナリオ
航空券の購入:多肢トランザクション
2001年5月1日,航空券を買うためにA航空に45,000円をクレジットカー
ドで払った。2001年5月31日,当座預金からクレジット勘定へ,それを埋
合わせる会計取引データを作成した
:仕訳記入
クレジット:勘定
-45000円
:仕訳記入
:会計取引
2001年5月1日
+45000円
A航空:勘定
:仕訳記入
-45000円
当座預金:勘定
:仕訳記入
:会計取引
2001年5月31日
+45000円
8
13. 概念モデルの理解
13.3 勘定(2)
 移動の記録
 二肢トランザクション
借方
貸方
勘定科目
金額
勘定科目
金額
04/1/12 04/1/12 売上げ
30,000円 売掛金
31,500円
消費税
1,500円 預かり消費税 1,500円
実施日
実施日
04/1/12
04/1/12
導出:
/残高=self.~繰入.移動量->sum
計上日
計上日
04/1/12
04/1/12
摘要
商品販売
金額 借方勘定科目 貸方勘定科目
摘要
30,000円 売上げ
売掛金
商品販売
1,500円 消費税
預かり消費税
-
self.~払出.移動量->sum
勘定
/残高:量
1
繰入
*
1
払出
*
会計取引
移動量:量
実施日:時点
「もの-こと-もの」のパ
ターン;どこからどこへの
移動を表す
9
 シナリオ
航空券の購入:二肢トランザクション
2004年1月5日,航空券を買うためにA航空に45,000円をクレジットカー
ドで払った。2004年1月31日,当座預金からクレジット勘定へ,それを埋
合わせる会計取引データを作成した
クレジット:勘定
/残高=-45000円
/残高=
0円
0円
A航空:勘定
払出
繰入
/残高=50000円
/残高=
5000円
移動量=45000円
実施日=2004年1月5日
繰入
/残高= 0円
/残高=45000円
当座預金:勘定
:会計取引
:会計取引
払出
移動量=45000円
実施日=2004年1月31日
10
13. 概念モデルの理解
13.3 勘定(3)
 要約
 ロールアップ
{抽象}
構成要素
勘定
* / 残高 : 量
{階層}
/対象仕訳記入
*
0..1
要約勘定
対象仕訳記入
明細勘定
1
*
仕訳記入
数量 : 量
会計取引
2..*
実施日:時点
1 計上日:時点
inv:
/対象仕訳記入=self.対象仕訳記入
inv:
/対象仕訳記入=self.構成要素./対象仕訳記入
11
旅費交通費:要約勘定
構成要素
航空旅費:要約勘定
構成要素
/対象仕訳記入
A航空:明細勘定
B航空:明細勘定
クレジット:明細勘定
/対象仕訳記入
対象仕訳記入
:仕訳記入
+45000円
:会計取引
2001年5月1日
:仕訳記入
:仕訳記入
+66000円
+128000円
:会計取引
2001年1月31日
:会計取引
2001年11月21日
:仕訳記入
-45000円
12
オブジェクト指向モデリング
14. 実装モデルの理解
14.1 デザインパターン
14.2 Composite
14.3 State
14.4 Observer
14.5 ObserverとMVC
13
14. 実装モデルの理解
14.1 デザインパターン(1)
 Design Patterns (1995)
 GoF(Gang of Four)
Gamma, Helm, Johnson, and Vlissides
 ET++に出てくるプログラムのパターン(Gamma)
 よいクラス設計のためのレシピ集
 Johnsonにパターン化を勧められる
 ソフトウエアパターンが世に知られる契機に
 パターンランゲージではない
14
14. 実装モデルの理解
14.1 デザインパターン(2)
 生成に関するパターン
Abstract Factory
Factory Method
Singleton
Builder
Prototype
 構造に関するパターン
Adapter
Composite
Façade
Proxy
Bridge
Decorator
Flyweight
 振る舞いに関するパターン
Cain of Responsibility
Command
Interpreter
Iterator
mediator
Memento
Observer
State
Strategy
Template Method
Visitor
15
14. 実装モデルの理解
14.2 Composite(1)
子
子
 構造に関するパターン
子
B
 木構造の一般形
C
{階層}
子
子
G
E
子
子
Leafの集合
Component
{abstract}
children
*
Component
operation()
add(Component)
remove(Component)
getChild()
Composite
children.operation()
D
A
F
*
Compositeの集合
operation()
add(Component)
remove(Component)
getChild()
Leaf
operation()
16
14. 実装モデルの理解
14.2 Composite(2)
 要約勘定の例
{abstract}
children
*
Account
balance()
{完全}
SummaryAccount
DetailAccount
balance()
balance()
public abstract class Account {
public abstract int balance();
:
public class SummaryAccount extends Account {
private Vector children = new Vector();
public int balance() {
int total = 0;
Iterator iter = children.iterator();
while(iter.hasNext()){
Account account = (Account)iter.next();
total += account. balance();
}
return total;
}
:
*
Entry
2..*
amount
entries
getAmount()
Transaction
postedDate
public class DetailAccount extends Account {
private Vector entries = new Vector();
public int balance() {
int total = 0;
Iterator iter = entries.iterator();
while(iter.hasNext()){
Entry entry = (Entry)iter.next();
total += entry.getAmount();
}
return total;
}
:
17
14. 実装モデルの理解
14.3 State(1)
 振る舞いに関するパターン
 内部状態が変化したときに,その振る舞いを変える
 動的分類の実装方法の一つ
 状態に依存した振る舞いを局所化
 状態ごとの振る舞いを用意
 ConcreteStateはsingleton
state.Handle()
Context
Request()
state
{abstract}
*
State
state Handle()
ConcreteStateA ConcreteStateB
Handle()
Handle()
18
14. 実装モデルの理解
14.3 State(2)
従業員
Request()
 条件分岐を外部クラスに
state
 Stateパターンを使わない場合との比較
public class 従業員 {
private 従業員型 _state;
private Money _salary;
public void setState(従業員型 s) {
_state = s;
}
従業員型
*
state 給与計算()
営業職型
給与計算()
技術職型
給与計算()
public class 従業員 {
private Money _salary;
private char _state;
public void setState(char s) {
_state = s;
}
public void Request( ) {
_salary = _state.給与計算( );
}
public void Request( ) {
if(_state == ‘1’)
_salary = 基本給 + 成績給( );
else if(_state == ‘2’)
_salary = 基本給 + 資格給( );
else ...;
}
}
public class 従業員型 {...}
public class 営業職型 extends 従業員型 {
public Money 給与計算( ) {
return 基本給 + 成績給( );
}
private Money 成績給( ) {...}
private Money 資格給( ) {...}
private Money 成績給( ) {...}
}
{abstract}
}
19
14. 実装モデルの理解
14.4 Observer(1)
 振る舞いに関するパターン
 ある観測対象に複数の観測者
 観測対象の変化をできるだけ早く知るには
 ポーリングではコンピュータリソースを消費しすぎる
 変化があったことだけを通知(notify)する(callback)
 通知を受けた観測者が変化情報を取りに行く
observer.
update()
{abstract}
{abstract}
Subject
*
Notify()
Attach(Observer)
Detach(observer)
ConcreteSubject
return subjectState
SetState()
GetState()
subjectState
Observer
update()
フレームワーク側
observer
subject
ConcreteObserver
update()
observerState=
subject.GetState()
observerState
20
14. 実装モデルの理解
14.4 Observer(2)
 拡張部分が一方向の参照になるように
 Observerの登録
 事象の通知
 状態へのアクセス
:ConcreteSubject
:ConcreteSubject
a:ConcreteObserver
attach(this)
a:ConcreteObserver
b:ConcreteObserver
setState()
1:notify()
2つめのConcreteObserver
オブジェクトに対する変更
事象発生の通知
1.1:update()
1.1.1:getState()
1.2:update()
1.2.1:getState()
21
14. 実装モデルの理解
14.5 ObserverとMVC(1)
 POSAのMVCパターン
 ConcreteSubjectを分離せず
 ConcreteObserverを2つのサブ
クラスに
 異なる責務を配置
{abstract}
{abstract}
Subject
Observer
*
Notify()
Attach(Observer)
Detach(observer)
ConcreteSubject
SetState()
GetState()
subjectState
Model
subject
update()
ConcreteObserver
update()
observerState
{abstract}
*
state
notify()
attach(Observer)
detach(observer)
setState()
getState()
observer
Observer
update()
*
View
display()
update()
makeController()
Controller
生成する
表示を
指示する
update()
*
22
14. 実装モデルの理解
14.5 ObserverとMVC(2)
Model
 GUIのパターン
 2種のObserverに通知
{abstract}
* Observer
state
notify()
attach(Observer)
detach(observer)
setState()
getState()
 層別化の基本的アーキテクチャ
*
update()
Controller
View
生成する
display()
update()
表示を
update()
指示する
makeController()
*
ドメイン
アプリケーション
U/I
:Controller
:View
:Model
setState()
1:notify()
1.1:update()
1.1.1:display()
1.1.1.1:getState()
1.2:update()
1.2.1:getState()
23
15. モデリング
15.3 酒屋の在庫問題
予習
 課題
酒類卸売り業のA社の倉庫には,仕入注文に応じて,メーカから毎
日数個のコンテナが搬入されてくる。その内容はビン詰めの酒で,1
つのコンテナには10銘柄まで混載できる。扱い銘柄は約200種類ある。
倉庫係は,商品(酒)をコンテナから取り出して倉庫に保管し,それを
記録した入庫表を受付係へ手渡す。また受付係からの出荷指示に
よって倉庫から商品を出荷することになっている。
さて,受付係は毎日,納入希望日の前日までに,電話で小売店から
の注文を受ける。受付係は,その都度注文票に記入し,そのコピーを
出荷指示として倉庫係に渡す。注文の納入希望日の当日朝時点で
当該商品の在庫数量が不足する場合には,不足分について在庫不
足リストに記入し,当日の夕方に,入庫希望日別,商品別に集計して,
メーカに仕入注文を出す。翌日入庫希望分は,翌日の夕方に入庫さ
れる。
A社の,仕入,受注,出荷をサポートする情報システムの概念モデル
を作成せよ。
24