1

モジュール内のメソッドの結果をメモ化する場合、それは悪い習慣と見なされますか?

Railsヘルパーがあると想像してみてください。

module FooHelper
  def values_for_thingie
    if some_condition && that_other_condition
      { a: "foo", b: "bar" }
    else
      { a: "bar", b: "baz" }
    end
  end
end

Railsビューがこのヘルパーメソッドを複数回呼び出すと仮定しましょう..1つは「a」の値を取得し、もう1つは「b」の値を取得します...some_conditionが何かを行うメソッドであると仮定しましょう非常に複雑なので、それが複数回呼び出されることは望ましくありません...

これは、次の方法で解決できます。

module FooHelper
  def values_for_thingie
    @values_for_thingie ||= \
      if some_condition && that_other_condition
        { a: "foo", b: "bar" }
      else
        { a: "bar", b: "baz" }
      end
  end
end

ただし、このインスタンス変数はFooHelperのインスタンスとは何の関係もないため、これがどのように感じられるかは気になりません。実際にはその制御下にありません。そのため、これは良い解決策ではないようです。

4

2 に答える 2

1

インスタンス変数はモジュールには存在しませんが、モジュールが含まれているクラスのインスタンスに存在します。

あなたの例@values_for_thingieでは FooHelper で定義されていますが、 ActionView インスタンスに存在します。

したがって、values_for_thingie の結果がリクエスト間で変化しなければならない場合、それは正しく行われています。

ただし、ケースで実行に時間がかかるメソッドのみをメモすることを検討する必要がありますsome_condition

于 2012-12-13T22:25:07.063 に答える
1

条件がインスタンス全体で一定である場合は、おそらくクラス/モジュール メソッドである必要があります。次に、メモ化に使用されるインスタンス変数は、そのクラス/メソッドのインスタンス変数になります。それは何も悪いことではありません。または、インスタンス メソッドとして保持し、クラス変数をメモ化に使用することもできます。

于 2012-12-13T19:51:40.647 に答える