单一职责原则 Single Responsibility Principle(SRP)
定义
- 应该有且仅有一个原因引起类的变更。There should never be more than one reason for a class to change.
我们在创建对象的时候,需要结合实际使用情况,尽量使得一个对象完成单一的职责或者功能。当项目需要修改某个功能时,确保有且仅有一个原因引起类的变更。例子如下
我们以一个网络通讯中,文件上传、param参数上送、文件和param参数一起上送为例子。
我们知道网络通讯中的上送数据格式是分成很多种的,常见的有get和post,post我们可以通过表单格式提交,也可以用流方式加上分隔符方式提交等等。
我们假如需要完成get上送参数对,post上送文件、上送参数对功能
1、符合SRP原则
我们分别创建3个功能3个类
public class GetParam {
public void execute()
{
Log.e("ldy","以get方式上送param");
}
}
public class PostFile {
public void execute()
{
Log.e("ldy","以post方式上送file");
}
}
public class PostParam {
public void execute()
{
Log.e("ldy","以post方式上送param");
}
}
//测试时这样调用
GetParam getParam=new GetParam();
getParam.execute();
PostFile postFile=new PostFile();
postFile.execute();
PostParam postParam=new PostParam();
postParam.execute();
2、方法级别不符合SRP
在一个类里面创建三个公有方法给其他类调用
public class NetworkMethod {
public void getParam()
{
Log.e("ldy","以get方式上送param");
}
public void postParam(){
Log.e("ldy","以post方式上送param");
}
public void postFile(){
Log.e("ldy","以post方式上送file");
}
}
//测试时这样调用
NetworkMethod networkMethod=new NetworkMethod();
networkMethod.getParam();
networkMethod.postFile();
networkMethod.postParam();
3、代码级别不符合SRP
在一个类里面创建一个公有方法给其他类调用,该方法调用三个私有方法。
public class NetworkCode {
public final static String GET_PARAM="GET_PARAM";
public final static String POST_PARAM="POST_PARAM";
public final static String POST_FILE="POST_FILE";
public void execute(String type)
{
switch (type)
{
case GET_PARAM:
getParam();
break;
case POST_PARAM:
postParam();
break;
case POST_FILE:
postFile();
break;
default:
break;
}
}
private void getParam()
{
Log.e("ldy","以get方式上送param");
}
private void postParam(){
Log.e("ldy","以post方式上送param");
}
private void postFile(){
Log.e("ldy","以post方式上送file");
}
}
//测试这样调用
NetworkCode networkCode=new NetworkCode();
networkCode.execute(NetworkCode.GET_PARAM);
networkCode.execute(NetworkCode.POST_FILE);
networkCode.execute(NetworkCode.POST_PARAM);
假如我们代码过了段时间,需要把post上送文件功能改成post上送文件和param参数功能。我们看三种方式代码的修改量。
1、符合SRP原则
修改PostFile类。
2、方法级别不符合SRP
修改NetworkMethod中的postFile方法。
3、代码级别不符合SRP
需要修改NetworkCode类中的常量,execute方法,postFile方法。
如果逻辑比较复杂的类中,代码级别不符合SRP,很可能因为修改某个功能,漏改了某个地方造成错误。另外如果类中的方法过多,方法级别不符合SRP也会有此问题。
因此,我个人的想法是功能类尽可能的细分。以保证每个功能逻辑足够简单。类中的方法数量和同目录类数量尽量差不多,这样方便维护。总之尽量遵循两个原则。
A.只有逻辑足够简单,才可以在代码级别上违背SRP;
B.只有类中方法数量足够少,才可以在方法级别上违背SRP;