Processingで学ぶ 実践的プログラミング専門課程

第24回 デザインパターン(2) Iterator

この記事を読むのに必要な時間:およそ 4.5 分

導入

Processingがバージョン3.0(2015年8月29日現在3.0b5)となり,IDEのインタフェイスが大きく変更されました。シンプルで使いやすいように感じます。アイコンも洒落た感じになりました。ただ,テキストエディタの挙動がもう少し洗練されていなかったり,機能面で後方互換ではない部分があります。新しいバージョンのProcessingでは,これまでに作成したProcessingのsketchが動かない場合があるということです。ここで学習する範囲では大きな問題はないと考えていますが,記憶にとどめてください。

Processing3についてのダイアログ

画像

閑話休題。今回はGoFによるデザインパターン23種類のうち,おそらく最も用いられているパターン,Iteratorを学習します。1つひとつ,順に要素を取り扱うという,コンピュータの最も得意とする機能を,上手におこなう目的でまとめられたパターンです。

展開

Iterator(イテレータ)

前述したように,IteratorパターンはGoF本に紹介されている23個のパターンの中で,最も身近なデザインパターンです。現在の高級言語を利用する若いプログラマは,Iteratorパターンを使ったクラスを無意識のうちに使っていることでしょう。

Iteratorパターンの目的

iterateは「繰り返される,繰り返す」の意味がある動詞で,これを名詞化したのがIterator,つまり「繰り返されるもの,繰り返すもの」の意味になります。

オブジェクトの集合を取り扱う際,オブジェクトを配列に代入し,添字をインクリメント(一度に1つ増やすこと)することで巡回する方法が最も原理的です連載第9回)⁠

連載第9回で掲載した配列を利用するコード

String names[] = {"Tim Bray",        // 0番目の要素
                  "Brian Kernighan", // 1番目の要素
                  "Jon Bentley",     // 2番目の要素
                  "Karl Fogel"};     // 3番目の要素

for(int i = 0; i < names.length; ++i){
  println(names[i]);
}

Java言語,そしてProcessingではデータの集合に先頭から順にアクセスする手段としてIteratorパターンの使用を推奨しています。上のコード例のように配列を取り扱うfor文は,Iteratorパターンを使用する拡張for文で,次のように書き換えられます。

先のfor文を拡張for文で書き直したところ

for(String v : names){   println(v); }  

上のコード例ではIteratorパターンの存在が隠されています。このコードの裏ではIteratorパターンを利用して配列の要素の先頭から順にアクセスしています。

Iteratorパターンを使うと,データがどんな仕組みで保管されているかは,データを必要とする側のコードで意識しないで済みます。上のコード例で言えば,

  • names[i]として,配列というデータ構造の変数namesの,
    先頭からi番目に納められたString型のデータ」

とアクセスしていたところが,単に

  • String型のデータv

で済みます。Iteratorパターンに従っていることが分かれば,データがどんな仕組みで保管されていようとも,決まったメソッドを呼べば目的のデータにアクセスできるように仕組まれています。これを専門用語を使って言えば「データに順番にアクセスする仕組みを抽象化した」となります。

[Iteratorパターン]
複数のオブジェクトを順に取り扱う機能を抽象化したもの。

Java言語やProcessingでは,配列を始め多くのコレクションクラスでIteratorパターンが適用されており,先ほどの拡張for文のようにシンプルなコードで要素にアクセスできます。

GoFによるIteratorパターンの全体像

ここでは,GoFによるIteratorパターンが,どのようにまとめられているのかを見ていきましょう。

Java言語のクラスライブラリ中で実装されているIteratorパターンは,GoF本に紹介されている各クラスとクラス名,インタフェイス名が異なる部分がありますが,基本的な考え方と構造は同じです。

下図はIteratorパターンを用いたコードのクラス図の一例です。

Iteratorパターンのクラス図

画像

Iteratroパターンでは,ConcreteAggregateクラスに納められたデータの集合をClientクラスが順に取り出して処理することを目的とします。図の一番下にあるDataクラスが,ConcreteAggregateクラスが保持するデータ保管用クラスです。Aggregateという英語は「集合」とか「集団」といった意味があります。Concreteは「具体的な実体」です。

Aggregateインタフェイスのiteratorメソッドは,Iteratorインタフェイスを実装したConcreteIteratorオブジェクトを返します。ConcreteIteratorConcreteAggregateに納められたオブジェクト群にアクセスするコードを持っています。

結局Clientクラスがデータのアクセスに必要とするのは,ConcreteAggregateオブジェクトと,ConcreteIteratorオブジェクトの参照を持つIteratorインタフェイスのオブジェクトです。

[Clientクラスがデータアクセスに必要とする情報]
  • ConcreteAggregateオブジェクトへの参照
  • ConcreteAggregateオブジェクトのiteratorメソッドが返すConcreteIteratorへの参照

著者プロフィール

平田敦(ひらたあつし)

地方都市の公立工業高等学校教諭。趣味はプログラミングと日本の端っこ踏破旅行。やがては結城浩氏のような仕事をしたいと妄想している。

Twitter : @hirata_atsushi

コメント

コメントの記入