5

我只能处理最简单的情况,即只有 2 个模块AB

A依赖于B,因此我将B构建为库并将B的头文件包含在A中,并且在构建A时也链接到B库。

当AB相互依赖时,这将不起作用,当模块数量增加时更糟..

那么在中进行模块化开发的一般方式是c/c++什么?

更新

对不起,似乎我的标题不准确,改写的版本是:我怎样才能将一个模块分成许多文件(.h.cpp不是一个文件)?

4

4 回答 4

6

如果 A 和 B 相互依赖,则不能单独部署它们中的任何一个。因此,您实际上只有一个模块,而不是两个。(您可以重构您的模块以将通用内容提取到第三个模块 C 中,从而使 A 和 B 都依赖于 C 但不相互依赖。)

一个设计良好的项目不应包含循环模块依赖项。这保证了它的模块之间总是有一个健全的构建顺序。

更新

如何将一个模块分成许多 .h 和 .cpp 文件(不是一个)?

基本原则与模块级别的非常相似:避免循环依赖和重复定义。@Felix 已经提到了这方面的基本工具:前向声明和包含守卫。我还可以支持@kotlinski 对拉曼书的推荐,以更深入地了解该主题。

学习好的设计需要实践,所以如果您的第一种方法看起来不完美,请不要放弃 :-) 在 C++ 中,一个特别的痛苦是更改后过度重新编译。为了尽量减少这种情况,请努力确保您最依赖的事物(类、标题)是变化最少的事物。即依赖于接口(抽象类),而不是具体的实现。

此外,努力保持逻辑分区(类/组件)和物理分区(头文件/cpp 文件)之间的健康关系。典型的方法是将每个类定义放到一个单独的头文件中,并将其实现(如果适用)放到一个单独的 cpp 文件中。但是,您可能更喜欢在单个标题中定义紧密耦合的类(组件),以强调它们的逻辑关系。

于 2010-08-23T14:14:01.877 回答
5

一般来说,拥有两个相互依赖的模块是一种设计味道。你可以

1) 将模块合并到一个新的 C 中,或

2) 将一个公共子集提取到 I 中,使 A 和 B 依赖于 I 但不相互依赖。

更新

使用前向声明和 #pragma once 或 #include/#ifndef 保护:

我什么时候可以使用前向声明?

我应该在标题中使用#include 吗?

于 2010-08-23T14:17:52.663 回答
4

解决方案是确保您的模块形成一个有向无环图...即,如果 A 依赖于 B,请确保 B 不依赖于 A。这需要大量的纪律,但从长远来看是值得的。

如果你对这些东西感兴趣,Large Scale C++ Software Design是一本不错的读物。

于 2010-08-23T14:18:25.847 回答
0

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

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

替代文字

于 2010-08-23T14:44:08.087 回答