代码重构:代码重复

举报
孙小北 发表于 2022/04/15 23:16:11 2022/04/15
【摘要】 重复不一定是坏的,但冗余的重复是不利的

重复代码

  • 《重构,改善既有代码的设计》

什么是重复代码(Duplicated Code)

  • 定义:在一个以上的地点看到相同或相似的代码结构
  • 影响:想要修改其中一段代码逻辑需要修改多次,易遗漏,难维护
  • 目标:消除重复,提升可维护性的目标
  • 方法:提炼函数,移动语句,函数上移等重构方法。

案例1:同一个类的多个方法间代码重复

  • 背景:两个函数根据水果类型获得单价并计算水果费用;其中一个函数全价购买,一个函数打折购买;

  • 症状/问题:两个函数在获得水果单价的代码是一致的,如果其中一种水果单价出现变化,则需要同时修改两处

  • 修改建议:抽取公共方法
    image-20220415230024021.png

案例2:互为兄弟的子类间代码重复

  • 背景:代码由水果父类,以及苹果香蕉两个子类组成。计算每种水果的销售利润。考虑运费,存储,破损等成本,计算毛利润时,需要从销量中减去最小出货量

  • 症状/问题:两个子类计算利润的方法完全一致,如果计算利润方式出现变化,则需要修改多个子类

  • 修改建议:函数上移
    image-20220415230221205.png

案例3:不同类间的代码重复

  • 背景:重复代码出现在不同的类中。代码逻辑不完全一致,变量名不同分别为time和timeState,judgeYear多了一条打印语句。

  • 症状:两个类中函数judgeMonth和judgeYear函数逻辑基本上是一致,只是个别不相同的地方,如果修改修改时间格式,需要同时修改两处。

  • 修改建议:语句移动+抽取公共方法

image-20220415230559255.png

  • 对于这类重复,是否需要消除需结合业务场景判断。这里我们以业务判断为需要消除重复为例,介绍消除重复的方法

可辅助识别重复代码的工具

扫描插件及IDEA自带功能:

  • CMetrics:代码质量扫描插件,集成在CodeCheck中,常用于门禁。
  • IDEAAnalyze:IDEA对于重复代码会自动分析,并以波浪线标注出来。有良好的静态代码分析功能,例如修改变量名后,仍可被识别为重复代码
    image-20220415230743046.png

其他工具

  • 从重复具体的表现形态上,大致分为如下四类,对应的检测工具(其中第四类属于逻辑、语法层面,需要结合人工经验判断,当前工具无法承载)
    image-20220415230904203.png

  • 类型Ⅰ:代码片段中除了空格、注释以及换行以外的内容完全一致

  • 类型Ⅱ:代码片段中除了空格、注释、换行以及变量名以外的内容完全一致

  • 类型Ⅲ:代码片段中除了空格、注释、换行以及变量名以外的语句可能有增删改,功能不变

  • 类型Ⅳ:两个或更多个代码段执行相同的运算,但通过不同的语法和变量来实现。

总结

image-20220415231114200.png

注:并非所有的重复代码都是需要消除的。如多微服务间的数据模型、模型转换、client连接、以及完全不相干业务中有极少量的逻辑片段重复等。极致的消除重复可能引入耦合。因此是否需要消除重复,还需要视业务场景而定

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。