软件设计重构秘笈14式-13分离职责

101 阅读1分钟

软件设计重构秘笈14式-13分离职责

概念

本文中的“分离职责”是指当一个类有许多职责时,将部分职责分离到独立的类中, 这样也符合设计模式原则的单一职责原则,同时也可以使代码的结构更加清晰,维护性更高。

意图

分离职责将部分职责分离到独立的类中,使代码维护性更好。 如下代码所示,Video类有两个职责,一个是处理video rental,另一个是计算每个客户的总租金。 我们可以将这两个职责分离出来,因为计算每个客户的总租金可以在Customer计算,这也比较符合常理。

案例

public class Video {

    public void payFee() {

    }

    public void rentVideo(Video video,Customer customer) {
        customer.getVideos().add(video);
    }

    public double calculateBalance(Customer customer) {
        List<Double> lateFees = customer.getLateFees();
        double sum = lateFees.stream().mapToDouble(Double::valueOf).sum();
        return sum;
    }

}

public class Customer {

    private List<Double> lateFees = new ArrayList<>();

    private List<Video> videos = new ArrayList<>();

    public List<Double> getLateFees() {
        return lateFees;
    }

    public void setLateFees(List<Double> lateFees) {
        this.lateFees = lateFees;
    }

    public List<Video> getVideos() {
        return videos;
    }

    public void setVideos(List<Video> videos) {
        this.videos = videos;
    }
}

重构

重构后的代码如下,这样Video 的职责就变得很清晰,同时也使代码维护性更好。

public class Video {
    
    public void rentVideo(Video video,Customer customer) {
        customer.getVideos().add(video);
    }
}

public class Customer {

    private List<Double> lateFees = new ArrayList<>();

    private List<Video> videos = new ArrayList<>();
    
    public void payFee() {

    }

    public double calculateBalance(Customer customer) {
        double sum = lateFees.stream().mapToDouble(Double::valueOf).sum();
        return sum;
    }

    public List<Video> getVideos() {
        return videos;
    }
}

总结

这个重构经常会用到,它和之前的“移动方法”有几分相似之处,让方法放在合适的类中,并且简化类的职责,同时这也是设计原则中五大原则之一和设计模式中的重要思想。