了解和修改大型项目

时间:2010-09-03 13:12:35

标签: java legacy

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

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

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

8 个答案:

答案 0 :(得分:10)

  • 检查一些源代码库中的代码(Subversion,CVS,Git,Mercurial ......)
  • 确保您可以从源代码构建项目并运行它
  • 如果您已经有一个使用此开源工具的应用程序,请尝试删除二进制依赖项并在eclipse或任何其他IDE中引入项目依赖项。运行代码并逐步完成您想要理解的代码
  • 每次小改变后
  • 如果你有不同的想法分支代码

答案 1 :(得分:8)

Michael Feathers写了一本名为Working Effectively with Legacy Code的好书。有一篇较短的文章版本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.

答案 2 :(得分:5)

Eclipse(以及其他IDE)提供的两件事就是“打败”这个。我在非常大的项目中使用过它们:

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

  • 类型层次结构 - 请参阅类的继承层次结构。在eclipse中它是F4或CTRL + T.

此外:

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

答案 3 :(得分:2)

我的朋友,你是深陷困境的。修改大型的,记录严重的遗留代码是使有经验的程序员认真考虑销售保险或其他一些替代职业的乐趣的项目之一。然而,这并非不可能,这里有一些我希望会有所帮助的提示。

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

不要忘记调试器。如果你想了解真正发生的事情,单步执行相关代码,或者只是找出一个调用栈在某个特定点上看起来的样子,那将非常有用。

答案 4 :(得分:1)

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

此外,如果您的项目有单元测试(认为自己很幸运),请查看您关注的模块的单元测试。这将有助于您了解该模块应该做什么。

答案 5 :(得分:0)

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

有些项目的文档比其他项目更好。以下是我认为组织良好的几个项目: TomcatJettyHudson

您应该查看java-source以获取更多开源项目。

答案 6 :(得分:0)

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

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

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

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

答案 7 :(得分:0)

以下是一些建议

  • 将代码转换为某种形式的CVS。 这样,如果您开始进行更改 你可以随时回顾过去 版本。
  • 花点时间记录下你的内容 已经学会/经历过。 Javadoc很好 为此。
  • 为您的代码创建UML结构。 那里有很多插件,可以很好地代表你的代码布局。