软件设计重构秘笈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;
}
}
总结
这个重构经常会用到,它和之前的“移动方法”有几分相似之处,让方法放在合适的类中,并且简化类的职责,同时这也是设计原则中五大原则之一和设计模式中的重要思想。