编写直观的代码——单一职责原则
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绑定对应的事件监听器。
改成上述代码之后相对来说代码更加直观,更加容易维护了。如果他人来维护我们的代码了,相信也会很容易定位每个方法具体是干什么的了。这种编写代码的方式很容易让其他维护人员理解我们的编写代码思路,好处不言而喻啊。
以上的代码只是为了帮助立即单一职责原则而用,实际开发中大家可以根据实际情况灵活运用。
上述如有描述不当、欢迎大家拍砖、留言。
相关文章推荐
- C++ memcpy()函数用法
- 【MOOC】Java语言程序设计进阶—第0周
- C++ static关键字
- Qt动画与Qt坐标小记
- LayoutParams,setContentView,generateDefaultLayoutParams
- NetBeans找不到C/C++编译器
- C语言:运行中获取宏名字的技巧
- 变形空间和候选消除算法(Candidate-Elimination)C++实现
- JAVA基础笔记2--认识Eclipse IDE
- struts-2.3.24+spring-framework-4.1.6.RELEASE+hibernate-release-4.3.10.Final 集成开发
- spring Security oAuth2例子分析
- Netty权威指南-NIO实现TimeClient客户端源代码
- Netty权威指南-NIO实现TimeServer服务器端源代码
- JAVA设计模式(DESIGN PATTERNS IN JAVA)读书摘要 第1部分接口型模式——第4章 外观(Facade)模式
- SpringMVC 多文件上传
- C++之路进阶——splay树(序列终结者)
- Python 插件安装
- Django后台管理中上传的图片访问不了问题
- .NET Core 1.0、ASP.NET Core 1.0和EF Core 1.0简介
- 简单理解python下的字符串