让开发自动化让开发自动化:持续重构持续重构
火龙果软件工程技术中心
本文内容包括:
条件复杂度
重复代码
长方法(大类)
太多导入
重构……要尽早且要经常进行
其他味道与重构
参考资料
重构是公认的改进现有代码的好方法。然而,如何通过一种一致且可重复的方式
找到
需要重构的代码呢?本期的
让开发自动化 阐述了如何使用静态分析工具来识别需要重构的代码味道,并举例说明了如何改进坏味道代码。
在过去的几年里,我曾看过很多项目的大量源代码,从精美的设计到像是用胶带绑定到一起的代码。我写过新的代码也维护过
其他开发人员的源代码。我喜欢编写新的代码,但也喜欢采用一些现有的代码,以某种方法将其简化或将重复的代码提取到一
个公共类中。在我早期的工作生涯中,许多人都认为如果不编写新的代码就不会有好的效率。幸好,在 20 世纪 90 年代
末,Martin Fowler 编写了 Refactoring 一书(参见 参考资料),它使得在不改变外部行为的前提下改进现有代码成为可能。
我在 本系列 中所一直推崇的就是
效率
:如何减少耗时过程的冗余度,更快速地执行它们。在本文的任务中,我一样推崇这个
目标,
并且
将论述怎样更
有效地
执行它们。
重构的一个典型方法是在引入新代码或更改方法时对现有代码做出小小的变动。该技巧面临的挑战在于一个开发团队的开发人
员的应用方法不一致,并且很容易错失重构的机会。这也正是我提倡使用静态分析工具识别编码违规的原因所在。有了这些工
具,您就能够从总体上了解代码库,并且处于类或方法的级别。幸运的是,在 Java™ 程序设计中,您可以选择的可免费下载
的开源静态分析工具很多:CheckStyle、PMD、FindBugs、JavaNCSS、JDepend 等等。
在本文中,您将学习如何:
使用 CheckStyle 度量圈复杂度(圈复杂度(cyclomatic complexity)),并提供诸如 Replace Conditional with Polymorphism
之类的重构,以此来减少条件复杂度条件复杂度代码味道
使用 CheckStyle 评估代码重复率代码重复率,并提供诸如 Pull Up Method 之类的重构,以此来移除重复代码重复代码
使用 PMD(或 JavaNCSS)计算源代码行源代码行,并提供诸如 Extract Method 之类的重构,以此来淡化大类大类代码味道
使用 CheckStyle(或 JDepend)确定一个类的传出耦合度(传出耦合度(efferent coupling)),并提供诸如 Move Method 之类的
重构,以此来除掉过多的导入过多的导入代码味道
我将使用如下的通用格式来检查每一种代码味道:
1. 描述可以指示出代码里面的问题的味道
2. 定义可以找到该味道的度量方法
3. 展示可以度量代码味道的工具
4. 提供用于修复代码味道的重构和模式(在某些情况下)
实质上,这个方法提供了一个找到和修复整个代码库中的代码味道的一个框架。这样您就可以更好地了解到代码库中较危险的
部分,然后再做出更改。更好的是,我还会向您展示如何将这个方法集成到自动构建中。
条件复杂度条件复杂度
味道味道:条件复杂度
度量度量:圈复杂度
工具工具:CheckStyle、JavaNCSS 以及 PMD
重构重构:Replace Conditional with Polymorphism、Extract Method
味道
条件复杂度
可以以几种不同的方式出现在源代码中。这种代码味道的一个例子就是含有多个条件语句,如 if、while 或者 for 语
句。另一种条件复杂度是以 switch 语句的形式呈现出来的,如清单 1 所示:
清单清单 1. 使用使用 switch 语句来执行条件行为语句来执行条件行为