背景
Iteratorパターンって日本語では「繰り返す」という意味ですが、
それだけなら、for文とかで良いんじゃね?
デザインパターン使う意味あるの?っていうのを具体例を使って考えてみる。
参考文献
Iteratorパターンのモチベーション
-
内部構造・実装を隠蔽したい
内部の構造や実装方法は良いから、要素にアクセスしたいときに、
実装と切り離しておくことで、実装部分を修正したとしても、他の部品の修正が少なく済むことが狙い。 -
要素に対して、複数の走査(スキャン)方法をサポートしたい(かもしれない)。
要素に対して、例えば名前順でアクセスしたいか、それともID順でアクセスしたいかなど変わってくるときなど。
逆にいうと、これ以外のときには使わない方が良いと思う。だって分かりにくくなるから!
ただfor文で回すだけのほうが圧倒的に読みやすいから。
クラス例
今回例にしたのは、スラムダンクの安西先生が選手名簿を使って、
身長の低い順に名前を表示したい、バスケ経験年数順に名前を表示したい、
っていうときを例に挙げました。
パターン適用前
安西先生は湘北選手名簿を直接見て、選手の情報を取得しています。
パターン適用後
Iteratorパターンを適用すると、安西先生は名簿を直接参照していないので、
たとえば名簿の形式が変わったとしても、安西先生はやることを変える必要はない。
※実装部分を入れ替える必要はある。
あとは、身長順に選手を見たいときと、
バスケ経験が長い順に選手を見たいときなど、
どう取り出したいかが変わる場合も、安西先生は実装部分に依存していないので変更する必要はない。
まとめ
上記のように、繰り返して何かをしたい場合に、実装部分を切り離すためのパターンとして
Iteratorパターンがあることは理解できた。
デザインパターンの中でも理解しやすいパターンだと思う。
一方で、乱用してしまうとクラス数は増えて分かりにくくなるので、
ほんとにモチベーションに合致するケースでなければ使わない方が良いのでは?と思ってしまった。
具体的には、「リスト構造」そのものが可変点として挙がっている場合や、
走査方法を複数選択可能・もしくは可変点である場合には、
使うか検討しても良いかもしれない。
みなさま、Iteratorパターンの上手い適用例を知っていたらコメントくれると助かります。
[2023/02/06] 実装例は途中まで作ったので、いつか挙げます。