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

Ala*_*lan 5 c++ modularity

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

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

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

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

UPDATE

对不起,似乎我的标题是不正常的,重新版本的版本是:如何将模块分成多个.h.cpp文件(不是一个)?

Pét*_*rök 6

如果A和B是相互依赖的,则不能单独部署它们中的任何一个.因此,您实际上只有一个模块,而不是两个模块.(可以重构您模块虽然提取共同的东西到第三模块C,从而使A和B都依赖于C,但不在彼此之上.)

精心设计的项目不应包含循环模块依赖性.这可以保证模块之间始终存在合理的构建顺序.

更新

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

基本原理非常类似于模块级别:避免循环依赖和重复定义.@Felix已经提到了必要的工具:前向声明和包括警卫.我还可以通过@ kotlinski对Larman书籍的推荐来更深入地理解这个主题.

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

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


Fel*_*man 5

一般而言,具有两个相互依赖的模块是设计气味.你也可以

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

2)将一个公共子集提取到I中,使A和B依赖于I而不是彼此.

更新

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

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

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