代码理解,逆向工程,最佳概念和工具。 Java的

时间:2010-04-17 11:05:56

标签: java uml reverse-engineering

任何程序员最苛刻的任务之一,架构师都在理解其他代码。

例如,我是承包商,雇用来快速救出一些项目。修复错误,计划全局重构,因此我需要最有效的方式来理解代码。什么是概念列表,它们的优先级和最佳工具?

我所知道的:反向代码工程来创建对象模型(创建每个包的图表不那么方便),创建序列图(该工具以调试模式连接到系统并从运行时生成图表)。一些可视化技术,使用一些工具不仅可以使用.java,还可以使用例如JPAHibernate等{{1}}个实施者。为所有代码库生成图表,但添加一些类,然后添加它使用的类。

Sparx Enterprise Architect是逆向工程还是最先进的技术?还有其他更好的工具?理想情况下,该工具会让我理解代码,就好像我自己编写代码一样:)

6 个答案:

答案 0 :(得分:11)

这本书Object-Oriented Reengineering Patterns详细论述了这一点。不幸的是,附上没有银弹: - )

但是,它列出了许多用于接管遗留代码的有用技术。简而言之

  • 至少采访一些原始开发人员(如果他们还在身边)
    • 开发历史:阶段,发布
    • 目前的状况
    • 团队社会结构,政治,动态:人们加入和离开的时间和原因
    • 错误:典型,最简单,最难的
    • 代码质量:最干净/最丑陋的部分
    • 配置数据:表单,内容和用法
    • unit / integration / manual / ...测试用例和数据
    • SCM分支结构和用法
    • 文档:记录在哪里,是最新的
    • 联系人以获取外部接口
  • 在演示期间观察开发人员/用户以查找
    • 主要特色
    • 典型用例
    • 用法轶事
    • 好/坏,缺失/多余的功能
  • “在一小时内阅读所有代码”
    • 获取类层次结构,接口的高级视图
    • 如果需要,可以参加多个会议
    • 识别大型结构(这些通常包含重要功能)
    • 寻找设计模式
    • 检查评论(他们可以揭示很多,但可能也会产生误导)
  • 浏览文档(如果有的话)
    • 只记录特定类型文档的可用性,例如规范,UML图,Wiki,Javadoc等。
    • 是有用的,为什么(不是)
    • 是最新的

答案 1 :(得分:6)

到目前为止,最重要的工具是你的耳朵,舌头和喉头。询问熟悉代码的人 - 他们将能够比任何软件工具更好地帮助您理解其通用架构。

自动反向工程的完整UML模型通常几乎无用,因为它们无法区分重要的抽象和实现细节 - 这就是这些模型的重点。

在调查详细信息时,软件工具对于回答非常具体的问题更有用,例如“调用此方法的位置在哪里?”或“什么类实现此接口” - 任何好的IDE都能够做到这一点。调试器也可以提供帮助 - 在代码的关键点放置断点并在命中时查看调用堆栈通常非常有启发性。

答案 2 :(得分:2)

只是详细说明Michaels提到可以帮助你的好IDE:

我经常使用以下Eclipse工具:

  • 当光标放在标识符中时,Shift-F2会显示该标识符的Javadoc(如果有)。适合航行。
  • 将鼠标悬停在标识符上会显示一个包含Javadoc的框,如果有的话。写作时有助于提醒,例如方法调用。
  • 声明视图显示定义光标所在的关键字的源。光标移动时会更新。
  • F3转到当前标识符的定义。
  • 标识符上的Ctrl-T显示弹出窗口中的所有子类和实现。在界面上工作时非常有用。
  • 标识符上的F4在面板中显示该标识符的实现层次结构,该面板可以被导航。了解事物如何连接非常有用。这包括类和接口。

答案 3 :(得分:1)

EclipseUML Omondo是最好的Java逆向工程工具。如果不在同一个包中,它会反转所有java代码,所有包甚至是与接口的类交互。太棒了。 你也可以逆转: - .class - 休眠注释 - JPA注释

我喜欢这个工具的是我的代码是干净的,因为所有模型信息都保存为xmi格式而不是代码中的标记。您还可以使用图表作为模型视图在每个现有包中创建小文档。非常了不起并尊重官方的uml 2.2规范。 唯一的问题是它真的太贵了所以价格对我来说是个停止!!

答案 4 :(得分:1)

不提取高级体系结构,但确实可以更容易地遍历Java代码:我们的Java Source Code Browser。这将读取源代码(和支持类文件)并生成Javadoc样式文档以及双向超链接到Javadoc信息的源文本。 (我是其中的主要负责人之一)。

答案 5 :(得分:0)

我使用Enterprise Architect进行整个UML(包括使用Java进行逆向工程),它运行良好。