什么是全球国家?它们如何影响可测试性以及如何避免它们?

时间:2011-01-19 11:34:37

标签: c++ unit-testing dependency-injection global-variables

列出全局变量,单例对象等各种全局状态,

我读到它们会影响代码的可测试性。您能解释一下有助于提高代码可测试性的全局状态替代方案吗?

3 个答案:

答案 0 :(得分:4)

从可测试性的角度来看,全局变量和单例非常相似,因此它们不必单独处理。良好的OO设计应该像乐高积木一样,以便创建最终的系统。全局变量的主要问题是你失去了隔离。当您使用全局变量或单例访问协作者时,这些类不再是您可以轻松获取和重组的单独块,可以单独使用或在另一个项目中重用。当你拿一些依赖于全局变量的类时,用它拖动设计的其余部分。在测试中,这会产生问题,因为您必须采取额外步骤来切断从类到协作者的连接,以便您可以单独测试它。 (我在我的博客上写过more about this。)

解决问题的一个很好的解决方案是从外部提供类依赖项。您只需介绍某种机制(可能是一个简单的类),它将采用所有孤立的砖块并将它们连接到构成应用程序的对象图形中。这就是控制和依赖注入的反转的全部内容。

答案 1 :(得分:2)

答案 2 :(得分:1)

没有各种全球状态。要么某种东西是全球状态,要么不是。 Singleton反模式只是消除了各种初始化问题,但它与全局变量相同。

如何避免全球状态?创建一些本地状态并传递一个引用或指针。在绝大多数事件中,全球状态是不必要的。 必要全局状态的一些实例,比如堆,但它们非常罕见,如果你需要问,那么你几乎肯定不知道什么时候它是正确的。