Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;函数依赖图_C++_Graph - Fatal编程技术网

C++ C++;函数依赖图

C++ C++;函数依赖图,c++,graph,C++,Graph,可能重复: 我正在研究一个巨大的C++代码库,目前我正面临模块化代码的问题。我必须将我的代码划分为独立的模块 我能想到的一种方法是生成依赖关系图,然后进行更高级别的分类。另一种方法是从一个入口点(一些函数abc())开始,生成一个函数调用树,其每个节点将包含该函数所在文件的名称。此后,我可以使用一些脚本将这些函数提取到单独的模块中 我的问题是,是否有任何工具可以帮助我完成这项任务?以前有人遇到过这样的问题吗。或者你能提出任何方法来达到同样的效果吗?模块化的第一个层次——我希望你已经做到了——是

可能重复:

我正在研究一个巨大的C++代码库,目前我正面临模块化代码的问题。我必须将我的代码划分为独立的模块

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


我的问题是,是否有任何工具可以帮助我完成这项任务?以前有人遇到过这样的问题吗。或者你能提出任何方法来达到同样的效果吗?

模块化的第一个层次——我希望你已经做到了——是在类中构造代码。如果你的代码只是一个函数的集合——例如,C加上一些语法上的suggar——那么是时候重写你的代码了,因为再多的依赖关系图构建也不能让你从维护的地狱中解脱出来

如果您有类,模块化应该是找到紧密协作的类(如
客户
订单
发票
),并将它们与仅与它们紧密耦合的类(如
雇主
设施
)分开。那就从那里开始吧

模块化代码首先需要思考。没有任何自动程序可以替代这一点。事实上,从你写的那一点来看,我担心任何自动化的过程都会让事情变得更糟,因为显然在这个项目上投入的思想太少了。也就是说,你写了100万行代码却没有考虑模块化,现在你希望模块化能够发生,而实际上你还没有考虑它。您将面临epic fail。

我经常使用“了解C/C++”来调查此类依赖关系

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

  • Cytoscape(它可以获取“C/C++理解”的输出以可视化依赖关系
  • 拉提克斯

听起来你在寻找一个重构工具。试着看一下这个问题的答案:

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

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

一个方法会有点长,但你可以做的是删除一个方法并编译以找到依赖项,然后将decadencies分组到一个组件中。虽然这不能完全解决你的问题,但这是一个开始的方法。

定义“巨大”。另外,代码库中是否已经存在某种模块化?@wolfgang:我的代码库中有超过100万行代码和大约30000个文件。目前没有模块化。你可以试试cppredent()它将依赖关系图显示为模块,您可以使用CQLinq筛选您想要在依赖关系图中显示的内容。是的,我的代码已经以类的形式组织,但问题是我的代码库太大,很难找到可以一起工作的类。@scholar:那么我的第二段是正确的。应该是pos可以形成“逻辑组”类。逻辑实际上比函数调用的频率更重要。如果你有一个图形程序,你应该在一个模块中有输入/输出过滤器,在另一个模块中有转换过滤器,在第三个模块中有GUI元素,等等。它们相互调用的频率是不相关的-编译器很容易在其他模块中找到代码模块化是为了让代码的维护者能够很容易地找到某个功能。在这里,没有任何代码分析工具可以取代常识。