代码重构:过大的类(Large Class)

举报
孙小北 发表于 2022/04/29 23:57:58 2022/04/29
【摘要】 什么是过大的类定义:由于属性未分组和职责不单一而包含过多属性、方法和代码行的类影响:随着属性、方法和代码行数的不断增加,重复代码接踵而至,最终走向混乱改进目标:拆分过大的类,确保类职责单一方法:提取类提取子类提取接口/超类 案例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类

image-20220429212339184.png

案例1的重构效果

image-20220429212404663.png

案例2

代码背景

  • Workman有生成人员信息的方法,根据不同的职业调用各自的相关方法

症状

  • 类功能职责不单一,获取医生工作信息和获取教师工作信息属于不同的功能子集

重构目标

  • 根据不同职业提取子类,保证类功能职责单一

image-20220429212530780.png

案例2的重构效果

image-20220429212549304.png

案例3

症状

  • 医生和教师类中有一系列相似的行为,调用方调用此类行为会随着职业增加而不断增加代码分支

重构目标

  • 提取为(到)接口或超类,对功能进行封装

image-20220429212635407.png

案例3的重构效果

image-20220429212651831.png

重构对比

  • 重构后,类的职责更加单一,可扩展、可维护、可读性上均有提升

image-20220429212709678.png

总结

image-20220429212736316.png

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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