在模块中使用实例变量是不好的做法吗?

时间:2012-12-13 19:21:05

标签: ruby

如果我想在模块中记住方法的结果,这被认为是不好的做法吗?

想象一下我有一个铁轨助手:

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视图将多次调用这个帮助器方法..一个用于获取" a"的值,另一个用于获取" b&的值#34; ...让我们假设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的实例无关......它实际上并不在它的控制之下。因此,似乎这不是一个好的解决方案。

2 个答案:

答案 0 :(得分:1)

如果条件在实例之间是恒定的,那么它应该是类/模块方法。然后,用于memoization的实例变量将是该类/方法的实例变量。没有错。或者,您也可以将其保留为实例方法,并使用类变量进行记忆。

答案 1 :(得分:1)

您的实例变量不在您的模块中,但在该类的实例中包含该模块。

在您的示例中,@values_for_thingie在FooHelper中定义,但将存在于ActionView实例中。

因此,如果values_for_thingie的结果必须在请求之间发生变化,那么您就是这样做的。

但是,您应该考虑仅记住在您的案例中运行需要一些时间的方法some_condition