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

时间:2010-09-23 09:34:11

标签: c++ refactoring automated-refactoring

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

  1. 反向工程工具,有助于理解设计。
  2. 序列生成器工具,它有助于在运行时绘制序列(最有可能我们将能够运行代码,但至少不能在初始阶段)或通过代码检查。
  3. 良好的代码浏览工具,用于研究现有的代码库。
  4. 合适的工具,可以轻松自动重构代码。
  5. 请告诉我任何值得关注的经历,偏好或收藏。

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

    1. Graphviz& doxygen
      从现有代码库生成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 伟大的源浏览软件

    9. 再一次,感谢Steve Townsend Klocwork

6 个答案:

答案 0 :(得分:10)

  

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

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

  

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

你生活在仙境里。

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

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

答案 1 :(得分:4)

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

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

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

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

你可以看一下这样的事情 - 虽然没有用过我自己:Klokwork Architect

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

我只是想在学习/重构未知代码库时添加一条CTAGS/ECTAGS非常有用的注释,尤其是在使用Emacs / CEDET等工具时。

答案 5 :(得分:0)

  

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

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

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

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