您的位置:首页 > 编程语言

编写直观的代码——单一职责原则

2016-01-23 18:38 246 查看

什么单一职责原则

单一职责原则的英文名称是Single Responsibility Principle,缩写SRP。SRP的定义是:就一个类而言,应该仅有一个引起它变化的原因。简单来说,一个类中应该是一组相关性很高的函数、数据的封装。

就一个模块、一个类、一个方法等大小不一的单位来说,尽量让简单明了、功能单一,这样做的好处是利于我们后续的维护,其他人看我们所编写的代码也会很好理解,因为这些“单位”编写符合单一职责原则,代码简洁明了、通俗易懂。

单一职责原则是实现高内聚、低耦合的指导方针,它是最简单但又最难运用的原则。因为单一职责原则没有明确的定义,需要设计人员发现类的不同职责并将其分离,而发现类的多重职责需要设计人员具有较强的分析设计能力和相关实践经验。

Android源码中的单一职责原则体现

关于单一职责原则在Android源码中的体现随处可见,说起来可能很搞笑、我们在日常开发中调用的api都是很有规律的,例如我们绘制UI的时候回经常用到Button、TextView、EditText等控件,我们先来看看他们之间有什么关系。

下面是TextView class的继承关系:



我们可以看到Button和EditText都继承TextView,因为Button和EditText的展现形式,和行为有所差异,所以被设计成两个独立的类,而不是耦合在一起,这其中就有单一职责原则的体现。想必大家看到这里对单一职责有所体会了吧。这样的设计是的每个类的任务(职责)更加明确、更加单一,维护起来就会很方便、使用者也很容易掌握每个类的功能与用法了。

被你忽略的单一职责原则

其实我们平时开发、编写代码的时候一定或多或少的接触过单一职责原则、只是我们那时还不知道有这么一个概念、或者说没有注意到这种做法的好处。

接下来我们结合一个小例子来讲解一下我们日常开发中运用的单一职责:

下面的代码可能很多初学者或多或少的都这么干过,让我们回味一下吧,

[code] @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button) findViewById(R.id.btnShowText);
        final TextView textView = (TextView) findViewById(R.id.textView);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textView.setText("HelloWorld!");
            }
        });
    }


上面代码代码看似没什么问题,可能很多初学者都会这么编写,将所有的控件的实例化与事件的绑定都写在了onCreate方法中,上面只有两个控件和一个事件绑定、但是我们日常开发中一个页面可能会有很多的控件需要初始化、需要绑定事件、设置不同的参数等,如果都写到onCreate就会是的onCreate方法看起来很乱,不易维护,那么我们将上面的代码稍稍修改一下如下:

[code]    Button button;
    TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        bindClickListener();

    }

    private void initView() {
        button = (Button) findViewById(R.id.btnShowText);
        textView = (TextView) findViewById(R.id.textView);
    }

    private void bindClickListener() {
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textView.setText("HelloWorld!");
            }
        });
    }


如上代码所述,我们将View的初始化与事件的绑定封装成了两个方法,这里处理体现出封装的特性之外,那就是单一职责原则的体现了。两个方法的职责不同,initView方法的职责为初始化View、bindClickListener方法的职责为为View绑定对应的事件监听器。

改成上述代码之后相对来说代码更加直观,更加容易维护了。如果他人来维护我们的代码了,相信也会很容易定位每个方法具体是干什么的了。这种编写代码的方式很容易让其他维护人员理解我们的编写代码思路,好处不言而喻啊。

以上的代码只是为了帮助立即单一职责原则而用,实际开发中大家可以根据实际情况灵活运用。

上述如有描述不当、欢迎大家拍砖、留言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: