LoginSignup
0
0

More than 1 year has passed since last update.

【GoF】Iteratorパターン例(スラムダンク)

Posted at

背景

Iteratorパターンって日本語では「繰り返す」という意味ですが、
それだけなら、for文とかで良いんじゃね?
デザインパターン使う意味あるの?っていうのを具体例を使って考えてみる。

参考文献

Iteratorパターンのモチベーション

  • 内部構造・実装を隠蔽したい
    内部の構造や実装方法は良いから、要素にアクセスしたいときに、
    実装と切り離しておくことで、実装部分を修正したとしても、他の部品の修正が少なく済むことが狙い。

  • 要素に対して、複数の走査(スキャン)方法をサポートしたい(かもしれない)。
    要素に対して、例えば名前順でアクセスしたいか、それともID順でアクセスしたいかなど変わってくるときなど。

逆にいうと、これ以外のときには使わない方が良いと思う。だって分かりにくくなるから!
ただfor文で回すだけのほうが圧倒的に読みやすいから。

クラス例

今回例にしたのは、スラムダンクの安西先生が選手名簿を使って、
身長の低い順に名前を表示したい、バスケ経験年数順に名前を表示したい、
っていうときを例に挙げました。

パターン適用前

Iteratorパターン-ページ2.drawio.png

安西先生は湘北選手名簿を直接見て、選手の情報を取得しています。

パターン適用後

Iteratorパターン-ページ1.drawio.png

Iteratorパターンを適用すると、安西先生は名簿を直接参照していないので、
たとえば名簿の形式が変わったとしても、安西先生はやることを変える必要はない。
※実装部分を入れ替える必要はある。

あとは、身長順に選手を見たいときと、
バスケ経験が長い順に選手を見たいときなど、
どう取り出したいかが変わる場合も、安西先生は実装部分に依存していないので変更する必要はない。

まとめ

上記のように、繰り返して何かをしたい場合に、実装部分を切り離すためのパターンとして
Iteratorパターンがあることは理解できた。
デザインパターンの中でも理解しやすいパターンだと思う。
一方で、乱用してしまうとクラス数は増えて分かりにくくなるので、
ほんとにモチベーションに合致するケースでなければ使わない方が良いのでは?と思ってしまった。

具体的には、「リスト構造」そのものが可変点として挙がっている場合や、
走査方法を複数選択可能・もしくは可変点である場合には、
使うか検討しても良いかもしれない。

みなさま、Iteratorパターンの上手い適用例を知っていたらコメントくれると助かります。

[2023/02/06] 実装例は途中まで作ったので、いつか挙げます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0