根据Reek,创建类变量被认为是一种“代码异味”。这背后的解释是什么?
您可以在类变量的文档中找到以下内容:
类变量是全局运行时状态的一部分,因此易于导致系统的某个部分意外或无意间依赖于系统的另一个部分。这样做会使系统更容易出现问题,例如更改这里的某些内容会破坏那里的某些内容。特别地,类变量可能会使测试变得困难(因为测试的上下文包括所有全局状态)。
从本质上讲,它是全局状态的一种体现,而全局状态几乎普遍被认为是有害的,因为它使测试更加困难,并导致类/程序结构变得更加脆弱。
这个Stack Overflow问题也值得一读,它显示了类变量的主要问题:如果任何类继承自您的类并修改类变量,即使是从父类继承的,每个变量实例都会发生变化!这显然很容易让您自己给自己惹麻烦,因此最好除非您非常小心,否则避免使用它们。
值得将类变量与类实例变量进行比较。 这个问题有一些很好的例子说明了使用差异,但本质上,类变量是共享的,而类实例变量则不共享。因此,为了避免不必要的副作用,几乎总是使用类实例变量更为合适。
class Shape
@@sides = 0
def self.sides
@@sides
end
end
class Pentagon < Shape
@@sides = 5
end
puts Shape.sides # oops ... prints 5