代码重构:纯稚的数据类(Data Class)

举报
孙小北 发表于 2022/04/30 00:12:16 2022/04/30
【摘要】 什么是“纯稚的数据类”?定义: DataClass是指:它们拥有一些字段,以及用于访问(读写)这些字段的函数,除此之外一无长物。这样的类只是一种不会说话的数据容器。影响: DataClass将数据与行为间关系割裂,破坏了面向对象的精髓。特定数据的操作分散在代码各处,可能造成代码霰弹式修改改进目标: 将特定数据的操作集中在一个地方,提高代码的可读性、可维护性、可扩展性等方法: 封装变量、封装...

什么是“纯稚的数据类”?

  • 定义: DataClass是指:它们拥有一些字段,以及用于访问(读写)这些字段的函数,除此之外一无长物。这样的类只是一种不会说话的数据容器。
  • 影响: DataClass将数据与行为间关系割裂,破坏了面向对象的精髓。特定数据的操作分散在代码各处,可能造成代码霰弹式修改
  • 改进目标: 将特定数据的操作集中在一个地方,提高代码的可读性、可维护性、可扩展性等
  • 方法: 封装变量、封装集合、搬移函数、抽取方法、移除设值函数

“纯稚的数据类”有哪些表现,如何重构?

案例背景:部门及员工信息管理

public class Staff {
    private final String name; // 员工姓名

    private final Gender gender; // 员工性别

    private final int age; // 员工年龄

    private final String departmentName; // 员工所在部门

    public Staff(String name, Gender gender, int age, String departmentName) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.departmentName = departmentName;
    }

    public String getName() {
        return name;
    }

    public Gender getGender() {
        return gender;
    }

    public int getAge() {
        return age;
    }

    public String getDepartmentName() {
        return departmentName;
    }
}

image-20220429215743221.png

重构步骤:
1.修改public属性访问修饰符为private
2.不需要设值的属性删除set方法,提供构造方法
3.集合属性删除设值函数,并提供add/delete方法
4.集合属性的get,返回不可变集合,避免外部修改

DataClass特点:仅有值域及访问值域函数
重构:封装变量、删除设值函数、封装集合

image-20220429215816560.png

症状/问题

  • 在hrbp和audit类中,都存在调用department的staffs,统计部门里男女员工数量的代码片段,属于功能重复
  • 人数统计功能,用的都是department内部属性,应该放在department中,功能更内聚

image-20220429215842636.png

重构:抽取方法

image-20220429215914302.png

重构:函数搬移

image-20220429215934608.png

纯数据类必须要重构吗?

  • 并非所有纯稚的数据类都需要重构,先分析其被调用点的行为特点

image-20220429220008408.png

总结

image-20220429220031270.png

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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