如何在C/C++中进行模块化开发?

5
我只能处理最简单的情况,当只有两个模块AB时。 A依赖于B,所以我将B构建为库,并在A中包含B的头文件,在构建A时也链接到B库。
AB相互依赖时,甚至更糟的是当模块数量增加时,这种方法就行不通了。
那么在中进行模块化开发的一般方法是什么?
更新:
抱歉,似乎我的标题不准确,请重新表述:如何将一个模块分成许多和文件(不是单个文件)?

可能标题不准确 :( - dzen
如果你有很多相互依赖的文件,那就意味着开发不够模块化。 - Pascal Cuoq
定义“相互依存”。您应该能够为A和B构建目标文件/库,但是如果没有两者,您将无法构建可执行文件。 - Oliver Charlesworth
4个回答

6
如果A和B是相互依赖的,那么你不能单独部署它们中的任何一个。因此,你实际上只有一个模块,而不是两个。(你可以重构你的模块,将共同点提取到第三个模块C中,从而使A和B都依赖于C但彼此之间没有依赖关系。)
一个良好设计的项目不应该包含循环模块依赖。这保证了模块之间始终存在合理的构建顺序。
更新
如何将一个模块分成许多.h和.cpp文件(不是一个文件)?
基本原则与模块级别非常相似:避免循环依赖和重复定义。@Felix已经提到了必要的工具:前向声明和包含保护。我也可以赞同@kotlinski的建议,阅读Larman的书籍可以更深入地了解这个主题。
学习良好的设计需要实践,所以如果你的第一种方法看起来并不完美,不要放弃 :-) 在C++中,特别痛苦的是在更改后需要进行过度重新编译。为了最小化这个问题,努力确保你最依赖的东西(类、头文件)是最不经常更改的。也就是说,依赖于接口(抽象类),而不是具体实现。
此外,努力保持逻辑分区(类/组件)与物理分区(头/cpp文件)之间的健康关系。典型的方法是将每个类定义放入单独的头文件中,将其实现(如果适用)放入单独的cpp文件中。但是,您可能更喜欢在一个头文件中定义紧密耦合的类(组件),以强调它们的逻辑关系。

抱歉,我的标题不准确,重新表述一下:如何将一个模块分成多个“.h”和“.cpp”文件(而不是一个文件)? - Alan

5
通常来说,拥有两个相互依赖的模块是一种设计上的不良迹象。您可以选择:
1)将这两个模块合并为一个新的C模块;或者
2)提取出一个共同子集为I,让A和B依赖于I但彼此不依赖。
更新
使用前向声明、#pragma once或#include / #ifndef保护:
何时可以使用前向声明?
我应该在头文件中使用#include吗?

基本上就是这样。你处于这种情况说明你做错了什么。 - Puppy

4
解决方法是确保您的模块形成一个有向无环图...即,如果A依赖于B,则确保B不依赖于A。这需要很多纪律性,但从长远来看是值得的。
如果您对此感兴趣,大规模C++软件设计是一本不错的读物。

0

设计模式,例如模型-视图-控制器 - MVC。

模型-视图-控制器(MVC)是一种软件架构1,目前被认为是软件工程中使用的一种架构模式。该模式将“领域逻辑”(用户的应用程序逻辑)与输入和呈现(UI)隔离开来,允许独立开发、测试和维护每个部分。

alt text


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接