根据Reek的说法,创建类变量被认为是“代码气味”。这背后的解释是什么?
问问题
2647 次
2 回答
11
正如你可以在他们关于类变量的文档中找到的那样:
类变量构成全局运行时状态的一部分,因此系统的一部分很容易意外或无意地依赖于系统的另一部分。因此,系统变得更容易出现问题,在此处更改某些内容会破坏那里的某些内容。特别是,类变量会使设置测试变得困难(因为测试的上下文包括所有全局状态)。
本质上,它是全局状态的一种表现,几乎普遍认为是邪恶的,因为它使测试更加困难,并导致类/程序结构更加脆弱。
这个 Stack Overflow 问题也可能值得一读,它显示了类变量的主要问题:如果任何类从您的类继承并修改了类变量,则该变量的每个实例都会更改,甚至来自父级!可以理解,这为您提供了一种轻松射击自己的方法,因此除非您非常小心,否则最好避免它们。
将类变量与类实例变量进行比较也是值得的。这个问题有几个很好的例子来说明使用差异,但本质上类变量是共享的,而类实例变量是不共享的。因此,为避免不必要的副作用,类实例变量几乎总是您想要的。
于 2016-11-26T14:00:21.250 回答
2
简而言之,这是:
class Shape
@@sides = 0
def self.sides
@@sides
end
end
class Pentagon < Shape
@@sides = 5
end
puts Shape.sides # oops ... prints 5
于 2019-10-24T17:56:00.317 回答