什么是SOLID


Posted in Javascript onMarch 24, 2022

S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写。

SRP The Single Responsibility Principle 单一责任原则
OCP The Open Closed Principle 开放封闭原则
LSP The Liskov Substitution Principle 里氏替换原则
ISP The Interface Segregation Principle 接口分离原则
DIP The Dependency Inversion Principle 依赖倒置原则

简写 全拼 中文
SRP The Single Responsibility Principle 单一责任原则
OCP The Open Closed Principle 开放封闭原则
LSP The Liskov Substitution Principle 里氏替换原则
ISP The Interface Segregation Principle 接口分离原则
DIP The Dependency Inversion Principle 依赖倒置原则

1. 单一责任原则(SRP)

当需要修改某个类的时候原因有且只有一个。换句话说就是让一个类只做一种类型责任,当这个类需要承当其他类型的责任的时候,就需要分解这个类。 类被修改的几率很大,因此应该专注于单一的功能。如果你把多个功能放在同一个类中,功能之间就形成了关联,改变其中一个功能,有可能中止另一个功能,这时就需要新一轮的测试来避免可能出现的问题,非常耗时耗力。

2. 开放封闭原则(OCP)

软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。这个原则是诸多面向对象编程原则中最抽象、最难理解的一个。

(1)通过增加代码来扩展功能,而不是修改已经存在的代码。
(2)若客户模块和服务模块遵循同一个接口来设计,则客户模块可以不关心服务模块的类型,服务模块可以方便扩展服务(代码)。
(3)OCP支持替换的服务,而不用修改客户模块。

如果现在又多了一种发送信息的方式,比如可以通过QQ发送信息,那么不仅需要增加一个方法sendByQQ(),还需要在调用它的地方进行修改,违反了OCP原则,更好的方式是

抽象出一个Send接口,里面有个send()方法,然后让SendByEmail和SendBySMS去实现它既可。这样即使多了一个通过QQ发送的请求,那么只要再添加一个SendByQQ实现类实现Send接口既可。这样就不需要修改已有的接口定义和已实现类,很好的遵循了OCP原则。

3. 里氏替换原则(LSP)

任何基类可以出现的地方,子类一定可以出现。
当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有is-A关系

客户模块不应关心服务模块的是如何工作的;同样的接口模块之间,可以在不知道服务模块代码的情况下,进行替换。即接口或父类出现的地方,实现接口的类或子类可以代入。

4.接口分离原则

接口分离原则指在设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。即,一个类要给多个客户使用,那么可以为每个客户创建一个接口,然后这个类实现所有的接口;而不要只创建一个接口,其中包含所有客户类需要的方法,然后这个类实现这个接口。
没有使用接口分离原理的设计如图1-1所示,存在以下问题:如果Client A类需要改变所使用的Service接口中的方法,那么不但要改动Service接口和ServiceImp类,还要对ClientB类和ClientC类重新编译。也就是说,对ClientA的修改会影响ClientB和ClientC,因此应对其进行修改。

使用通用接口设计
什么是SOLID

使用接口分离设计
什么是SOLID

5. 依赖注入或倒置原则(DIP)

  1. 高层模块不应该依赖于低层模块,二者都应该依赖于抽象
  2. 抽象不应该依赖于细节,细节应该依赖于抽象

这个设计原则的亮点在于任何被DI框架注入的类很容易用mock对象进行测试和维护,因为对象创建代码集中在框架中,客户端代码也不混乱。有很多方式可以实现依赖倒置,比如像AspectJ等的AOP(Aspect Oriented programming)框架使用的字节码技术,或Spring框架使用的代理等。

(1).高层模块不要依赖低层模块;
(2).高层和低层模块都要依赖于抽象;
(3).抽象不要依赖于具体实现;
(4).具体实现要依赖于抽象;
(5).抽象和接口使模块之间的依赖分离。

http://www.cnblogs.com/lanxuezaipiao/archive/2013/06/09/3128665.html

Javascript 相关文章推荐
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
Dec 02 Javascript
理解JavaScript中的对象 推荐
Jan 09 Javascript
善用事件代理,警惕闭包的性能陷阱。
Jan 20 Javascript
jQuery EasyUI API 中文文档 - Dialog对话框
Nov 15 Javascript
jQueryUI Datepicker组件设置日期高亮
Oct 13 Javascript
简单谈谈ES6的六个小特性
Nov 18 Javascript
jQuery树控件zTree使用方法详解(一)
Feb 28 Javascript
浅谈angular4 ng-content 中隐藏的内容
Aug 18 Javascript
ES6学习教程之模板字符串详解
Oct 09 Javascript
vue组件之间的数据传递方法详解
Apr 19 Javascript
ES6 Promise对象的含义和基本用法分析
Jun 14 Javascript
动态实现element ui的el-table某列数据不同样式的示例
Jan 22 Javascript
Vue3中toRef与toRefs的区别
Mar 24 #Vue.js
Javascript的promise,async和await的区别详解
Mar 24 #Javascript
一起来看看Vue的核心原理剖析
Mar 24 #Vue.js
手写Spirit防抖函数underscore和节流函数lodash
Mar 22 #Javascript
深入讲解Vue中父子组件通信与事件触发
Mar 22 #Vue.js
关于Vue中的options选项
Mar 22 #Vue.js
vue+echarts实现多条折线图
You might like
php数据库抽象层 PDO
2011/05/07 PHP
php与flash as3 socket通信传送文件实现代码
2014/08/16 PHP
php打印一个边长为N的实心和空心菱型的方法
2015/03/02 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
JavaScript Archive Network 集合
2007/05/12 Javascript
javascript setinterval 的正确语法如何书写
2014/06/17 Javascript
jQuery遍历对象、数组、集合实例
2014/11/08 Javascript
jQuery实现DIV层收缩展开的方法
2015/02/27 Javascript
在windows上用nodejs搭建静态文件服务器的简单方法
2016/08/11 NodeJs
微信小程序 前端源码逻辑和工作流详解
2016/10/08 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
2016/10/26 Javascript
js实现固定宽高滑动轮播图效果
2017/01/13 Javascript
js实现简单的选项卡效果
2017/02/23 Javascript
JavaScript之生成器_动力节点Java学院整理
2017/06/30 Javascript
JavaScript fetch接口案例解析
2018/08/30 Javascript
Vue Router中应用中间件的方法
2020/08/06 Javascript
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
[01:00:59]VP VS VG Supermajor小组赛胜者组第二轮 BO3第二场 6.2
2018/06/03 DOTA
[48:22]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
详解Python中映射类型(字典)操作符的概念和使用
2015/08/19 Python
解决安装python库时windows error5 报错的问题
2018/10/21 Python
django drf框架中的user验证以及JWT拓展的介绍
2019/08/12 Python
PyTorch中反卷积的用法详解
2019/12/30 Python
详解通过变换矩阵实现canvas的缩放功能
2019/01/14 HTML / CSS
法国二手手袋、手表和奢侈珠宝购物网站:Collector Square
2018/07/05 全球购物
斯福泰克软件测试面试题
2015/02/16 面试题
士兵突击观后感
2015/06/16 职场文书
《植物妈妈有办法》教学反思
2016/02/23 职场文书
500字作文之周记
2019/12/13 职场文书
Mybatis-plus在项目中的简单应用
2021/07/01 Java/Android
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
2021/11/11 Python
Pandas搭配lambda组合使用详解
2022/01/22 Python
基于redis+lua进行限流的方法
2022/07/23 Redis