1. まとめトップ

【プログラム設計】デザインパターン学習 "Iteratorパターン" とは【オブジェクト指向】

23のデザインパターンの1つ、Iteratorパターンを紹介します。

更新日: 2012年10月31日

3 お気に入り 7727 view
お気に入り追加

この記事は私がまとめました

1.Iteratorパターンとは

データの取り扱いを、そのデータを保有しているクラスに決めさせるためのものである。

ひとまずは、こう考えましょう。

2.Iteratorパターンを用いるべき状況

例えば、あなたが友達の山田さんに、本を貸してもらいに行ったとします。

2人の会話・・・

あなた「山田、ちょっと本を貸してよ。」

山田さん「良いよ、どんな本が良い?」

あなた「そうだなぁ、山田の持ってる"本棚"をちょっと見せてもらえるかな?それで気に入ったのがあれば借りて行くよ。」

山田さん「うん、良いよ。」

これをプログラムに表すと、以下のようになります。

さて、あなたにはこの設計の問題点が見えたでしょうか・・・?

このプログラムの問題点は、「配列データの持ち主は誰か」という点を考えると分かりやすいかもしれません。

どういうことかと言いますと、先ほどの例では以下の登場人物(一部例外)が出て来ました。

あなた
山田さん
本棚

これをクラス図で表すと、以下のようになります。

クラス図からも分かるように、本棚は山田さんの所有物であり、あなたではありません。

しかし、プログラム上では、「あなた」が「山田さんの本棚」に対してループ処理を行っていましたね。

これが問題でした。

他人の所有物(=他クラスの要素)に対して

あなた(=自クラス)が

操作を行ってしまうということが、この設計の問題点なのです。

3.Iteratorパターンの具体的な実装

では、これをIteratorパターンを用いて実装するとどうなるか、見て行きましょう。

先ほどは自分で本を1冊1冊探していましたが、こちらでは本の持ち主から渡してもらうようになりました。

本の持ち主は、それを古い順に渡したり、新しい順に渡したり、ランダムに渡したり、渡したく無いものを渡さなかったりすることが出来ます。

これをクラス図で表すと、以下のようになります。

Iteratorパターンを使うと、Meクラス(あなた)はBookShelf(本棚)の存在を知らずとも、Book(本)に対して1つ1つアクセスを行うことが出来ます。

見事にこの本棚を、横暴なジャイアニズムから解放した訳です。

また逆に言えば、データの持ち主であるBookOwnerは、外部のクラスに対して、BookShelfというデータの集合の存在を隠ぺいすることが出来るのです。

データの隠ぺい、カプセル化、というのはオブジェクト指向プログラミングを勉強する上で必ず出てくる言葉ですね。

4.つまりIteratorパターンとは

あるデータの集合からの

今回は本棚としました。

※「配列」という言葉を使わなかったのは、データの集合が常に単純な配列とは限らない(二次元配列かもしれないし、もっとランダム性の高い集合かもしれない)からです。

データの取り出し方を

配列の昇順/降順、データの名前順、日付順、アクセスのあった順、お気に入り順など、色々ありますね。

そのデータの集合を保有しているクラスに

山田さんのことです。

決めさせるためのものである。

おわかり頂けたでしょうか?

いかがでしたか?

構成が単純なので、よくデザインパターンの題材として挙げられるIteratorパターンですが、単純過ぎるが故に、そのメリットや目的がいまいち見えにくいものでもありました。

ですので、「なぜこのパターンを使うのか?」という点にフォーカスを当てて説明をさせて頂きました。

もし楽しんで頂けたのなら、嬉しいですね。

関連リンク

1