c++ - 什么是全局状态?它们如何影响可测试性以及如何避免它们?

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

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

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

最佳答案

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

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

关于c++ - 什么是全局状态?它们如何影响可测试性以及如何避免它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4734735/

相关文章:

c++ - 在循环 C++ 中使用索引命名变量

android - 如何在多个android设备上运行appium自动化测试用例

java - 通过基准测试中的注释加载应用程序上下文

java - 无法在 Jmockit 中使用通用返回类型模拟接口(interface)

dependency-injection - CaSTLe - 使用构造函数注入(inject)类型工厂注入(inject)组件时,属性注入(inject)无法解析依赖关系

java - 尝试将 JpaRepository 注入(inject) AWS Lambda 时没有合格的 bean

c++ - gcc 4.5.1 vs VC2010 模板部分特化 : which is C++0x conformant?

c++ - 如何从 Qt 应用程序通过 ODBC 连接到 MySQL 数据库?

c++ - 这个迭代器声明有什么问题

java - 为什么 Guice 阻止绑定(bind)到 Provider?