代码重构:可变数据

举报
孙小北 发表于 2022/04/24 23:58:39 2022/04/24
【摘要】 代码重构:可变数据

什么是可变数据(Mutable Data)

  • 定义:可变数据——对数据的修改经常导致出乎意料的结果和难以发现的Bug。

  • 影响:影响可维护性,在一处修改数据,却在另一处造成难以发现的破坏

  • 改进目标:应用“数据不可变”:不可变性是强大的代码防腐剂

  • 方法:封装变量、拆分变量、提炼函数、移除设值函数、查询取代派生、Builder模式创建不可变对象、引用对象改为值对象、函数式编程等

  • 注:并非所有可变类型都是不良的,这里关注描述数据的可变类型

案例代码1

代码背景

  • 描述了发票的数据模型;

  • 发票有买方、卖方、还有多个明细行;

  • 每个明细行有商品名称、单价、数量、税率;

  • 票还有总价、税额的概念

症状/问题:数据应有明确含义,“可变”会引入不确定性,“可变”包括:

  • 同一变量用作不同目的:如InvoiceLine.setQuantity()方法中的sum变量

  • 用public修饰非final成员:

  • 有set方法(或其它改变数据的方法)

  • 一个字段的值可通过其他字段计算得到

  • 对外暴露内部字段的可变引用

改进目标

重构对比

总结

 可变数据症状

  • 一个变量用作不同目的
  • 数据类型中,用public修饰非final成员
  • 有set方法(或其它改变数据的方法)
  • 一个成员变量的值可通过其他字段计算得到
  • 对外暴露内部变量的可变引用

改进手法

  • 封装变量
  • 拆分变量(用提取函数):Ctrl+Atl+M
  • 移除设值函数:用内联移除、直接删除(Ctrl+Alt+N、Alt+Del)
  • Builder模式创建不可变对象

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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