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

Why is using a class variable in Ruby considered a 'code smell'?

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


正如您可以在他们关于类变量的文档中找到的那样:

Class variables form part of the global runtime state, and as such make it easy for one part of the system to accidentally or inadvertently depend on another part of the system. So the system becomes more prone to problems where changing something over here breaks something over there. In particular, class variables can make it hard to set up tests (because the context of the test includes all global state).

从本质上讲,它是全球状态的一种表现,这几乎被普遍认为是邪恶的,因为它使测试更加困难,并导致更脆弱的类/程序结构。

这个堆栈溢出问题可能也值得一读,它显示了类变量的主要问题:如果任何类继承自您的类并修改了类变量,那么该变量的每个实例都会发生变化,甚至是父类的!这可以理解,给了你一个简单的方式来射自己的脚,所以最好避免他们,除非你非常小心。

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