在做代码练习或者开发的过程中,我们会发现自己写的类越来越大,该类的功能也越来越多。有一些开发者包括之前的我看到自己写的类够大,功能够多是往往会充满自豪感。但是当某个功能需要做一个小改动时,就会发现整个程序出现了各种大大小小的问题。

为什么知识对这个类的一个功能做了小小的修改就会引起这么大的问题?因为我们违反了单一职责原则。将多种功能集成在一个类中,就等于把这些功能耦合了起来,一个功能的变化可能会削弱或者抑制这个类完成其他职责的能力。而如果想要避免这种现象的发生,就要尽可能的遵守单一职责原则。此原则的核心就是解耦和增强内聚性。

1. 解说定义

定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。

在一个类中,可以导致类变更的因素最多只能有一个。何为类变更呢?当你要改变该类中某些代码时,该类的某些用途或特性会随着改变。
但是无论你怎么改,这个类只有最多一个用途或特性改变了,而不会再有其他的改变。只有这样一个类的改变对其他使用到该类的模块影响才会达到最低。也只有一个类只实现一个功能时才能做到到这种最小的改变。

2. 问题由来

类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。

3. 解决办法

遵循单一职责原则。分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。这样,当修改类T1时,不会使职责P2发生故障风险;同理,当修改T2时,也不会使职责P1发生故障风险。

4.职责扩散

很多程序员都清楚自己编程时要遵循单一职责原则,但总是在不经意间违反了这个原则。因为某种原因,某一职责需要分化为粒度更细的多个职责了,这就是职责扩散。

5.例子

public interface ICar { //品牌void setPinPai(String pinpai);void getPinPai();//颜色void setColor(String color);void getColor();//启动boolean Start(boolean start);//停车boolean Stop(boolean stop);
}

从上面例子中,我们不知道这个接口的具体职责是什么,有点模糊不清。车子的品牌和颜色是车子的属性,而启动和停车是车子的行为,将车子的属性和行为耦合到一个接口中,给人一种结构职责不清的感觉,对后期的维护带来一定的麻烦。

为了解决这个问题,应当使用单一职责原则,将车子接口中的业务对象(属性)和业务逻辑(行为)解耦,分成两个接口,如下:

/*** BO:Bussiness Object,业务对象  * 负责车子的属性  * @author 叶汉伟*/
public interface ICarBO {//品牌void setPinPai(String pinpai);void getPinPai();//颜色void setColor(String color);void getColor();
}
/**  * BL:Business Logic,业务逻辑  * 负责车子的行为  * @author 叶汉伟*/
public interface ICarBL {//启动boolean Start(boolean start);//停车boolean St#p%Cspan class="hljs-params">(boolean stop);
}

这样就实现了接口的单一职责原则。他们各自有一个实现类CarBO、CarBL。当需要修改车子属性的时候只需要对CarBO这个接口来修改,只会影响到CarBO这个类,不会影响其他类。

6. 优点

  1. 可以使得类的逻辑变得简单,功能清晰。每个类只负责一个职责,那么这个类的功能是非常清晰的,相比于有多个职责的类,单一职责的类的逻辑会更简单。
  2. 程序的可读性和可维护性相对较强。
  3. 降低变更引起的风险,对系统扩展性和维护性很有帮助。

但是,单一职责原则有时候会给我们带来一些麻烦。如果职责太多的话,每个职责一个类,会造成类的数量过多,反而降低了代码的可读性和程序的可维护性。所以使用这个职责的时候还要具体情况具体分析。建议就是接口一定要采用单一职责原则,实现类的设计上尽可能做到单一职责原则,最好是一个原因引起一个类的变化。

六大设计原则之单一职责原则(SRG)相关推荐

  1. 设计模式六大原则(一)----单一职责原则

    设计模式六大原则之[单一职则原则] 一.什么是单一职责原则 首先, 我们来看单一职责的定义. 单一职责原则,全称Single Responsibility Principle, 简称SRP. A cl ...

  2. Java设计原则之单一职责原则、开闭原则、里氏代换原则

    文章目录 面向对象设计原则概述 单一职责原则 开闭原则 里氏代换原则 面向对象设计原则概述 软件的可维护性(Maintainability)和可复用性(Reusability)是两个非常重要的用于衡量 ...

  3. 设计原则:单一职责原则

    单一职责原则(SRP) 单一职责原则的英文是 Single Responsibility Principle,缩写为 SRP.这个原则的英文描述是这样的:A class or module shoul ...

  4. 经典设计原则:单一职责原则(SRP)

    本文详解设计原则中的单一职责原则,目的还是提高代码的可读性.可扩展性.复用性.可维护性等. 目录 1. 单一职责原则(SRP) 2. 如何理解单一职责原则? 3. 如何判断类的职责是否足够单一? 4. ...

  5. 面向对象的七种原则:单一职责原则,开放关闭原则

    我们的知识星球马上就要开始更新设计模式了,在更新设计模式之前,我们是不是需要做一些准备呢?否则设计模式中一些遵循的原则大家会一头雾水,所以我今天来给大家说一些面向对象的七种原则,有人说是6种有人说是7 ...

  6. SOLID原则:单一职责原则(SRP)

    SOLID:SOLID 原则并非单纯的1个原则,而是由5个设计原则组成,它们分别是:单一职责原则.开闭原则.里式替换原则.接口隔离原则和依赖反转原则,SOLID 由5个设计原则的头一个字母组成. 如何 ...

  7. 接口隔离原则和单一职责原则区别

    接口隔离原则和单一职责原则区别 单一职责原则是备受争议的原则,根据不同的业务逻辑,它会将系统功能模块划分成不同种类,产生多样的接口,同时每个接口尽量只包含一个功能(方法). 而产生争议的原因就是这个业 ...

  8. 六大设计原则之单一职责原则

    单一职责原则 单一职责原则(Single Responsibility Principle)–SRP: There should never be more than one reason for a ...

  9. 6大设计原则之单一职责原则

    单一职责原则 如果有一个用户管理类,类图如下 我想,任谁也能看的出这个接口设计的有问题,用户的属性和用户的行为没有分开,应该把用户的信息抽取成一个业务对象,把用户的行为抽取成一个业务对象,按照这个思路 ...

最新文章

  1. 不要为了面子伤了自己
  2. 教你实现GPUImage【OpenGL渲染原理】
  3. 2.登录linun 输入密码登录不进去 进入单用户模式 修改 然后reboot
  4. java-垃圾回收的并行与并发
  5. [译+改]最长回文子串(Longest Palindromic Substring) Part II
  6. 中判断字符串是否为空_自己动手编写VBA代码,判断一个工作表是否为空,然后删除它...
  7. spring cloud构建互联网分布式微服务云平台-Spring Cloud Commons 普通抽象
  8. web 开发 —— html 与 css(div)
  9. 3. Node.js REPL(交互式解释器)
  10. C盘\用户目录下\管理员文件夹 如何重命名?
  11. FPGA 可编程性与布局布线原理探究
  12. httpClient发送post请求,带header、body的工具类
  13. HCNP——静态路由
  14. 酒店管理系统——界面设计
  15. cad引出线段lisp_lisp将多条线条合并成一条多段线
  16. 聚焦物流4大场景,RPA如何降低物流企业运营成本
  17. windows下安装PHP的swoole拓展
  18. 无存储式优惠券编码方案
  19. LOOPS HDU - 3853 dp求期望值
  20. vc6.0关于code jock在打开多文档debug版本崩溃的问题解决

热门文章

  1. PVE7.显示CPU和硬盘温度
  2. 软件测试工程师的技能树
  3. 学java web_你为什么要学Java Web
  4. ubuntu终端安装和卸载软件
  5. JAV反射机制 ——认识class类
  6. 推荐几个下载最快的maven仓库镜像站
  7. 用Tushare下载A股所有股票数据
  8. 示波器数据导入MATLAB进行后续分析
  9. 【Mac 教程系列第 6 篇】如何显示隐藏文件以及如何隐藏文件
  10. Chrome谷歌浏览器如何永久阻止自动升级更新