代码重构:冗赘的元素(Lazy Element)
【摘要】 什么是冗赘的元素(Lazy Element)定义:冗赘的元素主要包括由于过度设计或在代码演进过程中,产生的冗余、废弃[1]或不足以独立承担其职责的类、方法、变量等影响:代码不简洁,存在多余的元素,造成在维护时无用修改,难以维护,影响代码的可读性。改进目标:消除冗赘的程序元素,提高代码的可读性、可维护性。方法•内联函数或内联类•如果这个类处于一个继承体系中,可以使用折叠继承体系•安全删除冗余...
什么是冗赘的元素(Lazy Element)
-
定义:冗赘的元素主要包括由于过度设计或在代码演进过程中,产生的冗余、废弃[1]或不足以独立承担其职责的类、方法、变量等
-
影响:代码不简洁,存在多余的元素,造成在维护时无用修改,难以维护,影响代码的可读性。
-
改进目标:消除冗赘的程序元素,提高代码的可读性、可维护性。
-
方法
•内联函数或内联类
•如果这个类处于一个继承体系中,可以使用折叠继承体系
•安全删除冗余元素。 -
注[1]:《重构》一书中冗赘的元素定义中并未包含冗余、废弃的代码,但在公司代码中冗余、废弃等问题较为常见,故此处一并列出。
案例
代码背景
- 简化的房屋信息处理模型,可为购房者提供房屋面积、单价、总价、首付款、房龄等相关信息
- 旧版本系统使用的房屋数据模型,当前业务中未使用
- 当前系统使用的房屋数据模型,包含单价、面积、竣工时间,以及对应的get方法
- 封装了房屋数据处理方法的类
- 专门处理大房子信息的类,设计之初曾拥有很多职责,演进过程中其他功能逐渐删除,当前只剩判断是否是大房子的方法
症状/问题:存在废弃或冗余的代码,会增大阅读和维护成本,包括
- 存在旧版系统中使用的类、方法、字段,当前版本既然已确定不再使用,就应当及时删除
- 出于对“未来可能使用”的考虑引入的参数,但当前实际代码中并不会使用,应当删除,避免歧义
重构目标
- 删除冗余的代码,降低维护成本
重构手法
- 安全删除
症状/问题
-
类、方法过于简单,不足以独立承担业务所需的职责,使不必要的调用链变长,业务不内聚,包括
-
单纯的数据类HouseData,无状态信息,除了给House提供需要操作的完整数据外,无其他任何用途
-
方法名和方法体几乎一模一样,没有存在的价值
重构目标
- 使用内联,消除不足以独立承担职责的类、方法等,减少委托,使代码更简洁,对象更富血,功能更内聚
重构手法
- 内联类
- 内联函数
症状/问题
- 设计之初的继承体系,在演进过程中逐渐退化,当前仅剩的父类或子类不再有独立的价值,仅会增加维护负担
- House仅存在BigHouse一个实现类,且BigHouse中除了一个简单的bool方法外,没有其他任何业务特性,没有体现出继承体系的价值
重构目标
- 合并子类和父类,消除继承关系,降低维护成本
重构手法
- 折叠继承体系
相关识别技巧
-
对于代码中一些未使用的类、方法、字段、参数等,可以基于IDEA——Analyze的冗余代码识别进行辅助判断。对于可能冗余的类和方法会以浅底色标注出来
-
也可以直接在IDEA的Analyze——Inspect Code——Declaration redundancy中,批量发现冗余代码,然后再结合人工进行判断
-
CodeCheck等工具,可以扫描出废弃代码,日常开发中需要及时整改
注:
- [1]工具只能识别代码上的“废弃”和“冗余”,设计上的冗赘元素(如继承等)无法识别,需要人工结合经验判断
- [2]工具只能辅助识别冗余代码,能快速定位到可能出现的问题,但是否修改还需要人工判断,如RMI、网络接口及不常用的开源第三方借助AOP等调用的类、方法,IDEA的Analyze功能无法准确识别
CodeCheck等工具,可以扫描出废弃代码,日常开发中需要及时整改
总结
- 注[1]:《重构》一书中冗赘的元素定义中并未包含冗余、废弃的代码,但在日常代码中冗余、废弃等问题较为常见,故此处一并列出。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)