设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123425 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

15 | 理论一:对于单一职责原则,如何判定某个类的职责是否够“单一”?

方法集中操作类中的某几个属性
难以命名
私有方法过多
类依赖其他类过多
代码行数、函数或属性过多
可维护性的问题
拆分类的例子
判断原则
无明确量化标准
贴近实际的例子
两种理解方式:模块比类更抽象;模块比类更粗粒度的代码块
从类的角度理解
一个类或模块只负责完成一个职责
职责设计的越单一越好?
判断职责是否单一
理解
定义
单一职责原则的延伸应用
判断类的职责单一的其他方法
单一职责原则
课堂讨论
SOLID原则
如何判定某个类的职责是否够“单一”?

该思维导图由 AI 生成,仅供参考

上几节课中,我们介绍了面向对象相关的知识。从今天起,我们开始学习一些经典的设计原则,其中包括,SOLID、KISS、YAGNI、DRY、LOD 等。
这些设计原则,从字面上理解,都不难。你一看就感觉懂了,一看就感觉掌握了,但真的用到项目中的时候,你会发现,“看懂”和“会用”是两回事,而“用好”更是难上加难。从我之前的工作经历来看,很多同事因为对这些原则理解得不够透彻,导致在使用的时候过于教条主义,拿原则当真理,生搬硬套,适得其反。
所以,在接下来的讲解中,我不仅会讲解这些原则的定义,还会解释这些原则设计的初衷,能解决哪些问题,有哪些应用场景等,让你知其然知其所以然。在学习的时候,希望你能跟上我的思路,把握住重点,真正做到活学活用。

如何理解单一职责原则(SRP)?

文章的开头我们提到了 SOLID 原则,实际上,SOLID 原则并非单纯的 1 个原则,而是由 5 个设计原则组成的,它们分别是:单一职责原则、开闭原则、里式替换原则、接口隔离原则和依赖反转原则,依次对应 SOLID 中的 S、O、L、I、D 这 5 个英文字母。我们今天要学习的是 SOLID 原则中的第一个原则:单一职责原则。
单一职责原则的英文是 Single Responsibility Principle,缩写为 SRP。这个原则的英文描述是这样的:A class or module should have a single responsibility。如果我们把它翻译成中文,那就是:一个类或者模块只负责完成一个职责(或者功能)。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了类的单一职责原则(SRP)及其在实际应用中的复杂性。作者首先介绍了SRP的定义和应用,强调了类应该具有粒度小、功能单一的特点。通过实际例子阐述了当一个类包含多个不相关的功能时,需要将其拆分成更加单一、粒度更细的类。文章还提到了评价类职责单一性的一些指导原则,如类中代码行数、函数或属性过多、类依赖其他类过多等。作者强调了在不同业务层面看待类的设计,对类的职责是否单一会有不同的认识。最后指出了在软件开发中,类的设计应该满足业务需求,随着业务发展逐步进行持续重构。总的来说,本文深入浅出地解释了类的单一职责原则,为读者提供了一些实用的判断原则和技巧。文章通过具体例子阐述了拆分类的职责可能带来的新问题,强调了在判断类的职责单一性时需要综合考虑不同因素,以及单一职责原则的适用范围和局限性。文章内容丰富,逻辑清晰,对于软件开发人员和技术爱好者来说具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(215)

  • 最新
  • 精选
  • Luciano李鑫
    想请教一下争哥,关于代码代码持续重构的问题,所引出的额外测试、发布成本,和故障风险应该怎样平衡呢。

    作者回复: 我推荐持续重构,不推荐等到代码烂到一定程度之后的大刀阔斧的重构。持续重构就像开发一样,是开发的一部分,所以也不存在额外的测试、发布成本之说,你就当成开发来看就行了。后面会讲到重构,你到时候再看下是否还有疑问。

    2019-12-06
    12
    67
  • 一壶浊酒
    老师您好,有个问题想请教下,就是您举的UserInfo的例子,在抽取了地址相关的信息到新的类的时候,原来的userinfo类中需要再添加一个新的类的属性在里面么?感觉如果根据单一职责原则了话,新的类应该独立出来,UserInfo里应该不包含该类,那在这种情况下数据库的表一般会出现变化么?不然是否会造成一个新增的用户会在保存用户信息的时候对数据库进行两次操作?一次新增用户信息,然后获取了userId再进行一次操作修改地址相关信息?还是说在userinfo中存在新的地址相关类的属性,进行直接新增操作?因为没有这方面的实际经验,所以对这个比较疑惑。老师遇到这种情况一般作何处理

    作者回复: 数据库跟业务代码的设计不是强耦合的。不然,对业务代码进行重构,那数据库还得跟着改,谁还敢重构啊。 不管userinfo是否有address的信息,我们都可以转化成数据库想要的数据格式,再一次性地写入到数据库中。 userinfo是否包含address的信息?理论上,既然已经拆出来了,职责单一了,就不必要包含了。

    2020-01-05
    4
    42
  • Jxin
    回答问题: 1.不好说,职责单一这东西比较主观。得看自己对抽象出来的类的主观定义是什么。准的捏不住,但还是要把控一下范围的。 2.码出高效给出了方法行数不超过50行的一个基准标注。而我实践下来很难写出超过50行的方法,这50行还包括了大量注释。 3.方法的职责单一,业务领域的能力要单一(边界清晰)。 提问: 1.以前不代码规范不行,就逼着自己多思考,多写注释。现在养成了写注释的洁癖,不写就很难受。请问大佬,这怎么办,需要戒掉吗。我除了dao层的crud和数据类的setget外,其余方法都会带上注释。

    作者回复: 哈哈,写注释不是挺好的吗?我后面讲到编程规范的时候会详细讲如何写注释的。

    2019-12-06
    12
    14
  • 蚂蚁内推+v
    有个问题,比如有个OrderService中可能提供了各种订单查询、操作等,即一个OrderService有多个方法,是否符合SRP呢?

    作者回复: 一个service当然可以有多个方法了,只要方法都是一个业务领域的,没有明显违背SRP,实际上都是合理的。

    2019-12-09
    3
    10
  • 刘学习来学习
    前段时间需要对外提供sdk,最开始的设计就是根据职责定义了多个client对象供其他系统调用,后来角色不是很友好,最后还是提供了个聚合类,将所有的接口都集中到一起对外提供了,像这种情况,有的时候不知道该参考什么来设计

    作者回复: 后面facade设计模式会讲到你的问题

    2020-01-07
    5
  • 空也空
    “私有方法过多”为什么作为一个衡量标准呢?

    作者回复: 你这个问题确实是个好问题,我想想~

    2020-04-10
    5
    4
  • Cris
    老师,我今天听到了一个概念叫面向切片编程(aop),它和面向对象编程有什么联系呢?想听听老师的理解

    作者回复: 这两个没有关系的,你可以看下spring的aop

    2019-12-07
    3
    2
  • tuyu
    小争哥, 数据库设计是不是不太适合设计那种抽象类的数据库表结构, 这样我写bo就会就会维护的很大很大

    作者回复: 没太看懂你说的😂

    2020-01-01
    2
    1
  • 刘同青
    老师,您好,我工作中遇到的就是面向过程编程,一个接口中只有一个方法,对应一个实现,然后通过dubbo rpc调用。。。请问如果一个接口中很多个方法,那实现类不就很复杂了么?

    作者回复: 一个接口只有一个方法,这种设计不常见吧,除非框架限制,有特殊要求,才会这么做。

    2020-05-06
  • L
    你好,我想问下如何在spring mvc下使用设计模式,或者说在框架下如何使用设计模式

    作者回复: 使用设计模式跟spring mvc或者其他框架关系不大哈,还是聚焦于你的业务是否需要使用设计模式

    2019-12-06
    2
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部