最少承诺原则和单一职责原则_单一责任原则
最少承诺原则和单一职责原则
介绍
在这篇文章中,我想介绍单一责任原则( 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)。 它有助于了解模块的职责并易于维护。 我认为注入的配置方法具有注释方法的优势。 仅仅因为配置方法使模块成为人们关注的焦点。
结论
正如我在本文开头提到的那样,我认为单一职责原则是良好设计的基础。
如果在设计和开发过程中牢记此原则,那么您将拥有一个更简单易读的代码。
将遵循更好的设计。
最后一点
与往常一样,在应用实践,代码和设计时需要格外小心。 有时,我们可能会做过多的工作,使简单的事情变得复杂。 因此,在任何重构和变更中都必须应用常识。
翻译自: https://www.javacodegeeks.com/2014/02/the-single-responsibility-principle.html
最少承诺原则和单一职责原则
最少承诺原则和单一职责原则_单一责任原则相关推荐
- 架构中的设计原则之单一职责原则 - 《java开发技术-在架构中体验设计模式和算法之美》...
2019独角兽企业重金招聘Python工程师标准>>> 单一职责模式: 单一职责原则的核心思想就是:系统中的每一个对象都应该只有一个单独的职责,而所有对象所关注的就是自身职责的完成. ...
- 六大设计原则之单一职责原则
单一职责原则 单一职责原则(Single Responsibility Principle)–SRP: There should never be more than one reason for a ...
- 设计模式六大原则(一)----单一职责原则
设计模式六大原则之[单一职则原则] 一.什么是单一职责原则 首先, 我们来看单一职责的定义. 单一职责原则,全称Single Responsibility Principle, 简称SRP. A cl ...
- 接口隔离原则_设计模式六大原则
作者:VieLei 原文:https://blog.csdn.net/s10461/article/details/53941097 在android中我们常提起的设计模式大约有23种,利用好设计模式 ...
- 设计模式(一)--单一职责模式(衡量接口或类设计)
作为一只入坑了两年多的java程序猿,最近才真正接触到公司的项目,面对公司所使用的框架技术,真是两眼一抹黑啊,如何快速看懂现有项目的关键技术,这直接决定你是否能快速胜任手里的工作!这段时间也 ...
- java 单一职责原则_设计模式之单一职责原则
对类来说,即一个类应用只负责一项职责,如类A负责两个不同的职责:职责1,职责2.当职责1需求变更时,可造成职责2执行错误,所以需要将类A的粒度分解为A1,A2. 降低类的复杂度,一个类只负责一项职责 ...
- 里氏替换原则_代码需要有单一职责,还要开闭,里氏替换又是什么鬼?
目录 单一职责原则: 开闭原则: 里氏替换原则: 单一职责原则: 每一个系统中的功能都表示一个职责,这些职责可以映射到模块(类)中, 且尽可能的保证这些类中没有功能上的重复,设计中每次应只关注一个职责 ...
- 【编码魔法师系列_六大原则1】单一职责原则(Single Responsibility Principle)
学会设计模式,你就可以像拥有魔法一样,在开发过程中解决一些复杂的问题.设计模式是由经验丰富的开发者们(GoF)凝聚出来的最佳实践,可以提高代码的可读性.可维护性和可重用性,从而让我们的开发效率更高.通 ...
- 软件架构设计原则-开闭、依赖倒置、单一职责、接口隔离、迪米特、里氏替换、合成复用,附Java语言示例讲解
场景 1.开闭原则(Open-Closed Principle,OCP) 是指一个软件实体(如类.模块和函数)应该对外扩展开放,对修改关闭.所谓的关闭,也正是对扩展和修改两个行为的一个原则. 它强调的 ...
- 设计原则 单一职责原则、开放封闭原则、依赖倒置原则、里氏代换原则、迪米特法则
目录 1 单一职责原则 2 开放封闭原则 3 依赖倒置原则 4 里氏代换原则 5 迪米特法则 1 单一职责原则 比如:电脑内存坏了就应该更换内存,不应该更换CPU (内存负责内存.CPU负责CPU) ...
最新文章
- 面试官:你知道java类是怎么跑起来的吗?问的我一脸懵
- 你可能会错过的3个重要AI趋势
- 转载别人的转载 Android Studio实用插件集合
- Leetcode970. Powerful Integers强整数
- c语言程序设计实践课选题,c语言程序设计实践实验题目
- 多线程join方法解析
- 无法启用数据库中的 Service Broker,因为已存在启用的具有相同 ID 的 Service Broker。...
- 用srvany.exe将程序安装为windows服务的步骤链接
- 学妹面试拼刀刀被问Java策略模式是什么鬼?哈哈哈哈
- android微信小程序自动填表_微信小程序自动化实战(一)
- html5柱状图模板,html5生成柱状图(条形图)
- [论文阅读笔记31]UER: An Open-Source Toolkit for Pre-training Models
- 构建根文件系统的/dev目录
- 微信小程序扫描二维码或者条码
- PCB抗干扰设计原则
- html中onfocus和onblur的使用
- 【WAF技巧拓展】————8、我的WafBypass之道(Misc篇)
- 【问题解决】关于 C++ 连接 Redis 集群报错 MOVED
- 对口升学计算机学校录取分,中职对口升学本科第一批院校录取分数线划定
- 我的世界 1.18.1 Forge版 开服教程,可装MOD,带面板