代码重构:夸夸其谈的通用性(Speculative Generality)

举报
孙小北 发表于 2022/04/29 23:36:56 2022/04/29
2.5k+ 0 0
【摘要】 什么是夸夸其谈的通用性定义:过度的考虑程序的通用性影响:过度的设计导致代码不易理解和维护改进目标:删除过度设计的代码方法折叠继承体系内联类内联函数改变函数声明移除死代码 案例代码背景这是一个计算人的体脂比以及判断是否肥胖的需求的实现Person类用来记录人的各种数据HealthService类根据人的数据计算体脂比以及判断是否肥胖考虑到未来可能不止计算健康信息,专门抽取了一个人的...

什么是夸夸其谈的通用性

  • 定义:过度的考虑程序的通用性
  • 影响:过度的设计导致代码不易理解和维护
  • 改进目标:删除过度设计的代码
  • 方法
    折叠继承体系
    内联类
    内联函数
    改变函数声明
    移除死代码

案例

代码背景

  • 这是一个计算人的体脂比以及判断是否肥胖的需求的实现
  • Person类用来记录人的各种数据
  • HealthService类根据人的数据计算体脂比以及判断是否肥胖
  • 考虑到未来可能不止计算健康信息,专门抽取了一个人的基础信息类Person,健康相关类再有一个单独的类PersonForHealth来承担
  • 又考虑到以后可能不止计算人的,抽取一个Animal接口作为泛型参数传进去
  • 考虑到不止有体重相关的这些指标,又做了一个futureMayUseInfo接口,便于未来扩展

症状

  • 代码中出现了很多过度设计:
  • HealthService、Animal、FutureMayUseInfo都是不必要的接口
  • 没有必要抽取Person抽象类
  • 没有必要使用泛型

重构目标

  • 折叠继承体系,删除不必要的接口和抽象类

image-20220429191631780.png

案例2

代码背景

  • PersonForHealth类有个BodyMassInfo属性,记录身高、体重,可以获取人的BMI指标

症状

  • BodyMassInfo类的只是获取BMI指标,属性也比较固定没有必要单独作为一个类
  • getBodyMassIndex不用单独作为函数

重构目标

  • 内联类,将BodyMassInfo的相关属性直接移入Person类中
  • 内联函数,消除getBodyMassIndex

image-20220429192010214.png

案例3

代码背景

  • 考虑到健康指标除了BMI和体脂比,还有基础代谢量,为了方便后续使用,增加了获取基础代谢的方法
  • 考虑到除了根据体脂比来判断是否肥胖,很多情况下也需要考虑腰臀比,所以增加一个腰臀比参数

症状

  • 过度设计了,方法只有测试用例调用
  • 参数并非真正需要,方法中也没有使用

重构目标

  • 移除死代码,先删除测试用例,再删除未使用函数
  • 改变函数声明,删除无用参数

image-20220429192113954.png

重构对比

image-20220429192259424.png

  • 重构后,需求可以实现且代码的结构有很大的简化,易读性和可维护性都得到了提高

相关技巧

对于代码中一些应对未来发展变化抽象出的接口、类、方法、字段等,可以基于IDEA的冗余代码识别进行辅助判断。
如下图:对于冗余的方法会以浅底色标注出来

image-20220429192457652.png

也可以直接在IDEA的Analyze——Inspect Code——Declaration redundancy中,批量发现冗余代码,快速定位到可能存在过度设计的位置,然后再结合人工进行判断

image-20220429192507774.png

image-20220429192534283.png

注:工具只能辅助人工发现一部分坏味道,更多的还是需要开发人员日常养成良好的习惯,并对代码进行仔细的梳理和排查

总结

image-20220429192557029.png

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

作者其他文章

评论(0

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

    全部回复

    上滑加载中

    设置昵称

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

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

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