代码之家  ›  专栏  ›  技术社区  ›  Andy

清理一个大型的遗留Java项目

  •  14
  • Andy  · 技术社区  · 15 年前

    我被指派在一个巨大的Java项目上做一些工作,开发人员的几个迭代的影响是显而易见的。没有标准的编码样式、格式、命名约定或类结构。当我遇到一个Javadoc类时,这是一个好日子,单元测试是一个愉快的白日梦。

    到目前为止,我们这些参与这个项目的人一直在“融入”,适应我们正在研究的任何类别的现有惯例,但现在是时候强加一些秩序和一致性了。

    这是一个令人生畏的挑战,我正在寻找人们对这项任务的任何建议。有没有什么特别有效的策略,或者需要注意的陷阱?试试看是不是个好主意?

    编辑补充:我不想给人留下这个项目不好的印象——事实上它设计得很扎实,而且基本上写得很好。只是感觉到它的年龄和保养的必然性。。。

    9 回复  |  直到 15 年前
        1
  •  11
  •   Jake Wharton    15 年前

    我发现Eclipse对于这样的操作来说是一个非常强大的工具。

    很多人都相信命令行工具和基于模式的文本编辑器可以用于编程,但使用完整的IDE进行主要重构有很大的优势:

    • 自动实时编译
    • 基于图形的重命名
    • 自动导入管理 允许您从处理确保所有导入都正常的工作中解脱出来。Eclipse将在使用导入时自动添加导入,并使用action灯泡标记未使用的导入,以便一键删除。
    • 代码样式 以确保所有源文件都使用相同的格式。空格、缩进、新行、括号都可以为您设置格式。这与创建新代码以及更新现有文件一样有效。

    • 测试套件允许您不断地确保所做的任何更改不会对项目的功能产生负面影响。如果你要重构一个特性,写两三个测试用例来演示它的工作方式。确保它们在任何更改之前和之后运行。这是在问题成为问题之前发现问题的最简单方法。
    • 使用Maven之类的工具来帮助处理依赖项、测试、编译和部署。不要再浪费时间做上述任何一项任务。专注于编写完成工作的代码。

    编辑:

    我个人也更喜欢Eclipse,因为我是进行重构的人,而不是那些对我的代码一无所知的自动化工具。

        2
  •  6
  •   Community Mohan Dere    9 年前

    tool 对项目中的源代码强制使用通用格式。除此之外,看看迈克尔·费茨 (其中“遗留代码”定义为“没有单元测试的代码”),它描述了如何逐步将遗留代码转换为完全测试和可测试的代码。

        3
  •  3
  •   crowne    15 年前

    1. 首先将项目转换为使用maven构建,这样我就知道依赖项是什么版本。
    2. 这也给了我一些像样的代码质量报告作为基准,包括checkstyle、findbugs、pmd和代码覆盖率。
    3. 如果是一个大型项目,那么maven多模块项目布局可能是正确的结构。
    4. 如果它现在是一个大泥球,那么它就成为核心模块,然后可以重构成单独的模块。
    5. 这个 standard maven directory structure
    6. 在重构开始之前,单元测试是一个关键的先决条件。
    7. 使用 Hudson .
        4
  •  3
  •   Justin Dennahower    15 年前

    从单块类开始,将它们分解(超过500个语句,不包括注释和只有大括号的行)。引入接口,然后引入依赖注入。

        5
  •  2
  •   Mike    15 年前

    我已经经历了好几次这个过程,我发现解决方案需要知道以下几点:

    • 解决这些问题的理念会不会出现政治动荡?
    • 有好的测试用例吗?

    “一套一致的编码标准将导致: -减少30%的错误 -维护成本降低80% -我们100%的编码人员都会对这种变化感到高兴。”

    显然,除非你已经从目前加入到项目中的人那里得到了支持,否则开始这项工作是没有意义的。每个人都必须同意并开始将这些理想重新融入当前存在的代码中。请记住,并不是每个人都使用IDE(例如,我在VIM中编写了所有java代码),所以您应该确保wiki上规定了这种格式,以供所有人(特别是新的团队成员)查看,并且wiki页面上有供正在使用的各种编辑器使用的下载。

    因为我们很有可能不仅讨论代码格式,而且还讨论变量重命名和模式更改,这些都会影响类的公共api,所以您确实需要确保有一组非常稳定的测试用例。如果缺少测试用例,那么您应该始终从外部开始对您的测试建模,以便它们与您的用户进行交互。然后你就可以满怀信心地进行重构。一旦你有了与你的梦想相似的代码,你就可以在每个对象附近添加测试。创建所有的测试用例,然后更改API,然后不得不更改所有的测试用例,没有什么比这更痛苦的了;每次我看到这种情况时,都会导致测试覆盖率的大幅下降。

        6
  •  1
  •   Mark Peters    15 年前

    我的建议是在构建系统中添加类似Checkstyle的内容。很难让管理层接受一次彻底检修的想法。设计您认为是一组好的样式准则,并在Checkstyle中实现它们并将其添加到构建中。

    另外,Eclipse也有checkstyle插件。

        7
  •  0
  •   leonbloy    15 年前

    这是一个相当普通的任务,不是很快乐,但也不是一个噩梦。。。如果用其他语言编码(Perl、PHP、C++、-GASP—VB……),情况可能更糟。;实际上,Java是最适合您的场景之一。

    当缺少文档时,IDE(和静态编译)有助于了解谁在使用哪个类或方法,并且您可以非常自信地进行重构。但首先要确定反射使用的层/包/类(由代码显式地使用,或由框架隐式地使用,例如一些getter和setter)。

    有很多书致力于“重新设计遗留软件”和相关问题。

        8
  •  0
  •   AlexR    15 年前

    我同意那些推荐maven build、eclipse、Checkstyle、大型类重构等的人的看法。我理解在开始工作之前,您无法实现完整的测试覆盖率。我建议你 一。使用checkstyle或类似工具在批处理模式下重新格式化代码 三。使用缺陷驱动的自动测试,即为要更改的模块开发测试。

    祝你好运!

        9
  •  0
  •   kukudas    15 年前

    我还建议使用IDE的特性来提高代码质量。对于eclipse,我要做的是:

    在首选项java>代码样式>格式化程序中-定义您自己的格式并添加它。之后,右键单击项目和源<clean up。选择sustom profile并配置。这里有很多事情可以做,比如代码格式化清理导入,将遗留for循环转换为增强循环,清理未使用的代码等等。