4

可能重复:
C++ 代码依赖/调用图“查看器”?

我正在开发一个庞大的 C++ 代码库,目前我遇到了模块化代码的问题。我必须将我的代码分成单独的独立模块。

我能想到的一种方法是生成依赖图,然后进行更高级别的分类。另一种方法是从入口点(某个函数abc())开始并生成一个函数调用树,其每个节点都将包含该函数所在文件的名称。此后,我可以使用一些脚本将这些功能提取到单独的模块中。

我的问题是,有什么工具可以帮助我完成这项任务吗?以前有没有人遇到过这样的问题。或者你能建议任何方法来实现同样的目标吗?

4

5 回答 5

5

模块化的第一级——我希望你已经做到了——是在中构造你的代码。如果你的代码只是函数的集合——例如,C 加上一些语法糖——那么是时候重写你的代码了,因为再多的依赖图构建也无法将你从维护地狱中解救出来。

如果你类,模块化应该是找到紧密合作的类(如CustomerOrderInvoice),并将它们与仅与它们松散耦合的类(如EmployerFacility)分开。然后从那里拿走。

模块化代码首先需要思考。没有自动程序可以替代它。实际上,从您所写的内容来看,我担心任何自动化过程都会使事情变得更糟,因为显然在这个项目上投入的思想太少了。即,您编写了 100 万行代码而没有考虑模块化,现在您希望模块化发生,但实际上仍然没有考虑它。你正走向史诗般的失败。

于 2012-06-04T11:19:24.490 回答
4

要获得一些概述, doxygen可能会有所帮助。但是您必须使用 doxyfile 设置来生成依赖关系图,如果您的代码库很大,您应该从生成的方法中禁用动态内容。Doxygen 可以使用graphviz创建包含、继承、调用和调用者图。

这是简单的例子,但它也适用于更大的例子。但是 doxygen 只会给你一个概述,没有重构能力。

于 2012-06-04T13:12:19.420 回答
1

听起来您正在寻找重构工具。试着看看这个问题的答案:有一个有效的 C++ 重构工具吗?

于 2012-06-04T12:26:43.240 回答
1

我经常使用“了解 C/C++”来调查这些依赖关系。

如果代码库非常庞大并且您从头开始模块化,您可能需要查看其他一些工具,例如:

  • Cytoscape(可以获取“了解 C/C++”的输出以可视化依赖关系
  • 莱蒂克斯
于 2012-06-04T11:25:26.233 回答
0

一种方法会有点长,但您可以做的是删除一个方法并编译以查找依赖关系,然后将颓废组合到一个组件中。虽然这不能完全解决您的问题,但它是一种开始的方法。

于 2012-06-04T14:02:00.057 回答