19

我即将开始从事一个项目,该项目涉及重构和修改 c 和 c++ 中的现有代码。代码很臃肿,而且数量巨大。当然,由于需要修改代码,因此必须在很短的时间内开发对代码的理解,因为我们有一些时间紧迫的项目时间表。任何人都可以建议任何有助于实现上述目标的开源工具。简而言之,我正在寻找的是可以:

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

请告诉我任何值得关注的经历、偏好或最爱。

[编辑] 在上面列出了可以提供帮助的工具列表。这是列表:

  1. Graphviz & doxygen
    从现有代码库生成 UML 类图

  2. UMLStudio
    为您的 OO 遗留代码创建对象模型是分析、理解和维护它的最佳方法。UMLStudio 可以比任何其他 CASE 工具更快地自动将 C++、Java、CORBA IDL、PHP 5 和 Ada 95 代码转换为 OOA&D 符号。

  3. C++
    的 CodeDrawer CodeDrawer 将源代码转换为基于可视化的图表。类、结构和源代码的任何元素都可以显示在图表中。它还显示了函数和方法的逻辑。CodeDrawer 有助于理解项目的源代码

  4. Imagix
    源代码的逆向工程和可视化导致改进的程序理解。速度:学习不熟悉的代码更改影响分析集成开源代码代码重用软件维护

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

  6. MaintainJ 如果您可以运行代码库,那么当您运行特定用例时,MaintainJ 在运行时生成 UML 序列和类图。

  7. Java 逆向工程工具 从 Java 源代码生成类图和类之间的关系。

  8. Source Insight 优秀的资源浏览软件

还有一个,感谢 Steve Townsend
Klocwork

4

6 回答 6

10

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

那么你有一个管理问题:如果你已经知道你没有多少时间来理解很多代码,那么你注定要失败。要理解这段代码,你必须让它运行并通过它,这需要时间。工具只会给你一张大地图,但不会告诉你真正的路径。

合适的工具,可以以最小的努力自动重构代码。

你生活在仙境。

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

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

于 2010-09-23T09:49:40.990 回答
4

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

我同意其他人的观点,即工具不是解决方案(不太可能以您想要的形式出现,也不太可能 100% 值得信赖)。

您的目标应该是快速确定要更改的区域 - 我会通过检查和运行代码来做到这一点(最好在现有测试中 - 你有它们吗?),并确保你有全面的单元和系统测试覆盖率在你触摸一条线之前先在它们上面。没有这个基础,你将盲目飞行,最后期限的风险更大。

至少,如果您没有很好的测试,请提前将这种担忧传达给您的生产线,这样如果事情发展成梨形,您就会被视为提出了问题。

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

于 2010-09-23T11:21:54.457 回答
2

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

以这些故障为模,我们的DMS 软件重构工具包可以配置为对 C 和 C++ 代码进行重构。DMS 具有针对 C 和 C++ 的工业级解析器,并且可以独特地捕获大多数预处理器使用作为内部代码结构的一部分(通常,试图解析 C/C++ 的人会扩展预处理器指令,这不是重构的选项)。

我们已经使用它对 C++ 代码进行了大规模的代码重组(其中预处理器的滥用是最小的,因为 C++ 有多种其他方式来配置代码)。我们还对 C 系统进行了一些自动重新设计,但在处理滥用预处理器使用方面付出了更多努力。

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

于 2010-10-04T15:38:34.227 回答
1
  1. 如果您有来源,从技术上讲,它不是逆向工程。您可以使用非常好的 Doxygen 生成文档(包括图表 - 也安装 GraphViz!):链接
  2. 不知道,不确定它是否存在。
  3. 如果您启用源代码浏览,您的 Web 浏览器以及 Doxygen。Visual Studio,右键单击可跳转到定义,调试器可单步执行代码并了解其工作原理(使用和滥用 Step Out 命令)。
  4. 有一些工具可以进行重构,但是极少的努力和“自动重构”很难实现,我认为您找不到用于此的工具。
于 2010-09-23T09:54:05.910 回答
1

我只是想添加一个注释,即CTAGS/ECTAGS在研究/重构未知代码库时非常有用,尤其是在使用 Emacs/ CEDET 之类的工具时。

于 2011-02-01T21:34:34.350 回答
0

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

AgileJ 适用于您的第 1 点(逆向工程以帮助理解设计)和第 3 点(用于研究现有代码库的良好代码浏览工具)。快速拼凑在一起的臃肿代码通常会显示为:

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

可以将更多特征添加到此列表中,但以上在类图上更加明显。

于 2013-03-08T09:46:47.640 回答