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

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

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

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

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

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

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