47070
オブジェクト指向モデリング
[11]
2003年 1月 7日
オブジェクト指向モデリング
第10回 静的モデル3
10.1 制約
10.2 関連型
10.3 型についての補足
10.4 依存性
10.5 パッケージ
10.6 知識レベル
2
静的モデル3
10.1 制約
79~81ページ
型(クラス)図も制約がなければただの線図
曖昧さの排除
制約に従ったクラス群がモデル
形式的なルールの記述
{制約}
ノート
貸出
0..*
0..*
制約記述言語
1
{xor}
1
雑誌
1
本
UML組み込み
OCL
多重度も制約の一種
路線
{ordered}
*
駅
貸出
0..*
制約:
雑誌は教員の会
員だけが借りられる
本
雑誌
3
静的モデル3
82ページ
10.2 関連型
関連に属性,操作を持たせる
「もの-こと-もの」パターン
2種類の記述方法
導出関連
学生
履修している
1..*
6..*
氏名
授業科目
科目名
成績
/履修している
1..*
6..*
学生
氏名
履修
6..*
1..1
成績
授業科目
1..*
1..1 科目名
制約:
再履修は不可
4
オブジェクト指向モデリング
第11回 ソフトウェアパターン
11.1 パターンランゲージ
すべて
教科書外
11.2 パターンの意味
11.3 パターンの形式
11.4 ソフトウェアパターンの歴史
11.5 PLoPの活動
11.6 刊行されたパターンたち
11.7 アナリシスパターン
11.8 デザインパターン
5
11.1 パターンランゲージ
Christopher Alexander(1936~)
パターン3部作(5部作)
“The Oregon Experiment,” Oxford Univ. Press, 1975, 宮本雅明(訳),「オレ
ゴン大学の実験」,鹿島出版会,1977
“A Pattern Language,” Oxford Univ. Press, 1977, 平田翰那(訳),「パタン・ラ
ンゲージ」,鹿島出版会,1984
“The Timeless Way of Building," Oxford Univ. Press, 1979, 平田翰那(訳),
「時を超えた建設の道」,鹿島出版会,1993
よい建築がもつ性質
無名の質(Quality Without A Name)
生き生きと生きること(alive)
パターンの重層
6
11.1 パターンランゲージ
たゆまざる方法(timeless way)
The Oregon Experiment
有機的秩序の原理
全体を徐々に生み出して行く
参加の原理(grassroots housing process)
漸進的成長(piecemeal growth)
建築物は,修正,復元,拡張,改善によって成長すべき
小規模開発を繰り返す
パターンの原理
漸進的プロセスにあって,設計を指導して行く概念
コミュニティにおける共通の合意事項
長期にわたって基本設計を
採択のプロセス
書くことはできない。パターン
学習過程
ランゲージを基本設計書の
代わりにする
7
11.1 パターンランゲージ
「パタン・ランゲージ」
建築のための253のパターン
パタンで建てられた建築は[長い時間の中で]無名の質を織りなす
シーケンス(工事手順の手引き)
大きいパタン(町)から小さいパタン(建物,施工)へ
骨組みのパタンから肉づけのパタンへ
パタン間の脈絡は「詩」を構成する
81 小さな広場
68 つながった遊び場
125 座れる階段
126 ほぼ中央の焦点
パターンどうしは圧縮して適用される
印刷されたパタン・ランゲージに依存してはならない
自分自身のパタン・ランゲージを自覚し,改良していく
「パタン・ランゲージ」の使い方
プロジェクトごとに,元になるパタンランゲージから有効なものを
(順序を崩さないように)抜き出して,プロジェクト用のパタンラン
ゲージを作る。
8
11.2 パターンの意味
パターンは有効なのか
建築の世界がソフトウェアに当てはまるのか
無名の質,piecemeal growth,...
パターンは必ずしも成功していない?
Modesto,Mexicali
Oregon
59 静かな奥
105 南向きの屋外
111 見え隠れの庭
112 入口での転換
161 日のあたる場所
171 木のある場所
9
11.2 パターンの意味
パターンの定義
おおかたの定義
ノウハウの記述,経験則
文脈を超えて有効な解決策
繰り返し起こる問題と解決策
一般化
抽象化
3のルール
われわれの捉え方
漸進的成長のための設計原理
10年後のシステムを設計できないとすれば...
設計原理を継承して行くプロセス
合意,公式化,共有,使用
追加,修正,削除/発展・改良
10
11.3 パターンの形式
Alexander
名前
<写真>
・・・概要(目的,他のパタンとの関係)
問題,背景
「したがって,…すること。」
[説明図,写真]
「(他のパタンとの関係)すること ‥‥」
154 十代の離れ(Teenage Cottage)
<写真>
...十代の子供がいる家では,必ず子供部屋に特
別の注意を払う必要がある。できれば,この部屋は
壁続きであっても独立性があり,後で述べる貸せる
部屋(153)に転用できるように作るべきである。
★
家庭内の十代の子供のための場所は,独立への
要求を反映しないと,子供は家族との対立で身動き
がとれなくなる。
大抵の家庭では,こともの部屋と青年の部屋は本
質的に同じものである。だが,子供が青年になる
と,...
したがって,
子供が十代になったことを明示するために,子供
の場所は,自立の始まりを物理的に表現する一種
の離れに変えること。離れはおも屋と壁続きにする
が,一目で見分けられるように突き出し,...
★
離れにはくるま座(185)とベッド・アルコーブ(188)
を備えても,専用の浴室や台所は設けないこと。 ...
11
11.3 パターンの形式
COMPOSITE
GoF
名前と分類
目的
別名
動機
適用可能性
構造(クラス図)
構成要素
協調関係
結果
実装
サンプルコード
使用例
関連するパターン
オブジェクト,構造
◎目的
部分-全体階層を表現するために,オブジェクトを木構造に組
み立てる。...
◎動機
...ユーザは構成要素を組み合わせて大きな構成要素を作り
出すことができ,...
<例のクラス図>
Component *
Client
◎適用可能性
children
次のような場合に,Compositeパターンを使用する。
◎構造
<クラス図>
◎構成要素
・Componentクラス
Leaf
Composite
:
◎協調関係
・クライアントは,Componentクラスのインタフェースを使っ
て,...
◎結果
Compositeパターンを用いると,次のような結果が得られる。
◎実装
Compositeパターンを実装する際には,以下に挙げる点を考慮
しなければならない。
:
12
11.3 パターンの形式
POSA(Pattern-Oriented Software Architecture)
名前[別名]
概要
例
前提
課題
解決策
静的側面
動的側面
実装
バリエーション
適用例
結論
参考
謝辞
Model-View-Controller
MVCアーキテクチャパターンは,対話型アプリケーションを3つ
のコンポーネントに分割する。モデルコンポーネントは,...
例 得票率で決まる政治選挙についての簡単な情報システムを
考えてみる。このシステムは,データ入力のためのスプレッド...
<図>
前提 人とコンピュータのインタフェースに柔軟性を持たせた対
話型アプリケーションの機能を拡張しようとすると...
課題 ユーザインタフェースは要求変更の影響を被ることが多い,
例えば,アプリケーションの機能を拡張しようとすると...
解決策 MVCパターンが最初に導入されたのは,smalltalk-80プ
ログラミング環境である。このパターンは,...
静的側面 モデルコンポーネントは,アプリケーションの機能中核
となる部分を含んでいる。...更新伝播メカニズムは,...
<CRC図>
<クラス図>
動的側面 以下のシナリオは,MVCの動的な振る舞いを描いた
ものである。...
<シーケンス図>
実装
13
11.3 パターンの形式
“Analysis Patterns” (Fowler)
その章の概要
テーマ
型図
例
[モデリングの原則]
“Refactoring” (Fowler)
名前
問題-解決
動機
手順
例(コード)
14
11.3 パターンの形式
記述形式になぜこだわるか
形式化しにくい知識を伝えたい
盲目的に従うルールではない
プランではなく,レシピ
隠された構造の取り出し
分析ではなく合成
Forceを感じること
トレードオフの調停
判断の助け
形式を持っていればパターン
c.f. 絵本の読み聞かせのパターンランゲージ
(http://www.hyuki.com/writing/ehonpat.html)
子供におかたづけを促すパターンランゲージ
(児玉,矢崎:オブジェクト指向シンポジウム2000論文集)
15
11.4 ソフトウエアパターンの歴史
ソフトウエアパターンの歴史
OOPSLA’87
Beck & Cunningham
Using Pattern Languages for Object-Oriented Programs
Window Per Task, Few Panes, Standard Pane, Nouns and Verbs, Short Menus
(BeckはOregon Univ.卒)
ECOOP/OOPSLA’90
Gamma and Helm
BOF(Birds-of-a-Feather; 同じ羽の鳥は集まる)session
ECOOP’91
GoFのパターンの原形
OOPSLA’91~93
Patternに関するワークショップ
16
11.4 ソフトウエアパターンの歴史
PLoPの活動
OOPSLA’91,’92のワークショップの参加者
Hillside Group
1993年8月:Beck, Booch, Cunningham, Johnson, Coplien,…
1994年4月:+Gabriel
PLoP:パターンライティングの奨励
1994年8月:1st PLoP Conference @Allerton Park, Illinois Univ.
:
:
EuroPLoP(1996~)
ChilliPLoP(1998~)
KoalaPLoP(2000~)
MensolePLoP(2001~)
17
11.5 PLoPの活動
PLoPの方法
Writer’s Workshop
パターンの投稿
shepherding
コンファレンス
ゲーム
パターンの推敲
詩の吟味
Writing Workshop
パターンライティング
PLoPD
完成したパターンの刊行
18
11.5 PLoPの活動
パターンの吟味
a. 著者がパターンの「肝」を朗読.以降,口を差し挟めない
b. 推敲者がそれぞれの視点でそのパターンを要約する
c. 「良いところ」を述べる
d. 「直すべきところ」を述べる
e. 著者による上記に関する質問と補足
f. 拍手して終了
吟味のパターンランゲージ
19
ソフトウェアパターン
11.6 刊行されたパターンたち
Design Patterns (1995)
GoF(Gang of Four)
Gamma, Helm, Johnson, and Vlissides
よいクラス設計のためのレシピ集
Pattern-Oriented Software Architecture(1996)
Siemens Group
Buschmann, Meunier, Rohnert, Sommerlad, and Stal
アーキテクチャ設計のためのレシピ集
Analysis Patterns(1997)
Martin Fowler
よい分析のためのレシピ集
サポートパターン(分析から設計への橋渡し)
PLoPD(Pattern Language of Programming and Design)
Anti Patterns
20
ソフトウェアパターン
11.7 アナリシスパターン
アナリシスパターン
責任関係(Accountability)
観測と測定
企業財務の観測
オブジェクトへの参照
在庫管理と会計(Account)
会計モデルの利用
計画
トレーディング
デリバティブ
トレーディングパッケージ
サポートパターン
情報システムの層別化アーキテクチャ
アプリケーションファサード
型モデル設計テンプレートのためのパターン
関連パターン
21
ソフトウェアパターン
11.7 アナリシスパターン
責任関係(Accountability)
明示的なレベルを持った組織
事業部
1
*
地域
1
部門
*
1
営業所
* 売上
変更に弱い
操作(メソッド)の重複,類似の属性
オブジェクト(インスタンス)図
コーヒー:事
業部
首都圏:
地域
神奈川:
部門
藤沢:営
業所
東京:部
門
川崎:営
業所
22
ソフトウェアパターン
11.7 アナリシスパターン
このオブジェクト
図はどうなる?
責任関係(Accountability)
階層関係を持つ組織
類似の操作,属性はスーパタイプに持つ
{階層}
親
組織
制約:
親は持たない
事業部
0..1
子
制約:
親は部門
*
地域
制約:
親は事業部
部門
営業所
制約:
親は地域
制約の変更が煩わしい
マトリックス組織にはどう対応する?
23
コーヒー:事 親
業部
子 首都圏:
地域
親
子 神奈川:
部門
東京:部
門
親
子 藤沢:営
業所
川崎:営
業所
24
ソフトウェアパターン
11.7 アナリシスパターン
このオブジェクト
図はどうなる?
責任関係(Accountability)
2系統の階層
{階層}
{階層}
*
子営業
*
組織
親営業
*
*
事業部
制約:
地域
制約:
親サービス
子サービス
部門
制約:
営業所 サービス地域 サービス部門 サービスセンタ サービスチーム
制約:
制約:
親営業は部門
制約:
制約:
制約:
親サービスは
サービスセンタ,
親営業は営業所
制約変更の煩わしさが2倍に
25
コーヒー:事
業部
首都圏:地
域
東京:部門
首都圏:サー
ビス地域
神奈川:部
門
川崎:営業
所
藤沢:営業
所
神奈川:サー
ビス部門
横浜:サービ
スセンタ
親営業
東京:サービ
ス部門
藤沢:サービ
スセンタ
親サービス
子サービス
子営業
川崎:サービ
スチーム
藤沢:サービ
スチーム
26
ソフトウェアパターン
11.7 アナリシスパターン
このオブジェクト
図はどうなる?
責任関係(Accountability)
関連型の使用
インスタンス:
営業組織
サービス組織
組織構造型
制約:
営業所の親は部
門….
サービスチームの
親は営業所および
サービスセンタ….
型1
*
組織構造
*
親
1
*
組織
子
1
*
1 有効期間
期間
事業部
地域
部門
営業所
サービス
チーム
「組織構造」の制約は,組織構造の変化に敏感
27
神奈川:
部門
神奈川:サ
ービス部門
親
営業組織:
組織構造型
:組織構
造
:組織構
造
:組織構
造
:組織構
造
子
川崎:営
業所
藤沢:営
業所
横浜:サー
ビスセンタ
藤沢:サー
ビスセンタ
:組織構
造
:組織構
造
:組織構
造
サービス組織
:組織構造型
親
:組織構
造
:期間
2001/10/1 _
2002/1/22
子
川崎:サー
ビスチーム
藤沢:サー
ビスチーム
28
ソフトウェアパターン
11.7 アナリシスパターン
このオブジェクト
図はどうなる?
責任関係(Accountability)
「組織構造型」と「ルール」
組織構造型 *
1
ルール
型1
*
組織構造
*
親
1
*
組織
子
1
*
1 有効期間
期間
事業部
地域
部門
営業所
サービス
チーム
組織構造型ごとのルール
組織の変化に弱い
29
サービスチームの親は営
業所およびサービスセンタ
,サービスセンタの親は,
….
営業所の親は部門,部門
の親は地域,...
神奈川:部
門
営業組織型:
ルール
神奈川:サー
ビス部門
営業組織型:
ルール
親
:組織構造
:組織構造
:組織構造
藤沢:営業
所
横浜:サービ
スセンタ
藤沢:サービ
スセンタ
:組織構造
:組織構造
:組織構造
:組織構造
子
営業組織:組
織構造型
川崎:営業
所
サービス組織:
組織構造型
親
:組織構造
子
:期間
2001/10/1 _
2002/1/22
川崎:サービ
スチーム
藤沢:サービ
スチーム
30
ソフトウェアパターン
11.7 アナリシスパターン
打診
責任関係(Accountability)
契約
組織階層を「責任関係」として一般化
Customer
Performer
Customer
責任関係型
Performer
実行
報告
型 1
*
*
責任関係
依頼者
1
*
*
実行者
パーティ
1
1 有効期限
期間
人
組織
依頼者→実行者
Customer-Performerの関係
31
ソフトウェアパターン
11.7 アナリシスパターン
このオブジェクト
図はどうなる?
責任関係(Accountability)
知識レベルと操作レベル
パワータイプ(ベキ型)
操作レベルの型の制約を記述
鏡像関係
責任関係型
inv:
collx:set(責任関係)=self.the責任関係
collX->forALL( x |
x.型.依頼者->includes(x.依頼者.型)
and
x.型.実行者->includes(x.実行者.型))
作業
*
依頼者
*
実行者
1..*
型 1
*
*
*
*
依頼者
1
*
*
型 1
知識レベル
責任関係
*
パーティ型
1..*
操作レベル
パーティ
実行者
1
1 有効期限
期間
人
組織
32
シナリオ
同意:責任関係
患者:鈴木一郎は医師:山本太郎との間で,2001年12月18日に内視鏡検
査を受けることについて同意した
同意:責任
関係型
型
依頼者 患者
:パーティ型
医師
実行者 :パーティ型
型
型
内視鏡検
査:作業
:責任関
係
:期間
2001/12/18
依頼者 鈴木一郎
:パーティ
実行者 山本太郎
:パーティ
33
ソフトウェアパターン
11.7 アナリシスパターン
このオブジェクト
図はどうなる?
勘定(Account)
移動の記録
勘定
多肢トランザクション
勘定
/残高 : 量
エントリ
1
*
数量 : 量
2..*
1
トランザクション
実施日:日
<<business rule>>
inv:
self.theエントリ.数量->sum = 0
34
シナリオ
航空券の購入:多肢トランザクション
2001年5月1日,航空券を買うためにA航空に45,000円をクレジットカー
ドで払った。2001年5月31日,当座預金からクレジット勘定へ,それを埋
合わせるトランザクションを作成した
:エントリ
クレジット:勘定
-45000円
:エントリ
:トランザクション
2001年5月1日
+45000円
A航空:勘定
:エントリ
-45000円
当座預金:勘定
:エントリ
:トランザクション
2001年5月31日
+45000円
35
ソフトウェアパターン
11.7 アナリシスパターン
このオブジェクト
図はどうなる?
勘定(Account)
要約(Summary)
ロールアップ
{抽象}
構成要素
勘定
* /残高 : 量
{階層}
/対象エントリ
*
0..1
要約勘定
対象エントリ
明細勘定
1
*
エントリ
数量 : 量
トランザクション
2..*
1
inv:
/対象エントリ=self.対象エントリ
inv:
/対象エントリ=self.構成要素./対象エントリ
36
旅費交通費:要約勘定
構成要素
航空旅費:要約勘定
構成要素
A航空:明細勘定
/対象エントリ
B航空:明細勘定
クレジット:明細勘定
/対象エントリ
対象エントリ
:エントリ
:エントリ
:エントリ
+45000円
+66000円
+128000円
:トランザクション
2001年5月1日
:トランザクション
2001年1月31日
:トランザクション
2001年11月21日
:エントリ
-45000円
37
ソフトウェアパターン
11.8 デザインパターン
生成に関するパターン
Abstract Factory Builder
Factory Method Prototype
Singleton
構造に関するパターン
Adapter
Composite
Façade
Proxy
Bridge
Decorator
Flyweight
振る舞いに関するパターン
Cain of Responsibility
Command
Interpreter
Iterator
mediator
Memento
Observer
State
Strategy
Template Method
Visitor
38
ソフトウェアパターン
11.8 デザインパターン
Observer
1つの主題(Subject)に対して複数の表示(Observers)
ObserverからSubjectへの1方向の可視性を保証
結合度を下げる
update()は逆方向だが,変更時には問題にならない
observer
->update()
{abstract}
{abstract}
Subject
*
Notify()
Attach(Observer)
Detach(observer)
ConcreteSubject
return subjectState
SetState()
GetState()
subjectState
Observer
update()
observer
subject
ConcreteObserver
update()
observerState
observerState=
subject.GetState()
39
ソフトウェアパターン
11.8 デザインパターン
Observer
Observerの登録(Attach())
値が変化したことの通知(Notify()->update())
Observerはそれぞれ値を取りに行く
SubjectはModelで,ObserverはViewに相当
:ConcreteSubject
a:ConcreteObserver
b:ConcreteObserver
1:SetState()
1.1:Notify()
1.1.1:update()
1.1.1.1:GetState()
1.1.2:update()
1.1.2.1:GetState()
40
ソフトウェアパターン
11.8 デザインパターン
State
内部状態が変化したときに,その振る舞いを変える
状態に依存した振る舞いを局所化
状態ごとの振る舞いを用意
ConcreteStateはsingleton
state.Handle()
Context
Request()
state
{abstract}
*
State
state Handle()
ConcreteStateA ConcreteStateB
Handle()
Handle()
41
ソフトウェアパターン
11.8 デザインパターン
従業員
Request()
{abstract}
従業員型
*
state 給与計算()
state
State
Stateパターンを使わない場合との比較
public class 従業員 {
private 従業員型 _state;
private Money _salary;
public void setState(従業員型 s) {
_state = s;
}
給与計算()
給与計算()
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 成績給( ) {...}
}
技術職型
営業職型
}
42
質問カードから
設計の際にデザインパターンをどう考慮するか
使えるときには使う
使えるかどうかの判断はForce
43
© Copyright 2026 ExpyDoc