代码重构:代码重复
重复代码
- 《重构,改善既有代码的设计》
什么是重复代码(Duplicated Code)
- 定义:在一个以上的地点看到相同或相似的代码结构
- 影响:想要修改其中一段代码逻辑需要修改多次,易遗漏,难维护
- 目标:消除重复,提升可维护性的目标
- 方法:提炼函数,移动语句,函数上移等重构方法。
案例1:同一个类的多个方法间代码重复
-
背景:两个函数根据水果类型获得单价并计算水果费用;其中一个函数全价购买,一个函数打折购买;
-
症状/问题:两个函数在获得水果单价的代码是一致的,如果其中一种水果单价出现变化,则需要同时修改两处
-
修改建议:抽取公共方法
案例2:互为兄弟的子类间代码重复
-
背景:代码由水果父类,以及苹果香蕉两个子类组成。计算每种水果的销售利润。考虑运费,存储,破损等成本,计算毛利润时,需要从销量中减去最小出货量
-
症状/问题:两个子类计算利润的方法完全一致,如果计算利润方式出现变化,则需要修改多个子类
-
修改建议:函数上移
案例3:不同类间的代码重复
-
背景:重复代码出现在不同的类中。代码逻辑不完全一致,变量名不同分别为time和timeState,judgeYear多了一条打印语句。
-
症状:两个类中函数judgeMonth和judgeYear函数逻辑基本上是一致,只是个别不相同的地方,如果修改修改时间格式,需要同时修改两处。
-
修改建议:语句移动+抽取公共方法
- 对于这类重复,是否需要消除需结合业务场景判断。这里我们以业务判断为需要消除重复为例,介绍消除重复的方法
可辅助识别重复代码的工具
扫描插件及IDEA自带功能:
- CMetrics:代码质量扫描插件,集成在CodeCheck中,常用于门禁。
- IDEAAnalyze:IDEA对于重复代码会自动分析,并以波浪线标注出来。有良好的静态代码分析功能,例如修改变量名后,仍可被识别为重复代码
其他工具
-
从重复具体的表现形态上,大致分为如下四类,对应的检测工具(其中第四类属于逻辑、语法层面,需要结合人工经验判断,当前工具无法承载)
-
类型Ⅰ:代码片段中除了空格、注释以及换行以外的内容完全一致
-
类型Ⅱ:代码片段中除了空格、注释、换行以及变量名以外的内容完全一致
-
类型Ⅲ:代码片段中除了空格、注释、换行以及变量名以外的语句可能有增删改,功能不变
-
类型Ⅳ:两个或更多个代码段执行相同的运算,但通过不同的语法和变量来实现。
总结
注:并非所有的重复代码都是需要消除的。如多微服务间的数据模型、模型转换、client连接、以及完全不相干业务中有极少量的逻辑片段重复等。极致的消除重复可能引入耦合。因此是否需要消除重复,还需要视业务场景而定。
- 点赞
- 收藏
- 关注作者
评论(0)