• blacknhole
    2019-12-06
    在看文末的“3. 类的职责是否设计得越单一越好?”时,我惊喜地意识到:

    1,内聚和耦合其实是对一个意思(即合在一块)从相反方向的两种阐述。

    2,内聚是从功能相关来谈,主张高内聚。把功能高度相关的内容不必要地分离开,就降低了内聚性,成了低内聚。

    3,耦合是从功能无关来谈,主张低耦合。把功能明显无关的内容随意地结合起来,就增加了耦合性,成了高耦合。
    展开
     3
     53
  • 编程界的小学生
    2019-12-06
    1.方法就是全凭感觉。感觉不爽,就尝试着是否可以拆分多个类,感觉来了谁也挡不住。没有硬性要求吧,都是凭借经验。比如用户service可能包含用户的登录注册修改密码忘记密码等等,这些操作都需要验证邮箱,这时候你会发现这个类就很乱,就可以把他一分为二,弄个UserService再弄个UserEmailService专门处理用户相关邮件的操作逻辑,让UserService依赖Email的,等等这种,我觉得真的是全凭经验。换句话说,屎一样的代码写多了,写到自己看着都想吐的时候,经验就积累了。
    2.方法设计上也用到了,比如自上而下的编程方式,先把核心方法定义好在去写具体细节,不要上来就把所有的细节都写到一个大而全的方法里。自上而下的编程方式他不香吗?
     17
     40
  • 辣么大
    2019-12-06
    懂几个设计模式,只是花拳绣腿。掌握设计原则就才掌握了“道”。

    设计你的系统,使得每个模块负责(响应)只满足一个业务功能需求。
    Design your systems such that each module is responsible (responds to) the needs of just that one business function. (Robert C. Martin)

    参考:https://blog.cleancoder.com/uncle-bob/2014/05/08/SingleReponsibilityPrinciple.html
    展开
     5
     14
  • Luciano李鑫
    2019-12-06
    想请教一下争哥,关于代码代码持续重构的问题,所引出的额外测试、发布成本,和故障风险应该怎样平衡呢。

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

     7
     12
  • 下雨天
    2019-12-06
    回答问题
    1. 类单一职责判断可以通过评估其对外提供接口是否满足不断变化的业务和需求来确定!问自己,该类是否对其他类是"黑盒"!

    2. 类行数多=属性多+方法多
    属性多: 要考虑这些属性是不是对类来说是必须的,需要移除么?
    方法多: 方法间复用情况,方法间有没有写重复代码?
    如上如果觉得没有可以改进的余地,就可以认为类行数恰当!

    3. 单一职责还可以应用到方法,模块,功能点上!
    展开
    
     7
  • 墨雨
    2019-12-06
    我有个问题,就用户地址的设计来说,后续功能扩大再拆解是不是违反了开闭原则呢?而且后期拆分会比较影响现有业务逻辑吧,这个如何平衡呢?
     4
     6
  • Chen
    2019-12-06
    Android里面Activity过于臃肿会让感觉很头大,MVP,MVVM等框架都是为了让Activity变得职责单一。
     2
     6
  • Dimple
    2019-12-06
    因为学习设计模式,前几天刚和朋友在聊,说其实每个类的代码行数和函数的行数最好都需要控制下,能精简就精简,完成我们理解的重构。

    刚好,今天就看到老师说的这个,赶紧分享给朋友,盛赞了这门课,哈哈
    
     4
  • 啦啦啦
    2019-12-06
    单一职责原则也可以用在服务上的拆分上
    
     3
  • 荀麒睿
    2020-01-05
    老师您好,有个问题想请教下,就是您举的UserInfo的例子,在抽取了地址相关的信息到新的类的时候,原来的userinfo类中需要再添加一个新的类的属性在里面么?感觉如果根据单一职责原则了话,新的类应该独立出来,UserInfo里应该不包含该类,那在这种情况下数据库的表一般会出现变化么?不然是否会造成一个新增的用户会在保存用户信息的时候对数据库进行两次操作?一次新增用户信息,然后获取了userId再进行一次操作修改地址相关信息?还是说在userinfo中存在新的地址相关类的属性,进行直接新增操作?因为没有这方面的实际经验,所以对这个比较疑惑。老师遇到这种情况一般作何处理

    作者回复: 数据库跟业务代码的设计不是强耦合的。不然,对业务代码进行重构,那数据库还得跟着改,谁还敢重构啊。

    不管userinfo是否有address的信息,我们都可以转化成数据库想要的数据格式,再一次性地写入到数据库中。

    userinfo是否包含address的信息?理论上,既然已经拆出来了,职责单一了,就不必要包含了。

    
     2
  • 小美
    2019-12-09
    有个问题,比如有个OrderService中可能提供了各种订单查询、操作等,即一个OrderService有多个方法,是否符合SRP呢?

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

    
     2
  • 李小四
    2019-12-07
    设计模式_15
    # 作业:
    单一职责也可以用于方法的编写,在维护多年的项目中,我们会看到一些非常“庞大”的方法,这些方法的功能比它的命名丰富很多,它是一次次地改成了这个样子。本来是一个职责单一的简单方法,由于需求的变化,可能是方法被调用太多(不敢改),也可能是框架设计(不能改)导致只能在方法内部添加特殊业务的判断条件,这样下来,这个方法就变得难以理解且难以维护。

    # 感想
    同事们也常讨论单一职责的边界, 始终没有一致的结论。今天的内容也坚定了观点,业务的发展一定程序决定了耦合的边界。
    我们学习前人总结的这些原则,目的是什么呢,我今天的感受是,系统性地降低工作量和出错概率。
    - 降低工作量:我们要尽量保证,随着需求的增加,工作量的增加是线性的,而不是指数级的。据我了解,维护一些老代码的同学们,一直被产品同事质疑:就这么点功能,要做这么久吗???
    - 降低出错概率:就像文中的序列化的例子,强行把序列化与反序列化方法拆开,会导致使用者需要花更多的时间来做一些同步的工作,如果文档不够清晰,或者阅读文档不够仔细,就会导致出错;有这样代码结构的系统,运行足够长的时间,一定会出更多的错误。
    展开
    
     2
  • 黄林晴
    2019-12-06
    打卡✔
    安装ali规范插件,看到报警告的就按照规范修改,不过这个规范是死的,有时候和实际应用不同,不过大部分规范还是可以遵循的
    
     2
  • Jxin
    2019-12-06
    回答问题:
    1.不好说,职责单一这东西比较主观。得看自己对抽象出来的类的主观定义是什么。准的捏不住,但还是要把控一下范围的。
    2.码出高效给出了方法行数不超过50行的一个基准标注。而我实践下来很难写出超过50行的方法,这50行还包括了大量注释。

    3.方法的职责单一,业务领域的能力要单一(边界清晰)。

    提问:

    1.以前不代码规范不行,就逼着自己多思考,多写注释。现在养成了写注释的洁癖,不写就很难受。请问大佬,这怎么办,需要戒掉吗。我除了dao层的crud和数据类的setget外,其余方法都会带上注释。
    展开

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

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

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

    
     1
  • tuyu
    2020-01-01
    小争哥, 数据库设计是不是不太适合设计那种抽象类的数据库表结构, 这样我写bo就会就会维护的很大很大

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

    
     1
  • Smallfly
    2019-12-26
    What

    一个函数、类、模块只负责完成一个职责或者功能。

    How

    关于如何使用这个原则,不同的应用场景、需求背景、业务,对一个类职责是否单一,会有不同的判定结果。

    这个说法其实很模糊,并没有多少实践上的指导意义。

    定义中也存在令人迷惑的点,类由函数构成,模块由类构成(面向对象领域),如果每个函数职责单一,多个职责单一的功能函数组成一个类,那么这个类还算职责单一吗?

    这里的区别在于看待职责单一的抽象维度不同,也称为职责颗粒度。

    比如在函数的维度,在一个 getter 方法,只返回用户名,它是职责单一的;在用户类的维度,它还可以包含返回手机号的 getter 方法。

    类也是有颗粒度的。以文中用户信息类为例,什么时候地址信息应该被作为单独类存在呢?我的结论是存在被复用的场景。

    在初次设计时,可能并没有复用场景,那么都写在一个类里满足业务需求完全没问题。

    但随着需求的发展,类中代码量膨胀,我们就需要根据复用性来对类进行拆分,此时单一职责原则可以作为一个指导思想。

    过度使用单一职责

    在设计时也不要过度使用单一职责原则,它会使得功能点不够内聚,增加维护成本。如果一个类,始终是作为整体被使用,即使它包含多种功能,放一起也可以。

    当我们只想使用类的某一部分功能,又觉得其它功能鸡肋的时候,再考虑拆分也不迟。

    Why

    单一职责原则,是前辈在代码时间中的经验,将某一类经验抽象为这个名字。这个原则主要目的是为了,实现高内聚、低耦合、提高代码的复用性、可读性、可维护性。
    展开
    
     1
  • bboy孙晨杰
    2019-12-10
    在数据库表设计的时候应该也有用到单一职责的思想吧,每个表只负责某一部分的业务数据,不要过多耦合,方便维护,阅读。
    
     1
  • 赤城
    2019-12-09
    项目初始阶段也是雄心勃勃,要把系统做出一个快速迭代、维护性高的系统,可是不断的需求变更导致开发任务过重,留给项目整体的思考和重构时间被严重压缩,最终导致项目的技术管理失控,再加上人员变动等原因,项目死亡的概率急剧上升,都是惨痛的教训。

    《三体》中常伟思的父亲经常说的是:要多想。

    共勉!
    展开
    
     1
  • Cris
    2019-12-07
    老师,我今天听到了一个概念叫面向切片编程(aop),它和面向对象编程有什么联系呢?想听听老师的理解

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

     2
     1
我们在线,来聊聊吧