Java:将外部恐怖代码转换为干净API的最佳实践......?

时间:2010-03-21 20:57:14

标签: java api refactoring readability

我有一个项目(与图算法有关)。它是由其他人写的。

代码太可怕了:

  • 公共字段,没有getter / setter
  • 巨大的方法,全部公开
  • 某些课程有超过20个字段
  • 有些类有超过5个构造函数(也很大)
  • 其中一些构造函数只留下许多字段null
    (所以我不能让一些字段最终,因为那时每个第二个构造函数都会发出错误信号)
  • 方法和类在两个方向上相互依赖

我必须将其重写为一个干净且易于理解的API。

问题是:我自己对此代码中的任何内容都不了解。

请告诉我有关分析和理解此类代码的提示。

我在想,也许有一些工具可以执行静态代码分析 并给我打电话图和这样的事情。

10 个答案:

答案 0 :(得分:8)

哦亲爱的:-)我羡慕你而不是同时......我们一次只能做一件事。在设置代码分析工具之前,您可以解决其中的一些问题。通过这种方式,您将获得更好的理解,并且能够比使用简单的工具更进一步

  • 公共领域,没有getter / setter
    • 让一切都变得私密。您的规则应该是尽可能地限制访问
  • 巨大的方法,全部公开
    • 拆分并在有意义的地方隐私
  • 有些班级有20多个领域
    • 呃.. Effective Java 2nd Ed中的Builder模式是这方面的主要候选者。
  • 有些类有超过5个构造函数(也很大)
    • 听起来像伸缩式构造函数,与上面相同的模式将有助于
  • 其中一些构造函数只是将许多字段留空
    • 是的,它是伸缩式构造函数:)
  • 方法和类在两个方向上相互依赖
    • 这将是最不有趣的。尝试删除继承,除非你完全清楚 它是必需的,并通过适用的接口使用组合

祝我们好运,我们随时为您提供帮助

答案 1 :(得分:6)

WOW!

我建议:编写单元测试,然后开始重构

* public fields, no getters/setters

首先将它们设为私有,然后“感觉”编译器错误的阻力为度量标准。

* huge methods, all public

了解他们的语义,尝试介绍接口

* some classes have over 20 fields

在复杂的应用程序中很常见,没什么可担心的

* some classes have over 5 constructors (which are also huge)

用buider / creator模式替换它们

* some of those constructors just left many fields null

见上面的回答

* methods and classes rely on each other in both directions

决定是否重写所有内容(老实说,我遇到了需要只需要10%代码的情况)

答案 2 :(得分:3)

嗯,日食中的清理巫师会刮掉一定比例的污泥。

然后,如果你活得足够长的话,你可以指出Sonar并注意它所抱怨的一切。

答案 3 :(得分:2)

对于静态分析和调用图(无图形,但图形结构),您可以使用Dependency Finder

答案 4 :(得分:2)

使用了解重构的IDE,例如IntelliJ。您不会遇到移动一个方法而其他五个类抱怨的情况,因为IntelliJ足够智能以进行所有必需的更改。

单元测试是必须的。没有单元测试的人重构就像没有安全网的高线表演者。在你开始漫长而艰难的攀登之前先获得一个。

答案 5 :(得分:1)

答案可能是:耐心和咖啡。

答案 6 :(得分:1)

这就是我这样做的方式:

  1. 开始使用代码,例如从main方法中,就好像它被其他类使用 - 相同的参数,相同的调用顺序。在调试器中执行此操作,因为您会看到此类所执行的每个步骤。
  2. 开始为该功能编写单元测试。一旦达到合理的覆盖范围,您就会开始注意到这个类可能有太多的责任。
  3. while ( responsibilities != 1 ) {

    1. 提取表示该类的一项责任的界面。
    2. 让所有来电者使用该界面而不是具体类型;
    3. 将实现提取到单独的类;
    4. 使用新界面将新课程传递给所有来电者。
    5. }

答案 7 :(得分:1)

不是说Sonar,FindBugs等有些人已经提到过的工具没有帮助,但没有任何魔术技巧。从你理解的东西开始,为它创建一个单元测试,一旦它运行绿色开始一个接一个地重构。记得在你进行时模拟依赖关系。

答案 8 :(得分:0)

有时从头开始重写更容易。这个“可怕的代码”是按预期工作还是充满了错误?记录了吗?

在我目前的项目中,几乎完全删除我的前任工作,并从头开始重写,是最有效的方法。当然,这是代码混淆的极端情况,完全缺乏有意义的评论,完全无能,所以你的里程可能会有所不同。

答案 9 :(得分:0)

虽然一些遗留代码可能几乎无法理解,但它仍然可以重构并逐步改进为易读性。你看过Joshua Kerievsky的Refactoring To Patterns书吗? - 这很好。