一般来说,创建可以从多个方法访问的实例变量或创建一个简单地作为参数传递给这些方法的实例变量的最佳实践和优缺点是什么。在功能上它们是等价的,因为方法仍然能够使用变量完成工作。虽然我可以看到一个好处,如果您正在更新变量并希望返回更新的值,但在我的具体情况下,变量永远不会更新,只能由每种方法读取以决定如何操作。
要明确的示例代码:
class Test
@foo = "something"
def self.a
if @foo == "something"
puts "do #{@foo}"
end
end
a()
end
VS
class Test
foo = "something"
def self.a(foo)
if foo == "something"
puts "do #{foo}"
end
end
a(foo)
end
答案 0 :(得分:2)
我不传递实例变量。它们是实例的状态值。
将它们视为特定物体的DNA的一部分,因此它们将始终成为使物体成为现实的一部分。如果我调用该对象的方法,它将知道如何访问自己的DNA并在内部执行,而不是通过传入的某个参数。
如果我想对对象应用异物,那么我将不得不通过参数传递它。
答案 1 :(得分:1)
正如您所提到的,这是关于代码的非功能性问题。考虑到这一点......
很难给出明确的规则,因为它完全取决于背景。变量是否设置过一次并被遗忘或不断更新?有多少方法共享同一个变量?如何使用代码?
根据我的经验,驱动对象行为但很少(如果有的话)修改的变量在initialize方法中设置,或者给予将级联行为的方法。库和叶子方法往往会传入变量,因为很可能有人会想要单独调用它。
我建议你首先传递所有内容,然后重构,如果你注意到在整个类中传递相同的变量。
答案 2 :(得分:0)
如果我需要一个在实例级别作用域的变量,我使用一个在initialize方法中设置的实例变量。
如果我需要一个在方法级别作用域的变量(即,从一个方法传递到另一个方法的值),我在方法级别创建变量。
所以你的问题的答案是“我的变量什么时候应该在范围内”,如果没有看到你的所有代码并知道你打算用它做什么,我就无法回答这个问题。
如果你的对象行为应该在初始化阶段静态设置,我会使用一个实例变量。