可能重复:
C++ 代码依赖/调用图“查看器”?
我正在开发一个庞大的 C++ 代码库,目前我遇到了模块化代码的问题。我必须将我的代码分成单独的独立模块。
我能想到的一种方法是生成依赖图,然后进行更高级别的分类。另一种方法是从入口点(某个函数abc())开始并生成一个函数调用树,其每个节点都将包含该函数所在文件的名称。此后,我可以使用一些脚本将这些功能提取到单独的模块中。
我的问题是,有什么工具可以帮助我完成这项任务吗?以前有没有人遇到过这样的问题。或者你能建议任何方法来实现同样的目标吗?
可能重复:
C++ 代码依赖/调用图“查看器”?
我正在开发一个庞大的 C++ 代码库,目前我遇到了模块化代码的问题。我必须将我的代码分成单独的独立模块。
我能想到的一种方法是生成依赖图,然后进行更高级别的分类。另一种方法是从入口点(某个函数abc())开始并生成一个函数调用树,其每个节点都将包含该函数所在文件的名称。此后,我可以使用一些脚本将这些功能提取到单独的模块中。
我的问题是,有什么工具可以帮助我完成这项任务吗?以前有没有人遇到过这样的问题。或者你能建议任何方法来实现同样的目标吗?
模块化的第一级——我希望你已经做到了——是在类中构造你的代码。如果你的代码只是函数的集合——例如,C 加上一些语法糖——那么是时候重写你的代码了,因为再多的依赖图构建也无法将你从维护地狱中解救出来。
如果你有类,模块化应该是找到紧密合作的类(如Customer,Order和Invoice),并将它们与仅与它们松散耦合的类(如Employer或Facility)分开。然后从那里拿走。
模块化代码首先需要思考。没有自动程序可以替代它。实际上,从您所写的内容来看,我担心任何自动化过程都会使事情变得更糟,因为显然在这个项目上投入的思想太少了。即,您编写了 100 万行代码而没有考虑模块化,现在您希望模块化发生,但实际上仍然没有考虑它。你正走向史诗般的失败。
要获得一些概述, doxygen可能会有所帮助。但是您必须使用 doxyfile 设置来生成依赖关系图,如果您的代码库很大,您应该从生成的方法中禁用动态内容。Doxygen 可以使用graphviz创建包含、继承、调用和调用者图。
这是简单的例子,但它也适用于更大的例子。但是 doxygen 只会给你一个概述,没有重构能力。
听起来您正在寻找重构工具。试着看看这个问题的答案:有一个有效的 C++ 重构工具吗?
我经常使用“了解 C/C++”来调查这些依赖关系。
如果代码库非常庞大并且您从头开始模块化,您可能需要查看其他一些工具,例如:
一种方法会有点长,但您可以做的是删除一个方法并编译以查找依赖关系,然后将颓废组合到一个组件中。虽然这不能完全解决您的问题,但它是一种开始的方法。