代码重构:数据泥团(Data Clumps)

举报
孙小北 发表于 2022/04/26 23:58:35 2022/04/26
【摘要】 代码重构:数据泥团(Data Clumps)

什么是数据泥团(Data Clumps)

  • 定义:总是成块出现的相同数据项,包括多个类中相同的字段、多个方法签名中相同的参数等

  • 影响:成块出现的重复参数过多,影响阅读和理解,难维护

  • 改进目标:减少相同的字段及入参,缩短入参列,简化函数调用

  • 方法:提炼类;引入参数对象;保持对象完整性

案例代码

public class PersonInfoManage {
    private String firstName;

    private String lastName;

    private Gender gender;

    private String province;

    private String city;

    private String street;

    public PersonInfoManage(String firstName, String lastName, Gender gender, String province, String city,
        String street) {
        // …… do something. eg:check is legal
        this.firstName = firstName;
        this.lastName = lastName;
        this.gender = gender;
        this.province = province;
        this.city = city;
        this.street = street;
    }

    /**
     * 按打印格式获取姓名
     * 
     * @return 打印格式的姓名
     */
    public String getName() {
        // …… do something. eg: auth
        return "First Name: " + firstName + Constant.LINE_SEPARATOR
            + "Last Name: " + lastName;
    }

    /**
     * 按打印格式获取性别
     *
     * @return 性别
     */
    public Gender getGender() {
        return gender;
    }

    /**
     * 按打印格式获取地址信息
     * 
     * @return 地址信息
     */
    public String getAddress() {
        // …… do something. eg: auth
        return "Province: " + province + Constant.LINE_SEPARATOR
            + "City: " + city + Constant.LINE_SEPARATOR
            + "Street: " + street;
    }

    /**
     * 更新地址
     * 
     * @param province 省
     * @param city 市
     * @param street 街道
     */
    public void updateAddress(String province, String city, String street) {
        // …… do something. eg: auth, check……
        this.province = province;
        this.city = city;
        this.street = street;

        doNotify(province, city);
    }

    private void doNotify(String province, String city) {
        // …… do something. eg: notify others
        System.out.println("do something notify " + province + " " + city);
    }

    /**
     * 按打印格式获取搬移记录
     * 
     * @param newProvince 新省份
     * @param newCity 新城市
     * @param newStreet 新街道
     * @return 搬移记录
     */
    public String moveToAnotherPlace(String newProvince, String newCity, String newStreet) {
        // …… do something. eg: some business……
        return "move from: " + Constant.LINE_SEPARATOR
            + "\t" + this.province + " " + this.city + " " + this.street + Constant.LINE_SEPARATOR
            + "to: " + Constant.LINE_SEPARATOR
            + "\t" + newProvince + " " + newCity + " " + newStreet;
    }
}

代码背景

  • 一个人员信息管理类,包含了人员的姓名、性别、地址等信息,以及人员的信息获取、地址更新、位置移动等相关处理方法

症状/问题

  • 用户的名字(firstName,lastName)和所在的位置(provice,city,street)是没有直接关联的数据,但都以基本类型罗列在一起,导致参数过长

  • 成块的参数总是重复出现(provice,city,street)

重构手法

  • 提炼类

  • 引入参数对象

  • 保持对象完整性

重构路线

  • 将名字和地址抽取为独立的类,拆解不同领域;通过搬移方法将函数组合成类,使不同领域的数据与各自行为封装在一起

  • 通过引入参数对象、保持对象完整性,简化方法的入参,简化调用

  • 通过搬移方法将函数组合成类,使不同领域的数据与各自行为封装在一起

总结

1:数据泥团核心在于数据项是否成块的重复出现,故参数较少时也可能会有数据泥团。不过当参数较多时出现数据泥团的可能性更高,因此可优先排查

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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