代码重构:数据泥团(Data Clumps)
【摘要】 代码重构:数据泥团(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)
重构手法
-
提炼类
-
引入参数对象
-
保持对象完整性
重构路线
-
将名字和地址抽取为独立的类,拆解不同领域;通过搬移方法将函数组合成类,使不同领域的数据与各自行为封装在一起
-
通过引入参数对象、保持对象完整性,简化方法的入参,简化调用
-
通过搬移方法将函数组合成类,使不同领域的数据与各自行为封装在一起
总结
注
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)