51
01. Iterator デザインパターンから学ぶオブジェクト指向 @at_grandpa

デザインパターンから学ぶオブジェクト指向 【01. Iterator】

Embed Size (px)

Citation preview

01. Iteratorデザインパターンから学ぶオブジェクト指向

@at_grandpa

目的

目的

・デザインパターンの仕組みを学ぶ

目的

・デザインパターンの仕組みを学ぶ ×

目的

・デザインパターンの仕組みを学ぶ ×・なぜこのパターンはこう実装されているのか ・その実装によってどんな利点があるのか o

目的

・デザインパターンの仕組みを学ぶ ×・なぜこのパターンはこう実装されているのか ・その実装によってどんな利点があるのか oオブジェクト指向の考え方をどう使って実装するかを学ぶ

クラス? 継承? ポリモーフィズム? …etc

01. Iterator

Iterator

目的:集約体の各要素を走査し参照する

集約体

要素1

要素2

要素3

要素4

・・・

Worker

メソッドoutput

参照

Iterator

簡単な実装から始めて 徐々にIteratorパターンに進化させていきます

Iterator

Step1. 普通に配列を使って実装する

Iterator

集約体

要素1

要素2

要素3

要素4

・・・

Worker

メソッドoutput

参照

まさにこの図

Step1. 普通に配列を使って実装する

Iterator

集約体を表すクラス

ConceteAggregate

Iterator

走査処理部分

Worker

Iterator

変更が生じた場合、どのようなことが起こるか

Iterator

質問1 集約体に変更があった場合どうする?ex) 単純な配列ではなく2次元配列に変更

Step1. 普通に配列を使って実装する

Iterator

質問1 集約体に変更があった場合どうする?ex) 単純な配列ではなく2次元配列に変更

デメリット

・走査方法が変わるので、走査処理部分を変更する必要がある ・いたるところで走査処理が行われていた場合、全てを変更しなければいけない

Step1. 普通に配列を使って実装する

Iterator

質問1 集約体に変更があった場合どうする?ex) 単純な配列ではなく2次元配列に変更

デメリット

・走査方法が変わるので、走査処理部分を変更する必要がある ・いたるところで走査処理が行われていた場合、全てを変更しなければいけない

質問2 新しい走査方法を実装したいときどうする?ex) 先頭から順ではなく逆順に走査したい

Step1. 普通に配列を使って実装する

Iterator

質問1 集約体に変更があった場合どうする?ex) 単純な配列ではなく2次元配列に変更

デメリット

・走査方法が変わるので、走査処理部分を変更する必要がある ・いたるところで走査処理が行われていた場合、全てを変更しなければいけない

質問2 新しい走査方法を実装したいときどうする?ex) 先頭から順ではなく逆順に走査したい

デメリット

・これも走査方法が変わるので、走査処理部分を変更する必要がある ・いたるところで走査処理が行われていた場合、全てを変更しなければいけない

Step1. 普通に配列を使って実装する

Iterator

修正してデメリットを解決していきます

Iterator

Step2. インターフェースを実装する

Iterator

集約体1

要素1

要素2

要素3

要素4

・・・

Worker

メソッド output

Step2. インターフェースを実装する

集約体2

要素1

要素2

要素3

要素4

・・・

Iterator

集約体1

要素1

要素2

要素3

要素4

・・・

Worker

メソッド output

Step2. インターフェースを実装する

集約体2

要素1

要素2

要素3

要素4

・・・

インターフェース

・インターフェースにより構造が違ってもアクセス方法は同じ ・Workerは構造の違いを意識する必要がない

Iterator

走査するためのインターフェース

MyIterator

Iterator

走査するためのインターフェースを実装した集約体クラス

ConcreteAggregate

Iterator

インターフェースを利用して集約体にアクセス

Worker

Iterator

変更が生じた場合、どのようなことが起こるか

Iterator

質問1 集約体に変更があった場合どうする?

Step2. インターフェースを実装する

ex) 単純な配列ではなく2次元配列に変更

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

もう一つのデメリットも解消しましょう

Iterator

Step3. クラスの責任を分離する

Iterator

集約体1

要素1

要素2

要素3

要素4

・・・

Worker

メソッド output

Step3. クラスの責任を分離する

Iterator1

Iterator2

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

MyAggregateMyIterator

走査するためのインターフェース

集約体インターフェース

Iterator

ConcreteAggregate

走査するためのメソッドは持たない

Iteratorを生成し、引数として集約体(自分自身)を渡す

Iterator

ConcreteIterator

走査するためのメソッドを実装

Iterator

Worker

Iteratorを生成し、Iteratorのインターフェースを用いて走査処理を行う

Iterator

変更が生じた場合、どのようなことが起こるか

Iterator

質問1 集約体に変更があった場合どうする?

Step3. クラスの責任を分離する

ex) 単純な配列ではなく2次元配列に変更

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次元配列に変更

Iterator

デメリット解消!

Iterator

まとめ

Iterator

ポリモーフィズム

単一責任の原則

Step2. インターフェースを実装する

Step3. クラスの責任を分離する

Iterator

もっとまとめ

Iterator

・デザインパターンはオブジェクト指向の重要な概念を用いて成り立っている !・デザインパターンは、ただ覚えて、ただ使うものではない !・オブジェクト指向の概念を学ぶためのものとして捉えてみる !・オブジェクト指向の概念を理解して、うまく設計をすることが最終目的

「デザインパターンを学ぶこと」が目的とならないように!