六大原则之单一职责原则
1、什么是单一职责原则
单一职责比较官方的的定义是:应该有且仅有一个原因引起类的变更。说的通俗点其实就
像是工厂里的流水线一样,每个车间基本上只做一件事,所有车间组合起来就是一个生产流程。我
们写程序的时候也可以这样,将一个类的功能细化一下争取做到一个类只做一件事。
其实这样做大家可能会产生一个疑问:那不是把一个本来只要一个类就可以完成的是分散
到多各类去会让程序变的很复杂?其实利用一个类做多件事虽然可以减低程序的复杂度,但是他带
来的确实更大的两个问题:(1)、第一个问题是:对于一个比较复杂的程序,一个类的分工不明
确会造成在写程序时的混乱,传个参数可能要想半天这样就大大的影响了写程序的效率。(2)、
第二问题是:一个项目不可能会一次成型,后期会对他进行扩展或者是维护,类的分工不明确在这
时就会牵一发而动全身,本来做一个类的修改就行的,但是因为高耦合使得我们必须对多个类进行
修改。在商业上会增加成本,在学习上变的高效。
2、单一职责原则的特点
(1)、类的复杂性降低,实现什么功能都清晰明确的定义;
(2)、可读性提高,复杂性降低;
(3)、可读性提高,则是可维护性提高;
(4)、变更引起的风险降低,变更是必不可少的,若接口做好单一原则,对系统的扩展性
、维护性都有非常大的帮助;
3、有对比才有高下
举一个用户信息管理系统的例子,用两种不同的方式写的,一个用了单一职责原则,一个没用。
我们先看没用的那个:
public class UserInfo implements IUserInfo { private String userName; private String userID; private String password; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserID() { return userID; } public void setUserID(String userID) { this.userID = userID; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } //修改用户密码 public boolean changePassword(String oldPassword){ System.out.println("密码修改成功..."); return true; } //删除用户 public boolean deleteUser(){ System.out.println("删除用户成功..."); return true; } }
此类有设置用户名、设置ID、设置密码、增删改等功能。
整个用户管理系统的类图如:
大家其实可以清晰的看到,这个类总体上来说有两个功能,一个是储存用户信息;一个是对系统内的用户信息进行管理。这么写也能达到我的目的,但是在后期的修改上会有比较大的问题,假如我要在用户的信息中添加一项属性E-mail那我要对IUserInfo接口进行修改,又假如我要对在管理系统中添加一个查找的功能我又得去修改IUserInfo接口这样当这个用户管理系统复杂以后容易造成逻辑混乱。
其实只要我们对这个用户管理系统的程序进行一个小小的修善就能让它变的清晰明朗,我们又何乐而不为呢!以下是对此管理系统的一个小的改进类图如下:
用户管理系统的类图2就基本上是每一个类的工作划分清晰了,其实这也就是单一职责的基本原理。
4、感悟
总的来说这些设计模式的原则,他是死的,主要是看我们怎么去运用它。这个单一职责的原则在每个类的设计中都可以用到。他就好像是公司的每个职位一样的,每个人都分配有自己的职责,你也志勇对你自己的任务负责就行了。
“过犹不及”这句话相信大家都听过,这句话放在这也是一个提醒。虽然单一职责的原则好,但是我有时候切不可将一个类划分的太过于细致,就是我们打电话的步骤:拨通电话、通话、挂断电话。这个我们不仅可能去每一步都去创建一个类,说是按照单一原则每一个步骤都进行划分,这样就属于钻了牛角尖的哪种。其实不管是我们的程序还是我们的生活中都要注意“过犹不及”这个词,万事万物都是有一个度的超过了这个度就容易钢过易折。有人肯定会问了:那么这个度我们应该怎么去把握呢?在这我只能:“呵呵”一声,然后告诉你这个完全要凭修为去把控。
5、单一职责的原则的优缺点分析
优点:
分工清晰明朗,做到引起变化的只有一个原因,出错时能快速锁定位置,也利于维护与扩展。
代码灵活。
缺点:
在比较小的项目中,会造成系统的复杂度增加的情况,类的增多会对运行效率有影响。