最少承诺原则和单一职责原则

介绍

在这篇文章中,我想介绍单一责任原则( SRP )。
我认为这是任何干净且设计良好的系统的基础。

什么是SRP?

该术语由Robert C. Martin提出 。 它是SOLID原理中的“ S”,是OOD的基础。 http://en.wikipedia.org/wiki/SOLID_ (面向对象的设计)这是Robert C. Martin撰写的SRP的PDF文件https://docs.google.com/file/d/0ByOwmqah_nuGNHEtcU5OekdDMkk/

从维基百科:

…在面向对象的编程中,单一职责原则规定每个类应具有单一职责,并且该职责应完全由该类封装。 它的所有服务都应严格地与这一责任相一致……。

干净代码

一个类或模块应该有一个更改理由 ,并且只有一个更改理由

因此,如果出于多种原因需要修改类(或模块),那么它会做的事情不只一件事。 即有多个责任。

为什么选择SRP?

  • 整理代码
    假设有一家修理厂的汽车修理工。
    他有很多工具可以使用。 工具分为几种类型。 钳子,螺丝起子(菲利普斯/刀片),锤子,扳手(油管/六角)等等,如何简化工具的组织? 每个抽屉中有几种类型不同的抽屉? 或者,许多小抽屉,每个抽屉都有一个特定的类型?现在,把抽屉想象成模块 。 这就是为什么许多小模块(类)的组织性要强于大模块的原因。
  • 不那么脆弱
    当一个班级有多个原因需要改变时,它就更加脆弱。
    一个位置的更改可能导致完全其他位置发生某些意外行为。
  • 低耦合
    更多的责任导致更高的耦合度。
    联轴器是责任。 较高的耦合度导致更多的依赖关系,这更难维护。
  • 代码变更
    对于单个职责模块而言,重构要容易得多。
    如果您想获得the 弹枪效果 ,请让您的班级承担更多责任。
  • 可维护性
    显而易见,维护一个小的单一目的类比维护一个大型的单一类要容易得多。
  • 可测性
    “单一目的类”的测试类将具有较少的测试用例(分支)。
    如果一个类有一个目的,那么它通常将具有更少的依赖关系,从而减少模拟和测试准备。 “通过测试进行自我记录”变得更加清晰。
  • 调试更轻松
    自从我开始进行TDD和测试优先的方法以来,我几乎没有进行调试。 真。
    但是,有时候我必须调试才能了解发生了什么。 在单一职责类中,查找错误或问题原因变得容易得多。

什么需要承担单一责任?

系统的每个部分。

  • 方法
  • 班级
  • 套餐
  • 模块

如何识别SRP的中断?

  • 类的依赖性过多
    输入参数太多的构造函数意味着很多依赖关系(希望您确实注入了依赖关系),另一种看到很多依赖关系的方法是测试类。
    如果需要模拟太多对象,通常意味着破坏SRP。
  • 方法参数太多
    和全班同学的气味一样 将方法的参数视为依赖项。
  • 测试班变得太复杂
    如果测试的变体太多,则可能表明班级职责过多。
    这可能表明某些方法做得太多。
  • 类/方法长
    如果方法很长,可能表明它做得太多。
    上课也一样。 我的经验法则是,课程级别不应超过200-250 LOC。 包括进口
  • 描述性命名
    如果您需要描述AND世界使用的类/方法/包,则可能会破坏SRP。
  • 低内聚性
    凝聚力本身就是一个重要的话题,应该有自己的职位。
    但是,凝聚力和SRP密切相关,因此在这里提到它很重要。 通常,如果一个类(或模块)不是内聚的,则可能会破坏SRP。非内聚类的提示: 该类有两个字段。 某些方法使用一个字段。 其他方法使用其他字段。
  • 一处改变打破另一处
    如果更改代码以添加新功能或仅重构就破坏了一项似乎无关的测试,则可能表明您违反了SRP。
  • 弹枪效应
    如果更改很小,则会在代码中产生很大的涟漪。 如果需要更改许多位置,除其他气味外,它可能暗示SRP已损坏。
  • 无法封装模块
    我将使用Spring进行解释,但是概念很重要(而不是实现)。
    假设您使用@Configuration或XML配置。 如果您无法在该配置中封装Bean,它应该给您带来太多责任的暗示。 配置应隐藏任何内部bean并公开最少的接口。 如果您出于多种原因需要更改配置,那么,您知道…

如何使设计符合单一责任原则

以下建议可适用于SOLID原则的其他主题。 它们也适用于任何“清洁法规”建议。
但是在这里,它们旨在实现“单一责任原则”。

  • 意识
    这是干净代码的一般建议。
    我们需要注意我们的代码。 我们需要保重。 至于SRP,我们需要尽早尝试并赶上负责过多的课程。 我们需要始终寻找“太大的方法”。
  • 可测试的代码
    以可以测试所有内容的方式编写代码。
    然后,您将非常希望您的测试简单且具有描述性。
  • TDD
    (我不会在这里添加任何内容)
  • 代码覆盖率指标
    有时,当一堂课做得太多时,一开始就不会有100%的覆盖率。
    检查代码质量指标。
  • 重构和设计模式
    对于SRP,我们主要进行提取方法,提取类,移动方法。
    我们将使用组合和策略而非条件。
  • 清晰的系统模块化
    当使用DI注入器(Spring)时,我认为Configuration类(或XML)可以查明模块设计。 和模块的单一责任。
    与拥有一个大文件/类相比,我更喜欢具有几个中小型的配置文件(XML或Java)。 它有助于了解模块的职责并易于维护。 我认为注入的配置方法具有注释方法的优势。 仅仅因为配置方法使模块成为人们关注的焦点。

结论

正如我在本文开头提到的那样,我认为单一职责原则是良好设计的基础。
如果在设计和开发过程中牢记此原则,那么您将拥有一个更简单易读的代码。
将遵循更好的设计。

最后一点

与往常一样,在应用实践,代码和设计时需要格外小心。 有时,我们可能会做过多的工作,使简单的事情变得复杂。 因此,在任何重构和变更中都必须应用常识。

参考:来自JCG合作伙伴 Eyal Golan的“单一责任原则” , 作为工匠开发人员博客在《 学习与改进》上发表。

翻译自: https://www.javacodegeeks.com/2014/02/the-single-responsibility-principle.html

最少承诺原则和单一职责原则

最少承诺原则和单一职责原则_单一责任原则相关推荐

  1. 架构中的设计原则之单一职责原则 - 《java开发技术-在架构中体验设计模式和算法之美》...

    2019独角兽企业重金招聘Python工程师标准>>> 单一职责模式: 单一职责原则的核心思想就是:系统中的每一个对象都应该只有一个单独的职责,而所有对象所关注的就是自身职责的完成. ...

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

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

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

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

  4. 接口隔离原则_设计模式六大原则

    作者:VieLei 原文:https://blog.csdn.net/s10461/article/details/53941097 在android中我们常提起的设计模式大约有23种,利用好设计模式 ...

  5. 设计模式(一)--单一职责模式(衡量接口或类设计)

         作为一只入坑了两年多的java程序猿,最近才真正接触到公司的项目,面对公司所使用的框架技术,真是两眼一抹黑啊,如何快速看懂现有项目的关键技术,这直接决定你是否能快速胜任手里的工作!这段时间也 ...

  6. java 单一职责原则_设计模式之单一职责原则

    对类来说,即一个类应用只负责一项职责,如类A负责两个不同的职责:职责1,职责2.当职责1需求变更时,可造成职责2执行错误,所以需要将类A的粒度分解为A1,A2. 降低类的复杂度,一个类只负责一项职责 ...

  7. 里氏替换原则_代码需要有单一职责,还要开闭,里氏替换又是什么鬼?

    目录 单一职责原则: 开闭原则: 里氏替换原则: 单一职责原则: 每一个系统中的功能都表示一个职责,这些职责可以映射到模块(类)中, 且尽可能的保证这些类中没有功能上的重复,设计中每次应只关注一个职责 ...

  8. 【编码魔法师系列_六大原则1】单一职责原则(Single Responsibility Principle)

    学会设计模式,你就可以像拥有魔法一样,在开发过程中解决一些复杂的问题.设计模式是由经验丰富的开发者们(GoF)凝聚出来的最佳实践,可以提高代码的可读性.可维护性和可重用性,从而让我们的开发效率更高.通 ...

  9. 软件架构设计原则-开闭、依赖倒置、单一职责、接口隔离、迪米特、里氏替换、合成复用,附Java语言示例讲解

    场景 1.开闭原则(Open-Closed Principle,OCP) 是指一个软件实体(如类.模块和函数)应该对外扩展开放,对修改关闭.所谓的关闭,也正是对扩展和修改两个行为的一个原则. 它强调的 ...

  10. 设计原则 单一职责原则、开放封闭原则、依赖倒置原则、里氏代换原则、迪米特法则

    目录 1 单一职责原则 2 开放封闭原则 3 依赖倒置原则 4 里氏代换原则 5 迪米特法则 1 单一职责原则 比如:电脑内存坏了就应该更换内存,不应该更换CPU (内存负责内存.CPU负责CPU) ...

最新文章

  1. 面试官:你知道java类是怎么跑起来的吗?问的我一脸懵
  2. 你可能会错过的3个重要AI趋势
  3. 转载别人的转载 Android Studio实用插件集合
  4. Leetcode970. Powerful Integers强整数
  5. c语言程序设计实践课选题,c语言程序设计实践实验题目
  6. 多线程join方法解析
  7. 无法启用数据库中的 Service Broker,因为已存在启用的具有相同 ID 的 Service Broker。...
  8. 用srvany.exe将程序安装为windows服务的步骤链接
  9. 学妹面试拼刀刀被问Java策略模式是什么鬼?哈哈哈哈
  10. android微信小程序自动填表_微信小程序自动化实战(一)
  11. html5柱状图模板,html5生成柱状图(条形图)
  12. [论文阅读笔记31]UER: An Open-Source Toolkit for Pre-training Models
  13. 构建根文件系统的/dev目录
  14. 微信小程序扫描二维码或者条码
  15. PCB抗干扰设计原则
  16. html中onfocus和onblur的使用
  17. 【WAF技巧拓展】————8、我的WafBypass之道(Misc篇)
  18. 【问题解决】关于 C++ 连接 Redis 集群报错 MOVED
  19. 对口升学计算机学校录取分,中职对口升学本科第一批院校录取分数线划定
  20. 我的世界 1.18.1 Forge版 开服教程,可装MOD,带面板

热门文章

  1. itunes如何备份手机所有数据
  2. 如何认识会计科目,看懂财务报表?
  3. 滴滴悬赏百万寻凶,机智网友支付宝钓鱼转账杀害空姐明珠疑凶
  4. html中css图片链接地址中有()括号不显示的解决办法
  5. vbox win10 分辨率_win10如何更改分辨率?
  6. 关于电商平台推出无门槛优惠券不得不说的几个问题
  7. word表格怎么缩小上下间距_word表格间距 在WORD表格中如何将行间距缩小
  8. mysql中数据字典的定义,数据字典
  9. IDEA 修改主题颜色
  10. 美国大学计算机理论专业phd,盘点美国那些计算机专业PHD超级难申请的大学