我们在来说一下单一职责原则。教课书给出的定义是:不要存在多于一个导致类变更的原因。对于这个定义的补充是一个类/接口/方法只负责一项职责。其实如果你不太理解这个单一职责原则的话,仅仅凭借这几句话很难去理解。
优秀的前辈告诉我们单一职责原则的优点是:可以降低类的复杂度,提高类的可读性;提高系统的可维护性,降低变更引起的风险。其实如果没有在项目实践中经历过,很难理解透前辈们留下的忠言。
下面我们通过一个一些简单的代码,更好的理解这一原则。代码如下:
package com.zybank.design.principle.singleresponsibility;
public class Bird {
public void mainMoveMode(String birdName){
System.out.println(birdName+"用翅膀飞");
}
}
package com.zybank.design.principle.singleresponsibility;
public class Test {
public static void main(String[] args){
Bird bird = new Bird();
bird.mainMoveMode("大雁");
}
}
在创建了一个Bird类,然后我在Test类中调用其中的方法。现在如果我传入一个鸵鸟参数,那怎么办?我们是不是要拓展Bird类如下:
package com.zybank.design.principle.singleresponsibility;
public class Bird {
public void mainMoveMode(String birdName){
if("鸵鸟".equals(birdName)){
System.out.println(birdName+"用脚走");
}else{
System.out.println(birdName+"用翅膀飞");
}
}
}
如果我们这样拓展,就不是遵循单一职责原则。为了更好的遵循单一职责原则,我们可以这样拆分Bird类:
package com.zybank.design.principle.singleresponsibility;
public class FlyBird {
public void mainMoveMode(String birdName){
System.out.println(birdName+"用翅膀飞");
}
}
package com.zybank.design.principle.singleresponsibility;
public class WalkBird {
public void mainMoveMode(String birdName){
System.out.println(birdName+"用脚走");
}
}
package com.zybank.design.principle.singleresponsibility;
public class Test {
public static void main(String[] args){
FlyBird flyBird = new FlyBird();
flyBird.mainMoveMode("大雁");
WalkBird walkBird = new WalkBird();
walkBird.mainMoveMode("鸵鸟");
}
}
我们在应用层做好判断传入的是大雁还是鸵鸟。以上这些我们是从的类的角度遵循单一职责原则,下面我们从接口的角度遵循该原则,我们有一个课程接口如下:
package com.zybank.design.principle.singleresponsibility;
public interface Course {
String getCourseName();
byte[] getCourseVideo();
void studyCourse();
void refundCourse();
}
通过观察该接口中的方法,我们可以发现,该接口主要有两个职责:一个职责是获取课程的内容,一个是管理课程。根据单一职责原则,我们需要将这个接口拆开如下:
package com.zybank.design.principle.singleresponsibility;
public interface CourseManager {
void studyCourse();
void refundCourse();
}
package com.zybank.design.principle.singleresponsibility;
public interface CourseContent {
String getCourseName();
byte[] getCourseVideo();
}
我最后在从方法的层面看单一职责原则:
package com.zybank.design.principle.singleresponsibility;
public class User {
public void updateUserInfo(String userName,String address){
userName = "张三";
address = "中原银行";
}
}
这里有一个updateUserInfo()方法,这个方法的职责是更新用户名和地址,按照单一职责原则,该方法被拆分成如下:
package com.zybank.design.principle.singleresponsibility;
public class User {
public void updateUserName(String userName){
userName = "张三";
}
public void updateUserAddress(String address){
address = "中原银行";
}
}
单一职责原则在很多项目开发中很多类,接口,方法都不符合该要求。有句话叫理想很丰满显示很骨感啊。因为我们在项目开发的过程中受很多因素的影响例如:项目的规模、项目的周期、技术人员的水平,项目是否有deadline等。如果我们在项目中没有很好的面向接口编程,但是很好的遵循了单一职责原则,我们的项目的类会爆炸的。总结,我们在实际的项目开发中我们的接口和方法一定要做到单一职责,类的单一职责看实际情况吧。
-------------------------------------------------------------------------
中原银行总行科技岗内推,加我微信:18236913621。更新时间:2018年12月14日。