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

Dou*_*las 9 ruby class-variables class-instance-variables

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

Aur*_*001 10

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

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

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

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

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