为什么在Ruby中使用类变量被认为是“代码味道”?

时间:2016-11-26 13:55:03

标签: ruby class-variables class-instance-variables

根据Reek,创建一个类变量被认为是“代码味道”。这背后的解释是什么?

2 个答案:

答案 0 :(得分:9)

正如您在Class Variables的文档中找到的那样:

  

类变量构成了全局运行时状态的一部分,因此系统的一个部分很容易意外地或无意地依赖于系统的另一部分。因此,系统变得更容易出现问题,在这里改变某些东西会破坏那里的东西。特别是,类变量可能使设置测试变得困难(因为测试的上下文包括所有全局状态)。

基本上,它是全局状态的一种表现形式,几乎普遍被认为是evil,因为它使测试更加困难,并导致更脆弱的类/程序结构。

This Stack Overflow question也值得一读,它显示了类变量的主要问题:如果任何类继承自您的类并修改了类变量,该变量的每个实例都会发生变化,甚至来自父母!这可以理解地为你提供一种轻松拍摄自己的方法,所以除非你非常小心,否则最好避免使用它们。

将类变量与类实例变量进行比较也是值得的。 This question有一些很好的例子来说明使用差异,但实质上类变量是共享,而类实例变量是不共享。因此,为了避免不必要的副作用,类实例变量几乎总是你想要的。

答案 1 :(得分:1)

总之,这是

class Shape
  @@sides = 0

  def self.sides
    @@sides
  end
end

class Pentagon < Shape
  @@sides = 5
end

puts Shape.sides  # oops ... prints 5