代码重构:临时字段(Temporary Field)

举报
孙小北 发表于 2022/04/29 23:40:11 2022/04/29
【摘要】 什么是临时字段(Temporary Field)定义:某个实例变量仅为代码中一小部分功能临时所用而创建影响:通常一个对象会需要它的全部的变量。当一个变量看上去没什么用,却要试图了解他为什么在哪里时,会使类的作用变得更难理解,影响了代码的可读性和可维护性改进目标:消除临时字段,提升代码可读性、可维护性方法:提取类;引入特例 案例1代码背景Account为用户账户类,包含用户名、卡号、余额等信...

什么是临时字段(Temporary Field)

  • 定义:某个实例变量仅为代码中一小部分功能临时所用而创建
  • 影响:通常一个对象会需要它的全部的变量。当一个变量看上去没什么用,却要试图了解他为什么在哪里时,会使类的作用变得更难理解,影响了代码的可读性和可维护性
  • 改进目标:消除临时字段,提升代码可读性、可维护性
  • 方法:提取类;引入特例

案例1

代码背景

  • Account为用户账户类,包含用户名、卡号、余额等信息,以及一些未列举出来的账户信息
  • 日常消费中会频繁调用addToBalance、deductBalance、以及其他一些未列举的账户信息处理方法,更新账户信息
  • 每半年会调用evaluateAccount和evaluateConsumptionLevel方法,对账户进行一次评估

症状/问题

  • name、cardId、balance以及一些未列举的账户信息字段,在账户对象创建后,频繁会被使用。与对象绑定在一起,属于Account中的正常字段。
  • maxAsset、usageFrequency、overdueTimes,每半年才被赋值并使用一次。账户对象创建后,多数情况下是空值,毫无用处,属于临时字段

image-20220429192945993.png

  • 改进路线

image-20220429193018513.png

案例2

代码背景

  • RoutingHandler对消息进行路由处理,即我们关注的核心类
  • Message为消息体
  • 路由的目标对象,通过工厂RouterFactory进行创建
  • RouterFactory创建Router接口的实例,即具体的路由对象

症状/问题

  • 在handle方法中,我们需要反复对msg.getPriority()是否为空进行判断,priority为空是一种特例,对空的处理少数情况下的处理逻辑,也可归属于临时字段范畴

image-20220429193156804.png

  • 改进路线

image-20220429193227221.png

问题:在handle方法中,我们需要反复对msg.getPriority()是否为空进行判断,priority为空是一种特例,对空的处理少数情况下的处理逻辑,也可归属于临时字段范畴

解决方案:我们可以使用“引入特例”的方法,为Router加入一个新的实现类,用来专门处理这种少见的逻辑。此时便可将这种“临时的处理”搬移到类外面去

重构对比

image-20220429193345921.png

总结

image-20220429193405446.png

推荐

华为开发者空间发布

让每位开发者拥有一台云主机

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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