10

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

4

2 回答 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 回答