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