用C / C ++包来理解重构的代码

问题描述 投票:19回答:6

我即将开始研究一个涉及重构和修改c&c ++中现有代码的项目。代码是一个膨胀的代码,并且数量巨大。当然,由于代码需要修改,因此我们必须在非常短的时间内开发对代码的理解,因为我们有一些非常紧迫的项目进度表。任何人都可以建议任何有助于实现上述目标的开源工具。总之,我正在寻找的工具可以:

  1. 逆向工程工具,有助于理解设计。
  2. 序列生成器工具将帮助在运行时绘制序列(最有可能我们将能够运行代码,但至少不能在初始阶段)或通过代码检查。
  3. 良好的代码浏览工具,可以研究现有的代码库。
  4. 适合的工具,可以轻松自动重构代码。

请告诉我任何值得关注的经历,偏好或收藏。

[编辑]想出了上面提供帮助的工具列表。这是清单:

  1. Graphvizdoxygen 从现有代码库生成UML类图
  2. UMLStudio 为OO遗留代码创建对象模型是分析,理解和维护它的最佳方法。 UMLStudio可以比任何其他CASE工具更快地将C ++,Java,CORBA IDL,PHP 5和Ada 95代码转换为OOA和D表示法。
  3. CodeDrawer for C++ CodeDrawer将源代码转换为基于可视化的图表。可以显示类,结构和源代码的任何元素。它还显示了函数和方法的逻辑。 CodeDrawer有助于理解项目的源代码
  4. Imagix 反向工程和源代码可视化可以提高程序的理解能力。速度:学习不熟悉的代码更改影响分析集成开源代码重用软件维护
  5. AgileJ AgileJ StructureViews是Eclipse Java IDE的一个插件,它可以在工业规模上生成高度可定制的UML类图,非常适合敏捷开发或探索任何现有的Java代码库。
  6. MaintainJ如果您可以运行代码库,那么当您运行特定用例时,MaintainJ会在运行时生成UML序列和类图。
  7. Java Reverse Engineering Tool从Java源代码生成类之间的类图和关系。
  8. Source Insight很棒的源码浏览软件

还有一个,感谢Steve Townsend Klocwork

c++ refactoring automated-refactoring
6个回答
10
投票

代码是一个膨胀的代码,并且数量巨大。当然,由于需要修改代码,因此我们必须在非常短的时间内开发对代码的理解,因为我们有一些非常紧迫的项目进度表。

然后你就遇到了一个管理问题:如果你已经知道你几乎没有时间理解很多代码,那你就注定要失败了。要理解这段代码,你必须让它运行并通过它,这需要时间。工具只会给你一个大的地图,但不会向你展示真正的路径。

适合的工具,可以轻松自动重构代码。

你生活在仙境里。

有些工具可以为您提供应用程序的结构体系结构,但如果不逐个浏览每个模块并阅读代码,这将无济于事。首先是使用模块的代码,然后是模块内部的代码。

事实上它是C和C ++使得定义它将花费你的时间变得更加困难,因为它也与你对​​这些语言的知识以及编写应用程序的人的知识水平有关。


4
投票

您应该问的第一个问题是“我如何确保我们所做的任何更改都不会破坏系统?”。但你的问题根本没有提到测试。那对我来说是个红旗。

我同意其他人的看法,工具不是解决方案(不太可能以你想要的形式出现,也不可能100%自信)。

您的目标应该是快速确定要更改的区域 - 我会通过检查和运行代码来执行此操作(最好是在现有测试中 - 您有吗?),并确保您拥有全面的单元和系统测试覆盖率在你触摸一条线之前。如果没有这个基础,你将会失明,最后期限会更加危险。

至少,如果你没有很好的测试,请将这个问题提前告知你的线路,这样如果事情变成梨形,你会发现问题已经提出。

你可以看看这样的东西 - 虽然没用过自己:Klokwork Architect


2
投票

很少有工具可以解析和转换C和C ++代码。作为第一步,解析这些语言本身就很难。另一个关键问题是预处理器,它在C程序中非常滥用(例如,不是以结构化方式)并且使得解析器难以看到程序结构,因此分析器很难(需要决定何时重构)合法)正确地进行分析。

模数这些毛刺,我们的DMS Software Reengineering Toolkit可以配置为对C和C ++代码进行重构。 DMS具有用于C和C ++的工业强度解析器,并且可以捕获大多数预处理器用作内部代码结构的一部分(通常人们试图解析C / C ++会扩展预处理器指令,而这不是重构的选项)。

我们已经用它来对C ++代码进行大规模的代码重组(其中预处理程序滥用很少,因为C ++有许多其他配置代码的方法)。我们还对C系统进行了一些自动化重新设计,但需要更多的努力来处理滥用的预处理器用途。

它不是互动的。您必须规划重构转换并使用模式匹配语言指定它们。但它很可靠。


1
投票

我只是想在学习/重构一个未知的代码库时,特别是当使用像Emacs / CTAGS/ECTAGS这样的工具时,我会添加一个注释,即CEDET非常有用。


1
投票
  1. 如果您有源,从技术上讲,它不是逆向工程。您可以使用非常好的Doxygen生成文档(包括图表 - 也安装GraphViz!):link
  2. 不知道,不确定它是否存在。
  3. 如果启用源代码浏览,您的Web浏览器以及Doxygen。 Visual Studio,右键单击跳转到定义,调试器逐步执行代码并了解其工作(使用和滥用Step Out命令)。
  4. 有一些工具可以进行重构,但是最小的努力和“自动重构”非常难以实现,我认为你找不到相应的工具。

0
投票

5 agilej(http://www.agilej.com/)AgileJ StructureViews是Eclipse Java IDE的一个插件,它可以在工业规模上生成高度可定制的UML类图,非常适合敏捷开发或探索任何现有的Java代码库。

AgileJ适用于您的要点1(逆向工程以帮助理解设计)和3(用于研究现有代码库的良好代码浏览工具)。已迅速打包的膨胀代码通常显示如下:

  • 一个或两个大类,作为最后一分钟功能的每个位的倾倒场(blob反模式)
  • 剪切和粘贴代码,其中整个类被复制和调整以用于新目的,而不是首先将公共部分分解为基类
  • 许多类只使用get和set方法证明缺少OO
  • 依赖关系很重要,一切都取决于整个项目中的其他所有内容,并且架构中没有分层

有更多的特征可以添加到这个列表中,但上面的内容在类图上更明显。

© www.soinside.com 2019 - 2024. All rights reserved.