解读依赖倒置原则 。什么是依赖倒置?谁和谁的依赖倒置了?

news/发布时间2024/8/24 19:18:01

什么是依赖倒置?

按照定义来说,它有两条:

  1. 高层模块不应该依赖于低层模块。两者都应该依赖于抽象。
  2. 抽象不应该依赖于细节。细节应该取决于抽象。

看定义似乎并不能解决“倒置”的疑问。

谁和谁的依赖倒置了?

定义的第一条说:高层模块不应该依赖于低层模块。两者都应该依赖于抽象。

这并不能解决“倒置”的疑问,因为它说的是该原则的代码层级的设计,它引入了一个抽象的中间层。

看第二句:抽象不应该依赖于细节。细节应该取决于抽象。

这里解释了倒置,从抽象依赖于细节的关系倒置为细节依赖于抽象

什么是细节,什么是抽象?

在低层模块到高层模块的代码设计中,高层模块的实现依赖于低层模块提供的功能。
业务需求作为抽象的事物依赖于有着细节的功能,只有低层模块完成了,高层模块才能被实现。
随着需求的增长与变化,功能越来越多,高层模块的代码会随着低层模块的变化而被不断地修改,以致越来越难以维护。

是时候改变了,怎么改变呢?

思考一下:

  1. 需求的实现是可以预见的,只要在需要的时候提供适用的功能即可。
  2. 这些功能的设定可以由高层模块来决定,由低层模块来实现。

这个时候高层模块就不再依赖低层模块的具体实现了,它只依赖自己对功能的设定。
可是低层模块怎么知道高层模块需要的功能是如何设定的呢?
这需要一个独立的约定,引入中间层就能解决。

看一个小剧场:

高层模块需要文件操作的功能,原来他都是自己干,后来越来越忙,就招人来干;
但是业务不断扩张,找到的人不能胜任工作了,他要么自己亲自下场培训要么亲自找人把原来的换掉。

到后来他不胜其烦,直到听说有专门提供人才寻访服务的猎头。
高层模块找到猎头说:我要文件操作的功能,帮帮我;
猎头:给我你的要求,我来找人。
高层模块:能读取、写入、覆盖、追加。
猎头:好的!低层模块甲,这个活你能不能做?
低层模块甲:可以。
猎头带着甲找到高层模块,然后交差了。
过来一段时间...
高层模块:当前我们只能进行本地文件操作,你能不能找个会远程文件操作啊?猎头。
猎头:可以
低层模块乙:等待多时了,嘿嘿。
猎头带着乙找到高层模块把甲替换了,然后交差了。

这个时候,高层模块对低层模块只管按照约定来差遣,不需要与之沟通。
当不满意或者希望找一个更有本事的文件操作员的时候,只需要和猎头沟通,由猎头来寻人。


看完小剧场,将其对应到代码中:

在设计业务的时候,高层模块不需要依赖特定的低层模块来设计,将要使用的功能抽离出来,并设定功能的设计标准,也就是由高层模块决定做什么。
而低层模块决定怎么做,它按照高层模块设定的标准来实现具体的功能细节,交由高层模块使用。

在 OOP 中,我们通过接口来定义功能,提通过类实现接口的方式来实现功能的细节。
这个时候即使还没有编写任何提供功能实现的低层模块代码,我们高层模块的代码也能完成。

这样的代码结构,实现了“高层模块不应该依赖于低层模块,两者都应该依赖于抽象”的定义。

而将业务需要的功能从业务代码中抽离出来,成为中间层,实现了从 “业务需求依赖于既定的功能” 到 “业务逻辑与既定功能的实现都依赖于抽象的中间层”的转换,对应了“抽象不应该依赖于细节。细节应该取决于抽象”的定义。

抽象依赖具体具体依赖抽象才是“依赖倒置”的真实含义,而不仅仅是原先的高层模块与低层模块之间依赖关系的变化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.liansuoyi.cn/news/47870057.html

如若内容造成侵权/违法违规/事实不符,请联系连锁易网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

关于对拍

知周所众,对拍是一个在比赛中重要的技能之一。 所以,我自制了一个建议的对拍程序,简洁实用(Windows环境)。 原理 对拍原理大致如下: 数据生成器(generator)->程序1->输出1 数据生成器(generator)->程序2->输出2 输出1-对拍-输出2 $\ \ \ \ \ \ \ \ \ \ \…

Mysql超详细安装配置教程(保姆级)

一、下载Mysql 从官网下载MySQL,这里我选用的是Mysql8.0.34版本二、安装Mysql 下载完成后直接双击进行安装,打开后的页面如下所示:“Developer Default”是开发者默认 “Server only”仅作为服务器安装 “Clientonly”仅作为客户端安装 “Full”是完整安装 “Custom”是自定…

3. 统计学生成绩

object test3 {case class student(id: String, gender: String, score: Map[String, Int])//读取文件的方法:def inputStudentList(filename: String): List[student] = {// 读取文件并按行进行切割var lines = scala.io.Source.fromFile(filename).getLines.toList// 获取表…

d3d12龙书阅读----数学基础 向量代数、矩阵代数、变换

d3d12龙书阅读----数学基础 向量代数、矩阵代数、变换directx 采用左手坐标系 点积与叉积 点积与叉积的正交化使用点积进行正交化 使用叉积进行正交化矩阵与矩阵乘法 转置矩阵 单位矩阵 逆矩阵 矩阵行列式 变换旋转矩阵 坐标变换利用DirectXMath库进行向量运算、矩阵运算以及空…

【Loading】ctfshow_WriteUp | _萌新

萌新_密码1 题目 密文: 53316C6B5A6A42684D3256695A44566A4E47526A4D5459774C5556375A6D49324D32566C4D4449354F4749345A6A526B4F48303D 提交格式:KEY{XXXXXXXXXXXXXX} 分析 所有字符由数字和 ABCDEF 组成,先用 HEX 解码得到 S1lkZjBhM2ViZDVjNGRjMTYwLUV7ZmI2M2VlMDI5OGI4Z…

你以为我在跟你讲判空

开发中经常遇到需要判空的地方,比如对字符串进行判空操作。 而有时候工具包太多不知道用哪个。 就像下图,光一个 StringUtils 就有十几个包弹出来。 怎么选?其实用哪个都行。 最重要的是: 有一套自己用的顺手的工具。 或者换句话说: 要养成自己的开发习惯。 有了自己专属的…

MCAL开发环境搭建

本文是基于NXP-S32K1XX平台 1.MCAL开发流程图配置工具:EB treos studio:生成MCAL配置代码 EB Client License Administrator:激活EB tresos studio芯片MCAL开发包:S32K1XX_sMCAL_4.2_RTM_1.0.6MCAL驱动代码--静态代码 配置文件(用于EB tresos studio生成配置界面)--动态代码…

外包出项北京市海淀区劳动监察举报

劳动监察举报必须 本 人 亲自去,必须需要带身份证,举报材料 这里的两个文件到那之后也有,不过需要手动填,比较麻烦,建议自己下载下来填好打印出来就行,注意,所有内容 必 须 在 一 张 A4 纸 上,不能分两页😭别问我咋知道的,问就是我当初打印到两页了😭不能开委托书…

c++pair

粗略看了一下,详细的后面再学吧 pair将一队数据存储为一个值,这样操作,这就很好解决了cf922的b题了, 访问用.first和.second pair默认是先对第一个关键字从小到大排序,如果第一关键字相同,在对第二关键字从小到大排序,都是升序 然后用sort排序的话默认是对.first来排列 …

第四周

用while read line和/etc/passwd,计算用户id总和。 #!/bin/bash sum=0 while read line ;doif [[ "$line" =~ /sbin/nologin$ ]] ;thenuid=$(echo $line | cut -d: -f3)sum=$(($sum+$uid))fidone < /etc/passwd echo "用户id的总和为:$sum"总结索引数…

一般图最小匹配 题解

首先进行排序,显然只有排序后相邻两个元素匹配才有可能成为答案。 我们设 \(b_i=a_i-a_{i-1}\),则问题转化为:在 \(b\) 数组中选 \(m\) 个数(显然一个 \(b\)),两两不能相邻,求这些数和最小值。 就和这道题一模一样了,使用反悔贪心。 具体的,我们可以将所有 \(b_i\) 放…

EasyExcel 读取单元格内图片

EasyExcel 读取单元格内图片 1.需求介绍 需要实现Excel数据批量导入,且Excel中某个单元格内存在图片,需要将图片解析上传,并与所在行数据进行绑定,具体数据如:2.具体实现 2.1 版本介绍easyexcel:3.3.2 SpringBoot:2.7.1 hutool:5.7.212.2 解决思路 参考hutool ExcelPicU…

PHP

PHP调试环境包集: PHPStudy(Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer) 安装PHP7.4 查看可按照版本: brew search php使用brew安装: brew install php@7.4提示Warning: No available formula with the name "php@7.4".解决方案 从第三方仓库中安装 比如(所有旧…

Mac 安装goland2023.3

DataGrip/Goland 相关工具 链接:https://pan.baidu.com/s/1UTSusTKPPnIqxdKCAi1oKg 提取码:9wej 对应的激活码此处获取:https://docs.qq.com/doc/DZWFmak1WcVBhdENu mac 使用命令sh xxx.sh执行 如果原来有安装goland的话,需要先卸载干净 访达中在资源库中清除

文心一言 VS 讯飞星火 VS chatgpt (191)-- 算法导论14.2 1题

一、用go语言,通过为结点增加指针的方式,试说明如何在扩张的顺序统计树上,支持每一动态集合查询操作 MINIMUM、MAXIMUM、SUCCESSOR 和 PREDECESSOR 在最坏时间 O(1)内完成。顺序统计树上的其他操作的渐近性能不应受影响。 文心一言: 为了在扩张的顺序统计树上支持每一动态集…

使用uBlock Origin将知乎网页版表情显示为纯文字标签

知乎表情的实现方式:贴图 知乎的表情事实上是一系列由方括号包裹的关键字标记的图片,和微信聊天中的表情类似。当我们将鼠标移到表情上时,就可以看到图片的alt信息,即表情的关键字:阻断图片加载 看起来,要想实现将知乎表情显示为纯文本标签,我们只需要阻断知乎网页对表情…

每日刷题 卡片

一.题目 小蓝有k 种卡片,一个班有n位同学,小蓝给每位同学发了两张卡片,一位同学的两张卡片可能是同一种,也可能是不同种,两张卡片没有顺序。没有两位同学的卡片都是一样的。给定 n,请问小蓝的卡片至少有多少种? 二.题目要求 1.输入描述 输入一行包含一个正整数表示 n。 2.输出…

分享3款AI写作工具,帮助大家减轻创作困难

近些年来新媒体的发展一直热火朝天,随着大家不断的涌入,内容创作是必不可少的一环,而说到内容创作很多人都觉得是一项具有挑战的任务,哪怕是一些擅长创作的人经过日复一日的内容输出也会出现没有创作灵感的时候。那么在大家遇到创作困难时,写不出内容时,该怎么办呢?这里…

龙蜥8.6 源码安装python3.12

​闲来无事用虚拟机安装了一下龙蜥系统。[root@localhost home]# cat /etc/*release* Anolis OS release 8.6 NAME="Anolis OS" VERSION="8.6" ID="anolis" ID_LIKE="rhel fedora centos" VERSION_ID="8.6" PLATFORM_ID=&qu…
推荐文章