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

单一职责原则(SRP)

定义:一个类或者模块只负责完成一个职责(或者功能)。

从定义来看,一个类只负责完成一个职责或者功能。也就是说,不要设计大而全的类,要设计粒度小、功能单一的类。换个角度来讲就是,一个类包含了两个或者两个以上业务不相干的功能,那我们就说它的职责不够单一,应该将它拆分成多个功能更加单一、粒度更细的类。

单一职责被定义为“引起变化的原因”。如果我们有两个动机去改写一个方法,那么这个方法就具备两个职责。如果一个方法承担了太多职责,那么在需求变化过程中,需要改写的可能性就越大。

SRP 原则在很多设计模式中都有着广泛的运用,例如代理模式、迭代器模式、单例模式和装饰者模式。

举例:

在社交产品中,我们用UserInfo对象来记录用户的信息。UserInfo的设计是否满足单一职责原则。

UserInfo = {
userId: stirng,
username: string,
email: string,
telephone: string,
createTime: string,
avatar: string,
provinceOfAddress: string, // 省
cityOfAddress: string, // 市
regionOfAddress: string, // 区
// ...... 其他属性和方法
}

1、UserInfo对象包含的都是跟用户相关的信息,所有属性都属于用户这样的一个模型,满足单一职责原则

2、地址信息在UserInfo对象中,可以继续拆分成独立的UserAddress,UserInfo只保留其他信息,拆分之后更加单一。

如果在这个产品中,用户信息和其他信息一样,只是单纯展示,那么UserInfo就是合理的,如果用户的地址信息还用在电商物流中,那么最好将地址信息拆分出来,独立成用户物流信息或者叫地址信息、收获信息。

评价一个类或者对象职责是否单一,并没有非常明确、可以量化的标准。在真正的开发中,没必要过于未雨绸缪,过度设计,为了设计而设计。

何时应该分离职责

1、在ajax请求的时候,创建xhr对象和发送xhr请求几乎总是在一起的,那么创建xhr和发送xhr的职责就没必要分开

2、职责的变化轴线仅当它们确定变化时才有意义,即使两个职责已经耦合在一起,但它们还没有改变的征兆,没必须主动分离,在重构的时候分离也不迟。

违反SRP原则

比如jQuery中attr方法,明显违反了SRP原则。jQuery的attr方法非常庞大,即负责取值,又负责赋值。但是对于用户来说,简化了用户的使用。

SRP优缺点

优点:降低了单个类或者对象的复杂度,按照职责把对象分解成更小的粒度,有助于代码的复用,也有利于进行单元测试。当一个职责需要变更的时候不会影响其他的职责。

缺点:增加代码的复杂度。当我们按照职责把对象分解成更小的粒度之后,实际上也增大了这些对象之间相互联系的难度。

设计模式 > 单一职责原则的更多相关文章

  1. C#软件设计——小话设计模式原则之:单一职责原则SRP

    前言:上篇C#软件设计——小话设计模式原则之:依赖倒置原则DIP简单介绍了下依赖倒置的由来以及使用,中间插了两篇WebApi的文章,这篇还是回归正题,继续来写写设计模式另一个重要的原则:单一职责原则. ...

  2. 【设计模式六大原则1】单一职责原则(Single Responsibility Principle)

        http://blog.csdn.net/zhengzhb/article/category/926691/1 图片素材来源,java学习手册 ps.内容为自己整理   定义:不要存在多于一个 ...

  3. 设计模式之单一职责原则(SRP)

    自己之前写过一些关于设计模式的博客,但是大部分都写得比较匆忙.现在正好趁年前有时间,笔者打算好好地整理一下自己这块知识结构.开篇的第一个原则就是设计原则里面最简单的一个原则--单一职责原则. 想必大家 ...

  4. 《javascript设计模式与开发实践》--- (单一职责原则)

    看的这本书叫<JavaScript设计模式与开发实践> 先规划一下看书的顺序,基础知识我已经大概的浏览了一遍了,没有留下笔记,以后有时间还会补上.本来打算顺着看的.但是我感觉我很难短时间内 ...

  5. 设计模式笔记:单一职责原则(SRP, Single Responsibility Principle)

    1. 单一职责原则核心思想 一个类应该有且只有一个变化的原因. 2. 为什么引入单一职责原则 单一职责原则将不同的职责分离到单独的类,每一个职责都是一个变化的中心. 在SRP中,把职责定义为变化的原因 ...

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

    zt 设计模式六大原则(1):单一职责原则 分类: 设计模式 2012-02-21 09:52 25059人阅读 评论(65) 收藏 举报 设计模式stringclass编程 (THERE SHOUL ...

  7. 设计模式六大原则(一):单一职责原则(Single Responsibility Principle)

    单一职责(SRP)定义: 不要存在多于一个导致类变更的原因,通俗的说,即一个类只负责一项职责. 问题由来: 类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而需要修改类T时,有可 ...

  8. 北风设计模式课程---单一职责原则(Single Responsibility Principle)

    北风设计模式课程---单一职责原则(Single Responsibility Principle) 一.总结 一句话总结: 一个类应该有且只有一个变化的原因:单一职责原则(SRP:Single Re ...

  9. java设计模式学习笔记--单一职责原则

    单一职责原则注意事项和细节 1.降低类的复杂度,一个类只负责一项职责 2.提高可读性,可维护性 3.降低变更引起的风险 4.通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单 ...

  10. 深入浅出系列第一篇(设计模式之单一职责原则)——从纯小白到Java开发的坎坷经历

    各位看官大大们,晚上好.好久不见,我想死你们了... 先说说写这个系列文章的背景: 工作了这么久了,每天都忙着写业务,好久没有好好静下心来好好总结总结了.正好这段时间公司组织设计模式的分享分,所以我才 ...

随机推荐

  1. [常用工具] OpenCV获取网络摄像头实时视频流

    所需要硬件及软件环境: python 3/OpenCV3.4 or C++11/OpenCV3.4 1 RTSP协议 RTSP (Real Time Streaming Protocol),是一种语法 ...

  2. [OpenCV实战]15 基于深度学习的目标跟踪算法GOTURN

    目录 1 什么是对象跟踪和GOTURN 2 在OpenCV中使用GOTURN 3 GOTURN优缺点 4 参考 在这篇文章中,我们将学习一种基于深度学习的目标跟踪算法GOTURN.GOTURN在Caf ...

  3. 我居然不知道Vue3可以使用hooks函数实现代码复用?

    每天都要开心(▽)哇: 项目开发过程中,我们会遇到一些情况,就是多个组件都可以重复使用的一部分代码逻辑,功能函数,我们想要复用,这可怎么办呢? VUE2我们是怎么做的呢? 在vue2 中有一个东西:M ...

  4. ng + zorro angular表格横纵向合并,横向目前是手动,纵向是自动合并,微调后可适配三大框架使用

    表格横纵向合并,可以看一下代码编写之前和之后的样式,先上图~~ 表格页面文件.html <h1>正常表格</h1> <nz-table #colSpanTable [nz ...

  5. Jvm--MinorGC过程

    第一次GC: 在不断创建对象的过程中,当Eden区域被占满,此时会开始做Young GC也叫Minor GC 1)第一次GC时Survivous中S0区和S1区都为空,将其中一个作为To Surviv ...

  6. DataX插件二次开发指南

    一. DataX为什么要使用插件机制? 从设计之初,DataX就把异构数据源同步作为自身的使命,为了应对不同数据源的差异.同时提供一致的同步原语和扩展能力,DataX自然而然地采用了框架 + 插件 的 ...

  7. saas架构之druid解析表名

    public void preHandle(BoundSql boundSql, RequestEntity requestEntity) { System.out.println("要执行 ...

  8. drf-restful规范、django原生编写接口

    1.restful规范 REST全称是Representational State Transfer,中文意思是表述:表征性状态转移,它首次出现在2000年Roy Fielding的博士论文中.RES ...

  9. 分布式机器学习:异步SGD和Hogwild!算法(Pytorch)

    1 导引 我们在博客<分布式机器学习:同步并行SGD算法的实现与复杂度分析(PySpark)>和博客<分布式机器学习:模型平均MA与弹性平均EASGD(PySpark) >中介 ...

  10. 通过URL地址将图片保存到本地

    今天一朋友问我如何通过URL地址将图片保存下来. 特地找了些资源,实现了一下代码: using System; using System.Drawing; using System.Drawing.I ...