划分C++;图书馆应用 我的C++项目越来越大。我们现在也开始使用cmake进行构建。我想将应用程序划分为库,以便它们可以链接以进行测试、准备应用程序包等。现在,我将代码划分为库,如下所示: 核心 桂 实用程序(由核心和其他组件使用) io(使用核心类的打印函数进行xml解析/输出) 测试(单元测试) 模拟器(测试核心)

划分C++;图书馆应用 我的C++项目越来越大。我们现在也开始使用cmake进行构建。我想将应用程序划分为库,以便它们可以链接以进行测试、准备应用程序包等。现在,我将代码划分为库,如下所示: 核心 桂 实用程序(由核心和其他组件使用) io(使用核心类的打印函数进行xml解析/输出) 测试(单元测试) 模拟器(测试核心),c++,C++,另一种方法是根据目录结构进行划分——每个目录对应一个库。但根据我过去的经验,它会导致太多的库,然后在链接过程中很难处理库依赖关系 在这方面有什么最佳实践吗?我喜欢从只有单向箭头的包图开始 您的列表看起来是一个很好的开始。坐下来拿一张纸,决定您的库结构 库应设计为一组标高 级别A(基础)上的库应仅依赖于系统库,并且仅当它必须依赖于级别A上的库时 级别B上的库可以依赖级别A上的库和系统库,并且仅当它必须依赖级别B上的库时 等 每个库都应该在其特定级别上表示一个完整的作业。较低层次的事物通常有较

另一种方法是根据目录结构进行划分——每个目录对应一个库。但根据我过去的经验,它会导致太多的库,然后在链接过程中很难处理库依赖关系


在这方面有什么最佳实践吗?

我喜欢从只有单向箭头的包图开始


您的列表看起来是一个很好的开始。

坐下来拿一张纸,决定您的库结构

库应设计为一组标高

  • 级别A(基础)上的库应仅依赖于系统库,并且仅当它必须依赖于级别A上的库时
  • 级别B上的库可以依赖级别A上的库和系统库,并且仅当它必须依赖级别B上的库时
每个库都应该在其特定级别上表示一个完整的作业。较低层次的事物通常有较小的工作,但工作很多。更高级别的库应该重新呈现一个完整的任务。ie没有用于windows对象的库和用于事件的库。在这个级别上,这里的工作是处理与窗口的所有交互(这包括它如何与事件交互)

你似乎已经确定了一些合理的功能组。唯一一个看到有点可疑的是io。如果您真的有一些提供真正功能的通用IO例程,那就很好了。但是如果只是将IO分组为一组不同的对象,那么我会放弃它(这取决于使用情况)

因此,下一步是确定它们之间的关系

至于使用目录结构。通常,一个目录中的所有内容都将出现在同一个库中,但这并不排除其他目录也存在的可能性。我会避免将一半的类放在libA的目录中,而将另一半的类放在libB等中。

似乎是合理的

我会询问您的
单元测试
库应该做什么。
给出了一组构建libA、libB、libC的“项目”。。。我希望看到一些匹配的项目testA testB testC(它们是构建库还是可执行文件取决于构建的测试是独立运行还是加载到某个测试运行程序中)


我对“实用程序”库也有点警惕。从长远来看,它们似乎有一种令人惊讶的能力,能引起疼痛和痛苦。例如,可能您的IO库除了实用程序库之外没有其他依赖项。有一天,您希望在另一个平台上的另一个项目中重用IO库。唯一的问题是,您现在还必须移植所有的实用程序库(90%的IO不使用),或者分离IO实际依赖的10%的实用程序库。有时,最好是以一些代码复制为代价,使图书馆更无依赖性。

< P>您应该阅读John Lakos的大型C++软件设计。p> 在你开始工作之前,你可能无法阅读它,但你应该把这本书放在你的清单上

否则,马丁·约克的建议是正确的


不过还有一件事,我建议您选择一个像doxygen这样的工具,它可以为您提供代码库的依赖关系图。如果您费心进行这种类型的重构,您应该摆脱库之间的循环依赖关系。Lakos描述了许多减少依赖性的方法,有些是显而易见的,有些则不那么明显。

说到io,我指的是解析和输出XML(或其他格式)等。io将使用core中类的工厂和打印功能。我不是说这是错的。你必须看一下密码,做出判断。如果工厂和打印功能足够强大,足以保证lib罚款。我同意你所说的“实用程序”库。但希望您给出的示例不会有太大问题,因为我们已经使用visual studio编译器在windows上构建,使用g++在linux上构建。我发现Lakos的书过于冗长。在这本书中,很难区分干净、有用和非直观的提示与不干净、无用和明显的提示。我很想知道是否有人摘录了这本书的好部分。哦,是的,它相当冗长!到了乏味的地步。另一方面,那里有一些真正的珍宝,不,我不知道有哪个更简洁的版本(