如果我想在模块中记住方法的结果,这被认为是不好的做法吗?
想象一下我有一个铁轨助手:
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的实例无关......它实际上并不在它的控制之下。因此,似乎这不是一个好的解决方案。
答案 0 :(得分:1)
如果条件在实例之间是恒定的,那么它应该是类/模块方法。然后,用于memoization的实例变量将是该类/方法的实例变量。没有错。或者,您也可以将其保留为实例方法,并使用类变量进行记忆。
答案 1 :(得分:1)
您的实例变量不在您的模块中,但在该类的实例中包含该模块。
在您的示例中,@values_for_thingie
在FooHelper中定义,但将存在于ActionView实例中。
因此,如果values_for_thingie的结果必须在请求之间发生变化,那么您就是这样做的。
但是,您应该考虑仅记住在您的案例中运行需要一些时间的方法some_condition