コードの品質向上のため、Rubyでデザインパターンを解説した名著である Rubyによるデザインパターン で紹介されているデザインパターンを1つずつまとめており、今回が第5弾です。(毎週1つが目標です!)
前回の記事(Compositeパターンのまとめ)はこちらです。
ysk-pro.hatenablog.com
この本で紹介されているサンプルコードをそのまま使うのは面白くないので、オリジナルのコードで説明しています。
今回は イテレータ(Iterator)パターン についてまとめました。
イテレータパターンとは
一言で言うと、オブジェクトの集まりがあった時に、そのオブジェクト1つずつに順番にアクセスする方法を提供するデザインパターンです。
GoFは、以下のように説明しています。
集約オブジェクトがもとにある内部表現を公開せずに、その要素に順にアクセスする方法を提供する
(GoFとは、ギャング オブ フォーの略でデザインパターンを広めた「オブジェクト指向における再利用のためのデザインパターン」の4人の著者のことです)
サンプルコード
配列で与えられたデザインパターンを1つずつ出力する、簡単なプログラムを考えてみます。
内部イテレータでの実装
design_patterns = ['template_method', 'strategy', 'observer'] design_patterns.each { |design_pattern| puts "#{design_pattern} is one of design patterns" }
eachメソッドをシンプルに使うだけなので簡単です!
実行結果はこのようになります。
template_method is one of design patterns strategy is one of design patterns observer is one of design patterns
外部イテレータでの実装
class ArrayIterator def initialize(array) @array = array @index = 0 end def has_next? # 次の要素があるかどうか @index < @array.length end def next_item # 次の要素を返して、indexを1進める value = @array[@index] @index += 1 value end end design_patterns = ['template_method', 'strategy', 'observer'] i = ArrayIterator.new(design_patterns) while i.has_next? puts "#{i.next_item} is one of design patterns" end
外部イテレータでは、ArrayIteratorクラスのインスタンスを使って、繰り返しの制御を自分で行なっていることが分かると思います。
実行結果は、内部イテレータと同じです。
おわりに
ここまで読んでいただきありがとうございます。
Rubyにはeachメソッドがあるので、イテレータパターンはとても簡単に実装できますね。
Rubyによるデザインパターン の中では、様々なサンプルコードを用いて説明されており、さらに使用する際の注意点についても言及されていたので、ご興味ある方は是非合わせてご覧ください。
- 作者:Russ Olsen,ラス・オルセン
- 出版社/メーカー: ピアソン桐原
- 発売日: 2009/04/01
- メディア: 単行本
次回は、コマンドパターンをまとめます。
来週も頑張ります!
(追記)
コマンドパターンについてまとめました!
是非合わせてご覧ください。
ysk-pro.hatenablog.com