最近在整改某项目几十个模块(子项目)的重复代码,整理的一些思路。 其实方法在重构一书早就说过了,我个人认为要多思考方法。类的职责, 用对象间进行协助的思路,来解决重复代码的问题。 对于快速找到某段重复代码的处理模式,这就是关键的地方。
模块之间的重复代码
- 文件重复,但模块间通用,可推到基础模块,风险小,常见于基础工具类
- 文件重复,但与具体模块相关,说明依赖其他模块,不适合直接推到基础模块,调整较大,建议延后处理
模块内文件间的重复代码
强相关
- 直接删除一个,推上上层包结构,作为公共代码
- 差异为通用扩展时, 合并成一个
- 差异为特殊扩展时,采用继承方式,虽然不够彻底,但风险小
普通关联
- 以业务为准,公用包结构
- 重复部分推到父类,由两边继承
- 采用协助类,常见于较大粒度的对象协助
弱相关
- 重复代码进入工具类,适用于通用的场景
- 采用协助类,参与于较小粒度的对象协助
文件内方法间的重复代码
- 抽取私有方法作为优先考虑的方法,风险小,可操作性强,需要注意方法命名
- 抽取协作类,常见于私有方法过多、局部关联性强、复杂度过高等情况
- 由已经存在的类实现,常见于职责过大的情况
- 如果适用于通用逻辑,可以推到父类或工具类
小技巧
- 先抽取小方法,看清结构
- 有时候用循环代替排山倒海式代码
- 先简化再深化,分步骤处理
- 识别真正不一样的地方