銀行員からのRailsエンジニア

銀行員からのRailsエンジニア

銀行員から転身したサービス作りが大好きなRailsエンジニアのブログです。個人で開発したサービスをいくつか運営しており、今も新しいサービスを開発しています。転職して日々感じていること、個人開発サービス運営のことなどを等身大で書いていきます。

当ブログではアフィリエイト広告を利用しています

【Rubyによるデザインパターンまとめ5】イテレータパターン

コードの品質向上のため、Rubyデザインパターンを解説した名著である Rubyによるデザインパターン で紹介されているデザインパターンを1つずつまとめており、今回が第5弾です。(毎週1つが目標です!)

前回の記事(Compositeパターンのまとめ)はこちらです。
ysk-pro.hatenablog.com

この本で紹介されているサンプルコードをそのまま使うのは面白くないので、オリジナルのコードで説明しています。

今回は イテレータIterator)パターン についてまとめました。

f:id:ysk_pro:20191124121757p:plain

イテレータパターンとは

一言で言うと、オブジェクトの集まりがあった時に、そのオブジェクト1つずつに順番にアクセスする方法を提供するデザインパターンです。

GoFは、以下のように説明しています。

集約オブジェクトがもとにある内部表現を公開せずに、その要素に順にアクセスする方法を提供する

GoFとは、ギャング オブ フォーの略でデザインパターンを広めた「オブジェクト指向における再利用のためのデザインパターン」の4人の著者のことです)

イテレータは内部イテレータと外部イテレータの2つに大別できます。

  • 内部イテレータ繰り返しの制御を自分で書く必要がなくイテレータ自身が制御するもの。コードブロックベースのイテレータで、eachメソッドが内部イテレータである。メリットはシンプルに記載できること
  • 外部イテレータ繰り返しの制御自分で書く必要があるもの。メリットは単純な繰り返し以外の制御をすることができること

サンプルコード

配列で与えられたデザインパターンを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によるデザインパターン の中では、様々なサンプルコードを用いて説明されており、さらに使用する際の注意点についても言及されていたので、ご興味ある方は是非合わせてご覧ください。

Rubyによるデザインパターン

Rubyによるデザインパターン

次回は、コマンドパターンをまとめます。

来週も頑張ります!

(追記)
コマンドパターンについてまとめました!
是非合わせてご覧ください。
ysk-pro.hatenablog.com