Upload
at-grandpa
View
900
Download
1
Embed Size (px)
Citation preview
目的
・デザインパターンの仕組みを学ぶ ×・なぜこのパターンはこう実装されているのか ・その実装によってどんな利点があるのか oオブジェクト指向の考え方をどう使って実装するかを学ぶ
クラス? 継承? ポリモーフィズム? …etc
Iterator
質問1 集約体に変更があった場合どうする?ex) 単純な配列ではなく2次元配列に変更
デメリット
・走査方法が変わるので、走査処理部分を変更する必要がある ・いたるところで走査処理が行われていた場合、全てを変更しなければいけない
Step1. 普通に配列を使って実装する
Iterator
質問1 集約体に変更があった場合どうする?ex) 単純な配列ではなく2次元配列に変更
デメリット
・走査方法が変わるので、走査処理部分を変更する必要がある ・いたるところで走査処理が行われていた場合、全てを変更しなければいけない
質問2 新しい走査方法を実装したいときどうする?ex) 先頭から順ではなく逆順に走査したい
Step1. 普通に配列を使って実装する
Iterator
質問1 集約体に変更があった場合どうする?ex) 単純な配列ではなく2次元配列に変更
デメリット
・走査方法が変わるので、走査処理部分を変更する必要がある ・いたるところで走査処理が行われていた場合、全てを変更しなければいけない
質問2 新しい走査方法を実装したいときどうする?ex) 先頭から順ではなく逆順に走査したい
デメリット
・これも走査方法が変わるので、走査処理部分を変更する必要がある ・いたるところで走査処理が行われていた場合、全てを変更しなければいけない
Step1. 普通に配列を使って実装する
Iterator
集約体1
要素1
要素2
要素3
要素4
・・・
Worker
メソッド output
Step2. インターフェースを実装する
集約体2
要素1
要素2
要素3
要素4
・・・
インターフェース
・インターフェースにより構造が違ってもアクセス方法は同じ ・Workerは構造の違いを意識する必要がない
Iterator
質問1 集約体に変更があった場合どうする?
メリット
・集約体全てにAggregateインターフェースを実装すれば、 Workerの走査処理を変更しなくて良い
Step2. インターフェースを実装する
ex) 単純な配列ではなく2次元配列に変更
Iterator
質問1 集約体に変更があった場合どうする?
メリット
・集約体全てにAggregateインターフェースを実装すれば、 Workerの走査処理を変更しなくて良い
Step2. インターフェースを実装する
集約体の構造の違いはインターフェース内の実装で吸収する
ex) 単純な配列ではなく2次元配列に変更
Iterator
質問1 集約体に変更があった場合どうする?
メリット
・集約体全てにAggregateインターフェースを実装すれば、 Workerの走査処理を変更しなくて良い
質問2 新しい走査方法を実装したいときどうする?ex) 先頭から順ではなく逆順に走査したい
Step2. インターフェースを実装する
集約体の構造の違いはインターフェース内の実装で吸収する
ex) 単純な配列ではなく2次元配列に変更
Iterator
質問1 集約体に変更があった場合どうする?
メリット
・集約体全てにAggregateインターフェースを実装すれば、 Workerの走査処理を変更しなくて良い
質問2 新しい走査方法を実装したいときどうする?ex) 先頭から順ではなく逆順に走査したい
Step2. インターフェースを実装する
デメリット
・たとえ同じ構造の集約体でも、 走査方法が変わるたびに新しい集約体を作らないといけない
(走査方法だけが違う)同じ構造の集約体がたくさんできてしまう
集約体の構造の違いはインターフェース内の実装で吸収する
ex) 単純な配列ではなく2次元配列に変更
Iterator
集約体1
要素1
要素2
要素3
要素4
・・・
Worker
メソッド output
Step3. クラスの責任を分離する
Iterator1
Iterator2
走査 メソッド1
集約体から走査処理を分離し Iteratorに委譲する
Iterator1
Iterator
集約体1
要素1
要素2
要素3
要素4
・・・
Worker
メソッド output
Step3. クラスの責任を分離する
Iterator1
Iterator2
走査 メソッド1
集約体から走査処理を分離し Iteratorに委譲する
Iterator1
走査 メソッド2
一つの集約体に対して 複数の走査方法を実装できる
Iterator2
Iterator
集約体1
要素1
要素2
要素3
要素4
・・・
Worker
メソッド output
Step3. クラスの責任を分離する
Iterator1
Iterator2
インターフェースが 統一されているので、 Workerの実装は 走査方法に依存しない
走査 メソッド1
集約体から走査処理を分離し Iteratorに委譲する
Iterator1
走査 メソッド2
一つの集約体に対して 複数の走査方法を実装できる
Iterator2
Iterator
質問1 集約体に変更があった場合どうする?
メリット
・Iteratorの走査処理を集約体の変更に合わせて修正 ・Iteratorのインターフェースは統一されているので Workerの内容を変更しなくて良い
Step3. クラスの責任を分離する
ex) 単純な配列ではなく2次元配列に変更
Iterator
質問1 集約体に変更があった場合どうする?
メリット
・Iteratorの走査処理を集約体の変更に合わせて修正 ・Iteratorのインターフェースは統一されているので Workerの内容を変更しなくて良い
質問2 新しい走査方法を実装したいときどうする?ex) 先頭から順ではなく逆順に走査したい
Step3. クラスの責任を分離する
ex) 単純な配列ではなく2次元配列に変更
Iterator
質問1 集約体に変更があった場合どうする?
メリット
・Iteratorの走査処理を集約体の変更に合わせて修正 ・Iteratorのインターフェースは統一されているので Workerの内容を変更しなくて良い
質問2 新しい走査方法を実装したいときどうする?ex) 先頭から順ではなく逆順に走査したい
メリット
・Workerにも集約体にも変更の影響を与えず どんどん新しいIteratorを増やしていける
Step3. クラスの責任を分離する
ex) 単純な配列ではなく2次元配列に変更