代码重构:过大的类(Large Class)
【摘要】 什么是过大的类定义:由于属性未分组和职责不单一而包含过多属性、方法和代码行的类影响:随着属性、方法和代码行数的不断增加,重复代码接踵而至,最终走向混乱改进目标:拆分过大的类,确保类职责单一方法:提取类提取子类提取接口/超类 案例1public class Workman { private final String name; private final Gender g...
什么是过大的类
- 定义:由于属性未分组和职责不单一而包含过多属性、方法和代码行的类
- 影响:随着属性、方法和代码行数的不断增加,重复代码接踵而至,最终走向混乱
- 改进目标:拆分过大的类,确保类职责单一
- 方法:
提取类
提取子类
提取接口/超类
案例1
public class Workman {
private final String name;
private final Gender gender;
private final String phoneNumber;
private final String email;
private final String weChat;
private final String QQ;
private final CareerInfo careerInfo;
public Workman(String name, Gender gender, String phoneNumber, String email, CareerInfo careerInfo,
String weChat, String QQ) {
this.name = name;
this.gender = gender;
this.phoneNumber = phoneNumber;
this.email = email;
this.careerInfo = careerInfo;
this.weChat = weChat;
this.QQ = QQ;
}
/**
* 生成人员信息
*
* @return 人员信息
*/
public String generatePersonInfo() {
if (Career.TEACHER.equals(this.careerInfo.getCareer())) {
return generateTeacherInfo();
}
if (Career.DOCTOR.equals(this.careerInfo.getCareer())) {
return generateDoctorInfo();
}
return "invalidPersonInfo";
}
private String generateDoctorInfo() {
return generateBasicInfo()
+ "hospital: " + this.careerInfo.getWorkplace() + LINE_SEPARATOR
+ "doctors' duties: " + showDoctorsDuty() + LINE_SEPARATOR
+ "Salary after 3 years: " + getDoctorSalaryAfterThreeYears();
}
private String generateTeacherInfo() {
return generateBasicInfo()
+ "teachers' hopes: " + showTeachersHope() + LINE_SEPARATOR
+ "school: " + this.careerInfo.getWorkplace() + LINE_SEPARATOR
+ "Salary after 2 years: " + getTeacherSalaryAfterTwoYears();
}
private String generateBasicInfo() {
return "basic info: " + getBasicInfo() + LINE_SEPARATOR
+ "contact info: " + getContactInfo() + LINE_SEPARATOR;
}
private String getBasicInfo() {
return LINE_SEPARATOR
+ "\tname: " + name + LINE_SEPARATOR
+ "\tgender: " + gender.name();
}
private String getContactInfo() {
return LINE_SEPARATOR
+ "\tphoneNumber: " + phoneNumber + LINE_SEPARATOR
+ "\temail: " + email + LINE_SEPARATOR
+ "\tweChat: " + weChat + LINE_SEPARATOR
+ "\tQQ: " + QQ;
}
private double getDoctorSalaryAfterThreeYears() {
final double increaseRate = 0.1;
double salaryAfterYears = this.careerInfo.getSalary() * Math.pow(1 + increaseRate, 3);
return BigDecimal.valueOf(salaryAfterYears).setScale(1, RoundingMode.HALF_UP).doubleValue();
}
private double getTeacherSalaryAfterTwoYears() {
final double increaseRate = 0.08;
double salaryAfterYears = this.careerInfo.getSalary() * Math.pow(1 + increaseRate, 2);
return BigDecimal.valueOf(salaryAfterYears).setScale(1, RoundingMode.HALF_UP).doubleValue();
}
private String showDoctorsDuty() {
return "A doctor's work is to heal and save lives";
}
private String showTeachersHope() {
return "Every student can grow sturdily and get good grades";
}
}
代码背景
- 描述了一个打工人的数据模型
- Workman有姓名、性别、电话、邮件、微信、QQ等属性
症状
- phoneNumber、email、weChat、QQ等联系方式种类可能会经常调整,容易对Workman造成侵入式修改
重构目标
- 将phoneNumber、email、weChat、QQ等属性提取出Contacts类
案例1的重构效果
案例2
代码背景
- Workman有生成人员信息的方法,根据不同的职业调用各自的相关方法
症状
- 类功能职责不单一,获取医生工作信息和获取教师工作信息属于不同的功能子集
重构目标
- 根据不同职业提取子类,保证类功能职责单一
案例2的重构效果
案例3
症状
- 医生和教师类中有一系列相似的行为,调用方调用此类行为会随着职业增加而不断增加代码分支
重构目标
- 提取为(到)接口或超类,对功能进行封装
案例3的重构效果
重构对比
- 重构后,类的职责更加单一,可扩展、可维护、可读性上均有提升
总结
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)