メモ化

関数の呼び出し結果をキャッシュして、再計算を防ぐテクニック。

簡単な例は、イミュータブルなインスタンスの生成をキャッシュするケースだろう。

class SomeEntity
  def initialize(date_from, date_to)
    @date_from = date_from
    @date_to = date_to
  end

  private

  def date_range
    # @date_range = @date_range || DateRange.new(@date_from, @date_to)
    # と同じ意味
    # 初回は nil || DateRange.new(@date_from, @date_to) になり
    # nilはfalseとなるのでインスタンス生成が行われる
    @date_range ||= DateRange.new(@date_from, @date_to)
  end
end

引数に対応してキャッシュを行いたい場合は、以下のようにすれば良い。

class SomeEntity
  def calc(a, b, c)
    @calc ||= []
    @calc[a] ||= []
    @calc[a][b] ||= []
    return @calc[a][b][c] if @calc[a][b][c]

    result = ... # 計算処理
    @calc[a][b][c] = result
  end
end