2.3.2、单一职责原则

单一职责原则 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;

发布了39 篇原创文章 · 获赞 2 · 访问量 5008

猜你喜欢

转载自blog.csdn.net/u013636987/article/details/104153733