软件设计重构秘笈20式-19提取子类

100 阅读1分钟

软件设计重构秘笈20式-19提取子类

概念

本文中的”提取子类”是指把基类中的一些不是所有子类都需要访问的方法调整到子类中。

意图

当你的基类中存在一些方法不是所有的子类都需要访问,你想将它们调整到子类中时,这个重构会变得很有用了。 如下代码所示,我们需要一个 Registration类用来处理学生选课的信息。但是当Registration类开始工作后, 我们意识到我们会在两种不同的上下文中使用Registration类,NonRegistrationAction和Notes只有在我们处理未注册情况下才用到。

所以我们将NonRegistration和Notes提到单独的NonRegistration类中。

案例

public class Registration {

    public NonRegistrationAction action;
    public double registrationTotal;
    public String notes ;
    public String description;
    public Date registrationDate;

    public NonRegistrationAction getAction() {
        return action;
    }

    public void setAction(NonRegistrationAction action) {
        this.action = action;
    }

    public double getRegistrationTotal() {
        return registrationTotal;
    }

    public void setRegistrationTotal(double registrationTotal) {
        this.registrationTotal = registrationTotal;
    }

    public String getNotes() {
        return notes;
    }

    public void setNotes(String notes) {
        this.notes = notes;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Date getRegistrationDate() {
        return registrationDate;
    }

    public void setRegistrationDate(Date registrationDate) {
        this.registrationDate = registrationDate;
    }
}

public class NonRegistrationAction {
}

重构

重构后的代码如下所示,这样也满足单一职责原则。同时也让类的结构变得更加清晰,增强了可维护性。

public class Registration {


    public double registrationTotal;
    public String description;
    public Date registrationDate;

    public double getRegistrationTotal() {
        return registrationTotal;
    }

    public void setRegistrationTotal(double registrationTotal) {
        this.registrationTotal = registrationTotal;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Date getRegistrationDate() {
        return registrationDate;
    }

    public void setRegistrationDate(Date registrationDate) {
        this.registrationDate = registrationDate;
    }
}

public class NonRegistration extends Registration {

    private NonRegistrationAction action;

    private String notes;

    public NonRegistrationAction getAction() {
        return action;
    }

    public void setAction(NonRegistrationAction action) {
        this.action = action;
    }

    public String getNotes() {
        return notes;
    }

    public void setNotes(String notes) {
        this.notes = notes;
    }
}

public class NonRegistrationAction {
}

总结

这个重构方法经常用来规范类的职责,和之前的一些重构方法也有些类似。