位置: 编程技术 - 正文

深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解(深入理解新发展理念)

编辑:rootadmin

推荐整理分享深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解(深入理解新发展理念),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:深入理解javascript,深入理解新发展理念,推进供给侧结构性改革 心得体会,深入理解javascript,深入理解计算机系统,深入理解新发展理念,推进供给侧结构性改革,深入理解计算机系统,深入理解javascript特性,深入理解javascript,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第5篇,依赖倒置原则LSP(The Dependency Inversion Principle )。

英文原文: High-level modules should not depend on low-level modules. Both should depend on abstractions. 高层模块不应该依赖于低层模块,二者都应该依赖于抽象

B. Abstractions should not depend upon details. Details should depend upon abstractions. 抽象不应该依赖于细节,细节应该依赖于抽象依赖倒置原则的最重要问题就是确保应用程序或框架的主要组件从非重要的底层组件实现细节解耦出来,这将确保程序的最重要的部分不会因为低层次组件的变化修改而受影响。

该原则的第一部分是关于高层模块和低层模块之间的耦合方式,在传统的分成架构中,高层模块(封装了程序的核心业务逻辑)总依赖于低层的一些模块(一些基础点)。当应用依赖倒置原则的时候,关系就反过来了。和高层模块依赖于低层模块不同,依赖倒置是让低层模块依赖于高层模块里定义的接口。举例来说,如果要给程序进行数据持久化,传统的设计是核心模块依赖于一个持久化模块的API,而根据依赖倒置原则重构以后,则是核心模块需要定义持久化的API接口,然后持久化的实现实例需要实现核心模块定义的这个API接口。

该原则的第二部分描述的是抽象和细节之间的正确关系。理解这一部分,通过了解C++语言比较有帮助,因为他的适用性比较明显。

不像一些静态类型的语言,C++没有提供一个语言级别的概念来定义接口,那类定义和类实现之间到底是怎么样的呢,在C++里,类通过头文件的形式来定义,其中定义了源文件需要实现的类成员方法和变量。因为所有的变量和私有方法都定义在头文件里,所以可以用来抽象以便和实现细节之前解耦出来。通过定只定义抽象方法来实现(C++里是抽象基类)接口这个概念用于实现类来实现。

DIP and JavaScript

因为JavaScript是动态语言,所以不需要去为了解耦而抽象。所以抽象不应依赖于细节这个改变在JavaScript里没有太大的影响,但高层模块不应依赖于低层模块却有很大的影响。

在当静态类型语言的上下文里讨论依赖倒置原则的时候,耦合的概念包括语义(semantic)和物理(physical)两种。这就是说,如果一个高层模块依赖于一个低层模块,也就是不仅耦合了语义接口,也耦合了在底层模块里定义的物理接口。也就是说高层模块不仅要从第三方类库解耦出来,也需要从原生的低层模块里解耦出来。

深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解(深入理解新发展理念)

为了解释这一点,想象一个.NET程序可能包含一个非常有用的高层模块,而该模块依赖于一个低层的持久化模块。当作者需要在持久化API里增加一个类似的接口的时候,不管依赖倒置原则有没有使用,高层模块在不重新实现这个低层模块的新接口之前是没有办法在其它的程序里得到重用的。

在JavaScript里,依赖倒置原则的适用性仅仅限于高层模块和低层模块之间的语义耦合,比如,DIP可以根据需要去增加接口而不是耦合低层模块定义的隐式接口。

为了来理解这个,我们看一下如下例子:

在上述代码里,有个小型的JS类库将一个DIV转化成Map以便显示当前跟踪的位置信息。trackMap函数有2个依赖:第三方的Google Maps API和Location feed。该feed对象的职责是当icon位置更新的时候调用一个callback回调(在初始化的时候提供的)并且传入纬度latitude和精度longitude。Google Maps API是用来渲染界面的。

feed对象的接口可能按照装,也可能没有照装trackMap函数的要求去设计,事实上,他的角色很简单,着重在简单的不同实现,不需要和Google Maps这么依赖。介于trackMap语义上耦合了Google Maps API,如果需要切换不同的地图提供商的话那就不得不对trackMap函数进行重写以便可以适配不同的provider。

为了将于Google maps类库的语义耦合翻转过来,我们需要重写设计trackMap函数,以便对一个隐式接口(抽象出地图提供商provider的接口)进行语义耦合,我们还需要一个适配Google Maps API的一个实现对象,如下是重构后的trackMap函数:在该版本里,我们重新设计了trackMap函数以及需要的一个地图提供商接口,然后将实现的细节挪到了一个单独的googleMapsProvider组件,该组件可能独立封装成一个单独的JavaScript模块。如下是我的googleMapsProvider实现:做了上述这些改变以后,trackMap函数将变得非常有弹性了,不必依赖于Google Maps API,相反可以任意替换其它的地图提供商,那就是说可以按照程序的需求去适配任何地图提供商。

何时依赖注入?

有点不太相关,其实依赖注入的概念经常和依赖倒置原则混在一起,为了澄清这个不同,我们有必要来解释一下:

依赖注入是控制反转的一个特殊形式,反转的意思一个组件如何获取它的依赖。依赖注入的意思就是:依赖提供给组件,而不是组件去获取依赖,意思是创建一个依赖的实例,通过工厂去请求这个依赖,通过Service Locator或组件自身的初始化去请求这个依赖。依赖倒置原则和依赖注入都是关注依赖,并且都是用于反转。不过,依赖倒置原则没有关注组件如何获取依赖,而是只关注高层模块如何从低层模块里解耦出来。某种意义上说,依赖倒置原则是控制反转的另外一种形式,这里反转的是哪个模块定义接口(从低层里定义,反转到高层里定义)。

总结

这是五大原则的最后一篇了,在这5篇文字里我们看到了SOLID如何在JavaScript里实现的,不同的原则在JavaScript里通过不同的角度来说明的。(大叔注:其实大叔觉得虽然是有点不伦不类,但从另外一个层面上说,大体的原则在各种语言上其实还是一样的。)

深入理解JavaScript系列():S.O.L.I.D五大原则之接口隔离原则ISP详解 前言本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第4篇,接口隔离原则ISP(TheInterfaceSegregationPrinciple)。英文原文:

PHP 数组current和next用法分享 1.currentphp$transport=array('foot','bike','car','plane');$mode=current($transport);//$mode='foot';$mode=next($transport);//$mode='bike';$mode=current($transport);//$mode='bike';$mode=prev($transport)

PHP守护进程实例 php也是可以直接进行守护进程的启动与终止的,相对于shell来说会简单很多,理解更方便,当然了php的守护进程要实现自动重启还是要依赖于shell的crontab

标签: 深入理解新发展理念

本文链接地址:https://www.jiuchutong.com/biancheng/382881.html 转载请保留说明!

上一篇:Redis基本知识、安装、部署、配置笔记(redis基础教程)

下一篇:深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解(深入理解中国式现代化)

  • 什么是减免税额90%
  • 一般纳税人季报是哪几个月报税
  • 小规模未达起征点的增值税怎么做账
  • 当月出租设备需要发票吗
  • 电子汇票提示付款撤销
  • 股东经济性质怎么填
  • 收到以前年度的货款分录
  • 如何计算个别资金成本?
  • 房屋租赁合同税率怎么算
  • 个体户要申报哪些报表
  • 通用机打发票现在还有吗
  • 违约金收入计入应纳税所得额吗
  • 简易计税的分包款可以留到下期抵扣吗
  • 销售种子的税种有哪些税率为多少?
  • 建筑行业小规模企业所得税税率
  • 出口退税申报显示疑点跳过可以转正式申报吗
  • 网上办税服务厅app下载
  • 办公室购买绿植违规吗
  • 公园门票可以报销吗
  • 可转换债券存在的问题
  • 资产负债表是一年一次吗
  • 自建自用建筑物,其自建行为不是建筑业税目的征税范围
  • 利息调整摊销的经济意义
  • 老板垫付款做会计分录
  • 怎么做汇算清缴报表
  • 个税退手续费要多久到账
  • 有限公司注册资本500万就真的有500万吗
  • 华为如何定时关机
  • deepin咋样
  • php创建表单
  • 暂估营业收入会增加吗
  • mac os x 10.0
  • mmc.exe是什么进程
  • 其他货币资金明细账填写样本
  • Loughrigg Tarn的日出,英国英格兰湖区安布尔塞德 (© John Finney photography/Getty Images)
  • 集团与子公司资产的关系
  • 职工意外保险比例
  • vue 播放视频流
  • js去掉数组中的空字符串
  • 城建税5%的是什么情况
  • 差旅费可以加计吗
  • 二季度报表是累计数吗
  • 大病医疗保险是社保吗
  • 哪些情况不能开专用发票
  • 运输发票抵扣税额怎么算
  • 税务安全证书应用客户端不成功是什么意思
  • 个体户注销工商需要等公示时间结束吗?
  • 跨年错账更正
  • 收到某单位投入机器一台
  • 税控技术服务费怎么做账
  • 去年的亏损今年第一季度可以弥补吗
  • 房产租赁发票
  • 将借款存入银行会计分录
  • 公司员工住宿费标准
  • 电子支付支付是什么意思
  • 销售货物没开票是不是不交税
  • 企业以原有公司为主体
  • 无形资产如何入股公司
  • mysql5.0使用教程
  • 跨服务器访问数据库
  • win102009发布日期
  • linux 解压.z
  • Win10系统如何开启全部权限
  • mac u盘启动盘
  • hpzts04.exe是什么进程 有什么作用 hpzts04进程查询
  • centos 安装chia
  • win7怎么删除除了系统盘所有东西
  • win10 windows更新清理删不掉
  • perl中qw
  • 清除垃圾的系统
  • python对excel操作真的有提高吗
  • shell数组遍历
  • unity点击3d物体
  • javascript的理解
  • jQuery Easyui Tabs扩展根据自定义属性打开页签
  • python dask
  • 公务员副处级工资待遇
  • 点击电子税务局里的税务数字账户不跳转怎么回事
  • 土地出让金契税计税依据
  • 代理记账广告语怎么写
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设