【问题标题】:Understanding and modifying large projects了解和修改大型项目
【发布时间】:2011-04-07 20:32:04
【问题描述】:

我是一名新手程序员,作为我项目的一部分,我必须修改一个具有数百个类的开源工具(用 java 编写)。我必须修改其中的重要部分以适应项目的需要。在过去的一个月里,我一直在努力阅读代码,试图找出每个类的功能,并试图找出从头到尾的管道。

80% 的课程有不完整/缺失的文档。剩下的 20% 是构成该工具的通用 API 的那些。 一个月的代码阅读,刚刚帮助我理解了基本架构。但是我无法弄清楚我需要为我的项目做出的确切更改。有一次,我开始修改一部分代码,很快就做了很多我都记不住的修改。

一位朋友建议我尝试写下类层次结构。有没有更好的(标准?)方法来做到这一点?

【问题讨论】:

  • 您可以使用 Eclipse 本身或其他一些工具(如 MaintainJ)将代码逆向工程为 UML 图。由于您对基本架构有相当了解,因此类图和序列图将为您提供一个很好的代码起点
  • 作为新手程序员,为什么要修改开源工具?即便是开源的,大多数时候还是配置比修改好。

标签: java legacy


【解决方案1】:

Eclipse(以及其他 IDE)提供了两件事来“解决”这个问题。我在非常大的项目中使用过它们:

  • 调用层次结构 - 右键单击​​一个方法并选择“调用层次结构”,或使用 CTRL + ALT + H。这将为您提供调用所选方法的所有方法,并可选择进一步检查树。这个功能真的非常有用。

  • 类型层次结构 - 参见类的继承层次结构。在 Eclipse 中,它是 F4 或 CTRL + T。

还有:

  • 找到一种方法,使更改在保存时生效,而您不必重新部署
  • 使用调试器 - 在 IDE 中以调试模式运行,以便您了解流程是如何进行的

【讨论】:

    【解决方案2】:

    有一本很棒的书,名叫Working Effectively with Legacy Code,作者是 Michael Feathers。还有更短的文章版本here

    他的观点之一是,您能做的最好的事情就是为现有代码编写单元测试。这可以帮助您了解入口点在哪里以及代码应该如何工作。然后它可以让你重构它而不必担心你会破坏它。

    从链接的文章中,总结了他的策略:

    1. Identify change points
    2. Find an inflection point
    3. Cover the inflection point
       a. Break external dependencies
       b. Break internal dependencies
       c. Write tests
    4. Make changes
    5. Refactor the covered code.
    

    【讨论】:

      【解决方案3】:

      这里有几个建议

      • 将代码放入某种形式的 CVS。 这样,如果您开始进行更改 你总是可以回顾以前的 版本。
      • 花时间记录你的 已经学过/经历过。 Javadoc 很好 为此。
      • 为您的代码创建一个 UML 结构。 有很多插件可以很好地展示您的代码布局。

      【讨论】:

        【解决方案4】:

        在我看来,没有标准的方法来理解一个项目。这取决于许多因素,从您正在分析的代码/架构的可理解性到您之前在大型项目中的经验。

        我建议您使用建模工具对代码进行逆向工程,以便您可以从现有的源代码生成一些 UML 模型。这些图表可以作为您分析代码时的图形指南。

        不要害怕使用调试来获取项目中最复杂功能的逻辑。逐条运行最复杂的代码,查看变量的准确值以及对象之间的交互会很有帮助。

        在您重构以更改项目以满足您的需求之前,请务必编写一些测试用例,以便您可以验证您的修改不会以意想不到的方式破坏代码。

        【讨论】:

          【解决方案5】:

          我个人认为尝试一下子理解整个应用程序是非常困难的。相反,尝试只关注某些模块。例如,如果您可以确定需要更改的模块(例如,基于屏幕或某些输入/输出点),那么首先进行一个小的更改并对其进行测试。从那里开始,做一个小的改变,测试,然后继续前进。

          此外,如果您的项目有单元测试(认为自己很幸运)并查看您关注的模块的单元测试。这将帮助您了解模块的预期功能。

          【讨论】:

            【解决方案6】:

            我的朋友,你陷入了困境。修改大型的、记录不充分的遗留代码是让经验丰富的程序员认真考虑销售保险或其他替代职业的乐趣的项目之一。不过这也不是不可能,这里有一些建议,希望对您有所帮助。

            您的首要任务是尽可能多地理解代码。你至少在正确的轨道上。了解类结构是绝对重要的,而图表可能是最好的方法。我建议的另一件事是,当您发现一个类的作用时,自己添加缺少的文档。这样当你回到它时,你就不会忘记你发现了什么。

            不要忘记调试器。如果您想了解到底发生了什么,单步调试相关代码,或者只是找出调用堆栈在某个时间点的真实样子会非常有帮助。

            【讨论】:

            • 当文档完成后,考虑将其贡献回原始项目。
            【解决方案7】:
            • 签入某些源代码存储库(Subversion、CVS、Git、Mercurial...)中的代码
            • 确保您可以从源代码构建项目并运行它
            • 如果您已经有一个使用此开源工具的应用程序,请尝试删除二进制依赖项并在 Eclipse 或任何其他 IDE 中引入项目依赖项。运行您的代码并逐步完成您想要理解的代码
            • 每次小改动提交后
            • 如果你有不同的想法分支代码

            【讨论】:

              【解决方案8】:

              理解代码的唯一方法是阅读它。继续工作,这是我的建议。

              有些项目的文档比其他项目更好。以下是我知道组织良好的几个项目: Tomcat , Jetty, Hudson,

              您应该查看java-source 了解更多开源项目。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-02-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-02-18
                • 2012-05-29
                • 2019-03-09
                • 1970-01-01
                相关资源
                最近更新 更多