メモ化
関数の呼び出し結果をキャッシュして、再計算を防ぐテクニック。
簡単な例は、イミュータブルなインスタンスの生成をキャッシュするケースだろう。
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