woshidan's loose leaf

ぼんやり勉強しています。

Iteratorパターン

去年一回読み終わってから、もう一回デザパタを読むと決めてたんですよ(忘れてきただけ)。

1つ1つ数え上げる、という見出しがついていたんですが、
集合を扱う抽象クラス(Aggregate)と、
集合の要素を走査する方法を扱う抽象クラス(Iterator)と、
集合の具体的な形を実装したクラス(ConcreteAggregate)と、
集合のクラスの実装に沿って走査方法のメソッドを書いたクラス(ConcreteIterator)がある。

とりあえず、束ね方は何でも良いから、束ねてあったら、 1つずつ右から左に調べたいよね、あるいは、最後とか最初とかの要素を調べるってのは全部やるよね。

じゃあ、その「右から左に」とか「最後とか最初とか」の部分のインタフェースを揃えておいたら、 束ね方の方は変えちゃって良いじゃん! という感じの。

なんていうか、Rubyだと当たり前のように配列はArrayで、
後からいくらでも要素を追加できたり、
どのクラスのオブジェクトでも追加できたりするので、
意識する事ないけど、その理由がこれが使われているからかも。

EnumerbleモジュールをincludeしたArrayやHashなどのクラスあたりが、
このパターンの代表例っぽい感じがします。

EnumerbleモジュールがIteratorにあたって、
EnumerbleモジュールをincludeするArrayがConcreteAggregate.
ArrayやHashといった複数のオブジェクトの容器として振る舞うクラス群をまとめるCollectionっていうクラス群(?)が、 Aggregate.
ConcreteIteratorのクラスはいまいちはっきりしないけど、それぞれのCollectionクラスの#eachの実装あたりでしょうか。

Arrayだと配列の要素が0,1,2...と順に並んでいるけれど、Hashだとkeyが1,2...だったり文字列だったりするので、 次の要素をどう探してくるのか、といった部分は、たしかにそれぞれのCollectionクラスに依存しそうですね。