2010-11-23 67 views
4

一般来说,创建一个实例变量的最佳做法和优缺点是可以从多个方法访问或创建一个实例变量,该实例变量只是作为参数传递给这些方法。在功能上它们是等价的,因为方法仍然能够使用变量来完成工作。虽然我可以看到一个好处,如果你正在更新变量,并希望返回更新的值,但在我的具体情况下,变量永远不会更新,只能通过每种方法读取以决定如何操作。哪个更好?创建一个实例变量或在Ruby中传递一个局部变量?

示例代码是明确的:

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 
+4

请注意:在类级别声明`@foo =“something”`将使其成为类对象的实例变量,而不是测试对象。至少,这对我来说是个棘手的问题。 – Jeremy 2010-11-23 00:18:06

回答

1

正如你所说,这是对代码的非功能性的问题。考虑到这一点......

很难给出一个明确的规则,因为它完全取决于上下文。变量是否曾经被设置过并被遗忘过,或者不断更新?多少个方法共享相同的变量?代码将如何使用?

根据我的经验,驱动对象行为但很少(如果有的话)修改的变量在初始化方法中设置,或赋予将级联行为的方法。库和叶子方法往往会传入变量,因为它可能有人会想孤立地调用它。

我建议你先将所有东西都先传递,然后重构,如果你注意到在整个类中传递相同的变量。

0

如果我需要一个范围在实例级别的变量,我使用一个实例变量,在initialize方法中设置。

如果我需要一个范围在方法级别的变量(即,从一个方法传递给另一个方法的值),我在方法级别创建变量。

所以你的问题的答案是“我的变量何时应该在范围内”,如果没有看到你的所有代码并知道你打算如何处理它,我无法真正回答。

如果你的对象行为应该在初始化阶段被静态设置,我会使用一个实例变量。

2

我不传递实例变量。它们是实例的状态值。

将它们看作是该特定对象的DNA的一部分,因此它们将永远是使对象成为它的原因的一部分。如果我调用这个对象的方法,它就已经知道如何访问它自己的DNA,并且会在内部执行它,而不是通过传入某个参数。

如果我想对对象应用某种外来的东西,那么我将不得不通过参数传递它。

相关问题