具有许多类(C++)的程序中的依赖性反转
dependency inversion in programs with many classes (C++)
我正在尝试将一些旧的C++代码转换为更可测试的形式。为了符合依赖反转原则(DIP),我在许多情况下都会使用依赖注入。
我的问题是如何最好地实例化具体的类。在这段代码中有大约100个我自己的类。Robert Martin在他的著作《清洁建筑》中认为,这些类是不稳定的,应该在工厂中实例化。然而(见本书第90页),这将需要每个类4个类,我想实例化。这意味着要上400节课。
为了便于说明,假设旧代码有一个类a(实例化并使用类A1到A5)、B(B1到B10)和C(类C1到C3)。
在新代码中,您建议如何以及在哪里实例化所有具体类?我特别想听听那些在大型C++程序中处理过这类问题的人的意见。谢谢
Bruce
在应用依赖反转原则时,我们将协作组件的图(也称为对象图)的构建延迟到最后一个负责任的时刻。由于我们希望最小化组件甚至单个库之间的耦合,因此我们将这些对象图的构建转移到系统中最易失的部分。这是启动组件。启动程序集中负责组成和构造这些对象图的部分通常被称为组成根。
在新代码中,您建议如何以及在哪里实例化所有具体类?
您应该在CompositionRoot中构造所有具体的组件(包含应用程序有趣行为的类)。
在一些托管环境中,如Java和.NET,API的可用性使我们能够在运行时查询应用程序的元数据(也称为反射),允许在编译时声明抽象和实现之间的关系,并允许在运行时使用通常称为DI Containers的可重用库动态构建组件。
C++可能没有在运行时查询元数据的能力。在这样的环境中,您使用Pure DI,这简单地意味着:您在Composition Root中手动new
您的类。
请注意,在我的描述中,我没有使用";工厂";。需要指定返回其他应用程序抽象的工厂抽象不应该是规范,而应该是例外。您可能会将CompositionRoot视为一个大工厂,但应用程序中没有任何内容依赖于CompositionRoot。另一方面,复合根取决于一切。
因此,您的应用程序类几乎不需要依赖于工厂抽象。如果一个类需要不同的服务,它应该直接将其注入到其构造函数中,而不是注入一个可以解析该服务的工厂。
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何通过cpp程序运行shell脚本
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- IPC使用多个管道和分支进程来运行Python程序
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 基于boost的程序的静态链接——zlib问题
- 程序崩溃并显示"std::out_of_range"错误
- 在C应用程序中运行C++(带有STL)函数
- Visual Studio:C++\CLI 包装程序集路径依赖性问题
- 具有许多类(C++)的程序中的依赖性反转