ビジネスとIT活用に役立つブログBlog


今更ながらデザインパターンに入門してみた(Iteratorパターン編)

この記事をシェアする:

ソフトウェア開発の設計パターン集であるデザインパターンをご存知でしょうか。
筆者はデザインパターンをいつかは覚えておかないといけないなと思ってきましたが、中々重い腰が上がらずふわっとした知識だけにとどまっていました。

多くのソフトウェアではオブジェクト指向による設計・開発が取り入れられており、アーティスでも一部のプロダクトではオブジェクト指向による設計・開発を行っています。
改めてデザインパターンを知ることで、よりよい設計の指針の一助になる事を願っています。

※本連載は「Java言語で学ぶデザインパターン入門」を参考に、PHPで各デザインパターンを実装しなおした内容です。

GoFの『デザインパターン』で紹介された23個のパターンを、オブジェクト指向の初心者にもわかるようにやさしく解説。 すべてのパターンについて、Javaのサンプルプログラムを掲載。「デザインパターンQ&A」を新たに加筆。Amazon 増補改訂版Java言語で学ぶデザインパターン入門

デザインパターンとは?

ソフトウェア開発におけるデザインパターン(型紙(かたがみ)または設計パターン、英: design pattern)とは、過去のソフトウェア設計者が発見し編み出した設計ノウハウを蓄積し、名前をつけ、再利用しやすいように特定の規約に従ってカタログ化したものである。wikipediaより

第1章「Iterator」

Iteratorパターンとは、何かがたくさん集まっているときに、それを順番に指し示していき、全体をスキャンしていく処理を行うためのものです。 p.2 第1章 Iterator - 1つ1つを数え上げる

配列などの集合をループで回して処理していくケースをPHPで考えてみます。

実行結果

ループ処理を可能にし、コレクションのようにみせることで、上記のようなループ処理を抽象化し、パターン化したものを「Iterator」パターンと呼びます。 書籍では本棚にある本を数え上げるJavaでの実装例が紹介されています。

今回は書籍の実装例を参考に、PHPでIteratorパターンを実装してみます。

事前準備

複数のファイルを扱う事になるので、クラスのオートロードをcomposerで行います。

1. composerのpharファイルをダウンロードします

2. composer.jsonファイルを作成しオートロードの設定を記述して保存します

3. composerのコマンドを実行します

PHPで実装しなおしてみた

Aggregate(集約・集合体)

Iterator(反復処理を扱う)

BookShelf(Aggregateの実装)

BookShelfIterator(Iteratorの実装)

Book(数え上げられる対象)

実行クライアント

最終的なディレクトリ構造は以下になります。

実行結果

SplIterator

実はPHPではIteratorインターフェースが既に定義されています。

PHPマニュアル Iteratorインターフェース

その他にもSPL(Standard PHP Library)には様々なIteratorの実装が組み込みで定義されています。

ArrayIterator

今回のサンプルコードのような処理をSplArrayIteratorで実装するとこのようなコードになります。

実行結果

RecursiveIteratorIterator と RecursiveDirectoryIterator

ディレクトリを再帰的に走査するケースを考えてみます。

iteratorを使わない実装では再帰処理を実装し、再帰的にディレクトリを走査する実装方法があります。

再帰的な処理は実装が難しく、確認が難しいのもあって辛みがすごいです・・・。

RecursiveIteratorIteratorとRecursiveDirecotoryIteratorを使って実装するとコードはこのようになります。

まとめ

書籍には以下の様な作者の記載があります。

どうしてIteratorパターンなんて面倒なものを考える必要があるのでしょう。配列だったらfor文でくるくる回せばいいじゃないですか。なぜ集合体の外にIterator役などというものを作る必要があるのでしょう。

大きな理由は、Iteratorを使う事で、実装とは切り離して、数え上げを行う事ができるからです。p.11 第一章 あなたの考えを広げるためのヒント

実装と切り離すことでIteratorのループがAggregateの実装には依存しなくなります。その結果Aggregateの実装を差し替え可能になる事が有用と感じました。

また、今回の例では取り扱うデータ構造が配列でしたが、コレクションとして振る舞うオブジェクトを走査したいといったケースでもIteratorパターンは有用そうです。

PHPにはその他にもSPLには実用的なSplIteratorがあります。 一度目を通して見てはいかがでしょうか。

PHPマニュアル イテレータ
The following two tabs change content below.
アーティス

アーティス

創造性を最大限に発揮するとともに、インターネットに代表されるITを活用し、みんなの生活が便利で、豊かで、楽しいものになるようなサービスやコンテンツを考え、創り出し提供しています。
この記事のカテゴリ:

SNSで最新の情報を
受け取ることができます!