指导原则: 防止在代码中出现重复. 为了达到这个目标, 需要做到如下几个方面:
- 写可重用代码
- 写泛型代码
- 重用现存的方法或函数
因为拷贝代码, 可能导致 bug 修复时需要多处修改. 并且要经常问自己, 这个东西已经是存在的了, 为什么还要去重复写?
必须意识到, 重复本身就是一个问题. 但是说了这么多, 到底什么才是重复呢, 下面就来看看.
1 重复的种类
实际就是两种重复: 模式上的重复, 逻辑上的重复.
模式上的重复(type1)包括完全相同的代码, 和在结构上完全相同的代码.
而逻辑上的重复(type2)更难判断.
Type1 型重复代码定义为: 在两段代码中至少 6 行是一模一样的, 一模一样的意思是一个模式的. 当然这样的重复是去掉了空行以及注释之后来看的.
这种重复有一个子类型是 复制-粘贴 型的重复. 但不一定 type1 型的重复都是复制粘贴的. 因为�有时只是标识符发生了变化, 但代码功能完全一样, 却在�不同地方都写着, 这时也可以判断为 type1 型重复, 但这时就没办法通过工具来检测了.(复制粘贴的可以通过工具来检测.)
另外还有 type2 型重复, 即在意义上是相同的, 这个就更难判断了...
重复有时很难进行检测和判断, 这才是最难的地方.
本次所要讲的是如何从代码中移除 type1 型重复, 因为:
可维护性的提升, 绝大多数时候都是靠移除 type1 型重复来达到的.
type1 型重复更加容易检测和识别.(无论计算机还是人, 要判断 type2 型重复都需要完全地进行句法分析)
另外对于 type1 型的 6 行限值是平衡的结果.
2 移除重复代码的好处
下面来看减少代码中重复的数量为什么会提升系统可维护性.
- 重复的代码更难分析, 特别是在修复 bug 的时候.
- 重复的代码更加难修改, 因为许多时候都要多处去改.
3 如何在实际工作中减少代码中的重复
首先, 要坚决杜绝在代码中直接复制粘贴代码! 要重用代码的时候就把代码放到一个方法中, 然后在多个地方调用.
需要多用 将功能分解到方法中 这种重构手段.
另外还有一种重构方法是: 将重复的功能移动到父类或接口默认实现中.
这种方法的主要思路就是�将重复功能进行抽象, 移动到同一棵树的上层或是横向抽象的上层(接口)中.