敏捷软件开发 - 原则、模式与实践 —— 敏捷设计(五)依赖倒置原则

选卡不求人:搞AI是选带Tensor Core的RTX 5000还是老旗舰V100?实战性能与性价比分析 本文深入对比了带Tensor Core的RTX 5000与老旗舰V100在AI任务中的性能与性价比。实测显示,RTX 5000凭借第二代Tensor Core在多数场景下性能领先15%,尤其INT8量化推理速度达V100的2.7倍,但V100在大模型训练中显存优势明显。结合二手价格与能耗分析,为不同预算用户提供选卡方案。 阅读详情

本文为敏捷软件开发 - 原则、模式与实践系列的一部分。

本文对应原书第11章。

依赖倒置原则(DIP - The Dependency-Inversion Principle)

a. 高层模块不应该依赖于低层模块。二者都应该依赖于抽象。
b. 抽象不应该依赖于细节。细节应该依赖于抽象。

请考虑一下当高层模块依赖于低层模块时以为着什么。高层模块包含了一个应用程序中的重要的策略选择和业务模型。正是这些高层模块才使得其所在的应用程序区别于其他。然而,如果这些高层模块依赖于底层模块,那么对于低层模块的改动就会直接影响到高层模块,从而迫使它们依次做出改动。这种情形是非常荒谬的!本应该是高层的策略设置模块去影响低层的细节实现模块的。包含高层业务规则的模块应该优先并独立于包含实现细节的模块。无论如何高层模块都不应该依赖于低层模块。

此外,我们更希望能够重用的是高层的策略设置模块。我们已经非常擅长于通过子程序库的形式来重用低层模块。如果高层模块依赖于低层模块,那么在不同的上下文中重用高层模块就会变得非常困难。然而,如果高层模块独立于低层模块,那么高层模块就可以非常容易地被重用。该原则是框架设计的核心原则。

层次化

每个较高层次都为它所需要的服务声明一个抽象接口,较低的层次实现了这些抽象接口,每个高层类都通过该抽象接口使用下一层,这样高层就不依赖于低层。低层反而依赖于在高层中声明的抽象服务接口。

请注意这里的倒置不仅仅是依赖关系的倒置,它也是接口所有权的倒置。我们通常会认为工具库应该拥有它们自己的接口。但是当应用了DIP时,我们发现往往是客户拥有抽象接口,而它们的服务者则从这些抽象接口派生。

依赖于抽象

一个稍微简单但仍然非常有效的对于DIP的解释,是这样一个简单的启发式规则:“依赖于抽象。”这是一个简单的陈述,该启发式规则建议不应该依赖于具体类 — 也就是说,程序中所有的依赖关系都应该终于于抽象类或接口。

当然,每个程序中都会有违反该启发规则的情况。有时必须要创建具体类的实例,而创建这些实例的模块将会依赖于它们。此外,该启发规则对于那些虽是具体但却稳定的类来说似乎不太合理。如果一个具体类不太会改变,并且也不会创建其他类似的派生类,那么依赖于它并不会造成损害。比如,字符串类String。

什么事高层策略呢?它是应用背后的抽象,是那些不随具体细节的改变而改变的真理。它是系统内部的系统 — 它是隐喻。

结论

使用传统的过程化程序设计所创建出来的依赖关系结构,策略是依赖于细节的。这是糟糕的,因为这样会使策略受到细节改变的影响。面向对象的程序设计倒置了依赖关系结构,使得细节和策略都依赖于抽象,并且常常是客户拥有服务接口。

事实上,这种依赖关系的倒置正是好的面向对象设计的标志所在。使用何种语言来编写程序是无关紧要的。如果程序的依赖关系是倒置的,它就是面向对象的设计。如果程序的依赖关系不是倒置的,它就是面向过程的设计。

依赖倒置原则是实现许多面向对象技术所宣称的好处的基本低层机制。它的正确应用对于创建可重用的框架来说是必须的。同时它对于构建在变化面前富有弹性的代码也是非常重要的。由于抽象和细节被彼此隔离,所以代码也非常容易维护。

完整内容请查看敏捷软件开发 - 原则、模式与实践系列

1.2.4 依赖倒置原则(Dependency Inversion Principle、DIP)的错误 摘要:依赖倒置原则(Dependency Inversion Principle、DIP)是一个错误的尝试,Robert C. Martin希望将针对接口编程和控制反转两个概念纳入其DIP中,却形成了一个思路混乱的、不知所云的原则。作为正文,不能够喜怒笑骂。草稿抛弃依赖倒置原则将被修改为吐槽版。 1.4.2 抛弃依赖倒置原则(DIP) 在讨论OOD原则时,常常被提到的一个原则叫依赖倒... 阅读详情

相关推荐

Linux下离线安装Google Chrome

目录背景一、下载并安装Google Chrome二、下载并安装依赖包1.libvulkan.so.1()(64bit)2.读入数据总结 背景 项目中服务器被要求不能连接外网,不能直接联网安装,所以需要下载Google Chrome安装包和依赖包,然后离线安装。 linux下步骤都一样,不管ubuntu还是centos只是需要下载对应系统的文件包即可。 本机系统:CentOS 7 一、下载并安装Google Chrome 官方下载地址http://www.google.cn/chrome/browser/d

ancientapesman的博客 1万+

敏捷软件开发 第十章、第十一章、第十二章

第10章 Liskov 替换原则(LSP) 原则解释: 子类型(sbutype)必须能够替换掉它们的基类型(base type) 这一章没大看懂,貌似和 OCP(开发关闭原则)关系很大,以后再研究 第11章 依赖倒置原则(DIP) 原则解释: a. 高层模块不应该依赖于低层模块。二者都应该依赖于抽象。 b. 抽象不应该依赖于细节。细节应该...

weixin_30340775的博客 284

QT绘制饼图+柱状图+折线图

使用qt绘制,折线图,饼图,柱状图,多柱状图

梅山 3878

《敏捷软件开发-原则、模式与实践》-第十一章 依赖倒置原则(DIP)

    首先解释DIP:1、高层模块不应该依赖于底层模块,二者都应该依赖于抽象;2、抽象不应该依赖于细节,细节应该依赖于抽象。相对于我们传统的"过程式方法设计",我们的依赖关系是反的,因此叫做依赖倒置。如果我们的高层模块依赖于底层模块就会直接导致底层模块的改动联动影响高层的各个模块,这是非常荒谬的。低层依赖于高层也让我们的高层代码能够更多的得到复用。DIP原则在我们设计框架的时候是一个核心的原则。...

weixin_29520137的博客 291

S905L3B机顶盒刷Armbian:从安卓Root到eMMC全攻略

在嵌入式开发与轻量级服务器搭建中,ARM架构设备因其低功耗和高性价比备受关注。晶晨S905L3B作为运营商机顶盒的主流芯片,通过刷写Armbian系统可将其改造为ARM小服务器。其原理是利用Amlogic芯片的uboot引导机制,将Linux系统写入eMMC存储,从而脱离原厂安卓限制。这一方案的技术价值在于以极低成本实现Docker容器、下载机、轻量数据库等服务的部署,应用场景涵盖家庭网络广告过滤、智能家居控制、复古游戏机等。本文以CM311-1S为例,详细拆解从安卓9 Root到Armbian写入eMMC

weixin_31476015的博客 340

05 - matlab m_map地学绘图工具基础函数 - 设置比例尺指北针

本篇介绍下m_map中添加指北针(m_northarrow)、比例尺(m_ruler)和进行比例缩放(m_scale)的函数及其用法 。提供了 示例以便参考,罗列了 各函数可设属性。希望对绘图的你有所帮助。

weixin_43339605的博客 1946

关于依赖倒置,控制反转和依赖注入的趣谈

    昨天经过一朋友的SPACE,看到有关于控制反转的讨论,一时技痒,写下一段留言,完后由于比较长的时间没接触这几个单词,因此又去查了些资料,重新整理了一下,跟大家一起讨论。   整理之前,首先要说说“依赖”,什么是依赖,依赖就是关联,UML中定义的“关联”是最泛泛的一种关系,表现为两个类图之间有根线就有关联,我个人理解成,在C/C++中,A include了另一个头文件B,JAVA/.Ne

龙虾的博客 3086

【Visual Assist X助手安装问题】Visual Assist X无法安装(双击安装包没反应) | Visual Assist X安装后在Visual Studio中找不到(亲测有效)

本文分享了Visual Assisant X助手的安装与使用问题的详细解决办法,因为网上搜集的信息比较少,所以有一定的参考价值。考虑到很多开发新手会遇到上述问题,可能对Windows系统不熟悉,所以相关操作步骤讲解的很详细!

dvlinker的技术专栏 6万+

SRP,OCP,依赖倒转,LSP

单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因。 软件设计正真要做许多内容,就是发现职责并把那些职责相互分离。 开放-封闭原则:软件实体(类,模块,函数等等),应该可以扩展,但不可以修改。 开放-封闭原则是面向对象设计的 和谐所在。遵守这个原则可以带来面向对象技术所称的巨大好处,也就是可维护,可扩展,可复用,灵活性好。开发人员应该仅对程序中呈现出频繁变化的一些部分

静以修身,俭以养德。非淡泊无以明志,非宁静无以致远。 593

087、DAMO-YOLO Efficient-RepGFPN:重参数化加皇后融合加黄金分割的创新 Neck

DAMO-YOLO的Efficient-RepGFPN创新性Neck结构摘要: 该结构通过三重创新提升目标检测性能: 重参数化卷积:训练时多分支(3x3卷积+1x1卷积+BN分支)提升特征表达能力,推理时合并为单路3x3卷积保证效率; 皇后融合机制:采用可学习权重对不同尺度特征进行自适应加权融合,而非简单相加,通过Softmax归一化权重实现特征选择; 黄金分割连接:优化特征金字塔层间连接方式,按比例分配相邻层特征权重(如P3:P5≈0.618:0.382),减少冗余连接噪声。 实验表明,该结构有效解决了传

ai技术增长的博客 102

SNAP计算哨兵2号的LAI/FVC/FAPAR

SNAP的计算LAI方法是基于PROSAIL模型,集成的模块,很方便。首先要下载SNAP软件,下载步骤见。

所有专家都曾始于新手 2505

敏捷软件开发 - 原则、模式与实践

起源 《敏捷软件开发 - 原则、模式与实践》是我接触到的第一本系统介绍软件设计的书籍,深刻影响了个人的软件开发习惯。它并不难懂,我一直推荐给身边的各个层次的程序员学习。 可对于一本接近500页的图书,很多人还是望而却步。一直都想写个关于这本书的速读,使更多的人了解它。但是最近又重新学习了一遍发现它之所以有价值不仅仅在于书中总结的原则和模式,更在于它提供的如何运用这些原则、模式的实践例子。忽略了大量...

feifeilb的博客 2377

Vibe Draw:AI实现2D草图转3D建模,开源免费的设计师宝藏软件!

AI实现2D草图转3D建模,开源免费,设计师进来看一下?

Code_流苏:在代码中寻诗意,在实践中觅真知 2150

吐槽 依赖倒置原则/DIP

即使yqj2065清楚地知道Robert C. Martin想说的东西,这么胡言乱语的神经病的东西,要逐一地指出其问题,差一点 把我都搞得神经病了。所以,后面的文字乱七八糟的。我留底。

yqj2065的博客 3144

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

软件开发原则、模式与实践

软件开发这么多年,只有《敏捷软件开发:原则、模式与实践》这本书,是每隔一段时间会拿出来读读的。大家把架构师想的特别高大上,其实架构是一种职责,熟练掌握设计原则,设计模式,对于阅读源代码,自己设计框架,大有裨益。

937

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

敏捷开发笔记(第11章节)--依赖倒置原则(DIP)

所有结构良好的面向对象构架都具有清晰的层次定义,每个层次通过一个定义良好的、受控的接口向外提供了一组内聚的服务。这看起来似Policy Layer乎是正确的,然而它存在一个隐伏的错误特征,那Mechanism就是:Policy Layer对于其下一直到Utility Layer的改动Layer都是敏感的。每个较高层次都为它所需要的服务声明一个抽象接口,较低的层次实现了这些抽象接口,每个高层类都通过该抽象接口使用下一层,这样高层就不依赖于低层。请注意这里的倒置不仅仅是依赖关系的倒置,它也是接口所有权的倒置。

stupid的博客 971

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

《敏捷软件开发──原则、模式与实践》阅读笔记

《敏捷软件开发──原则、模式与实践》阅读笔记 《敏捷软件开发──原则、模式与实践》阅读笔记 Table of Contents 1. 敏捷开发 1.1. 敏捷联盟宣言 1.2. 敏捷开发的原则 2. 极限编程 3. 设计原则 3.1. 单一职责原则(SRP) 3.2. 开放——封闭原则(OCR) 3.2.1. 遵循开放──封闭原则设...

weixin_30855761的博客 666

《敏捷软件开发:原则、模式与实践》读书笔记

1、敏捷软件开发宣言 个体和交互         胜过 过程和工具 可以工作的软件     胜过 面面俱到的文档 客户合作           胜过 合同谈判 响应变化           胜过 遵循计划 2、面相对象设计的原则 单一职责原则 开放-封闭原则 Liskov替换原则 替换原则 依赖倒置原则 接口隔离原则 重用发布等价原则 共同封闭原则

backard的专栏 2418

设计模式六大原则(四)——依赖倒置原则(DIP)

依赖倒置原则(Dependency Inversion Principle, DIP)是面向对象设计中的一个重要原则,由罗伯特·C·马丁(Robert C. Martin)在其著作《敏捷软件开发:原则、模式与实践》中提出。这个原则旨在减少类间的耦合度,提高系统的稳定性和可维护性。依赖倒置的核心思想在于,通过让系统组件依赖于抽象层而非具体的实现细节,我们能够打造出既灵活又易于扩展的软件架构。

来北欧写代码 1074

《敏捷软件开发》学习笔记:敏捷设计原则

遵循敏捷实践去发现问题;应用设计原则去诊断问题;应用适当的设计模式去解决问题。 软件开发这三个方面件的相互作用就是设计。

七月南风 1027

敏捷软件开发之敏捷设计原则

第七章 什么是设计模式 1. 源代码是软件系统的主要设计文档 我们不应该认为软件设计就是一组和代码分离的UML图,UML图只是描述了设计的一部分。 软件项目的设计是一个抽像的概念。它和程序的概括形状、结构以及每一个模块、类和方法的详细形状和结构有关。 设计的最终体现在 源代码 中。 2.设计中臭味——腐化软件的气味 僵化性: 耦合性高,模块组件件关系太紧密,依赖性高,一动全动。 脆弱性: 改...

mac终端命令小入门 421

[11]DIP:依赖倒置原则

《敏捷软件开发 原则、模式与实践(c#版)》 第11章DIP:依赖倒置原则 传统的软件开发方法,比如结构化分析和设计,总是倾向于创建一些高层模块依赖于低层模块、策略依赖于细节的软件结构。实际上这些方法的目的之一就是要定义子程序层次结构,该层次结构描述了高层模块怎样调用低层模块。然而一个设计良好的面向对象的程序,其依赖程序结构相对于传统的过程式方法设计的通常结构而言...

aitinuo1702的博客 178

敏捷软件开发原则,模式与实践书摘

敏捷软件开发原则,模式与实践书摘。 拙劣设计的症状: 僵化性(Rigidity):很难对系统进行改动,因为每个改动都会迫使许多对系统其它部分的其它改动脆弱性(Fragility):对系统的改动会导致系统中和改动的地方在概念上无关的许多地方出现问题牢固性(Immobility):很难解开系统的纠结,使之成为一些可在其他系统中重用的组件粘滞性(Viscosity):做正确的事情比做错误的事情要

CPP_CHEN的专栏 1856

推荐:《敏捷软件开发、原则、模式与实践》电子版

 内容简介 在这本书中,享誉全球的软件开发专家和软件工程大师Robert C.Martin将向您展示如何解决软件开发人员、项目经理及软件项目领导们所面临的最棘手的问题。这本综合性、实用性的敏捷开发和极限编程方面的指南,是由敏捷开发的创始人之一所撰写的。   ·讲述在预算和实践要求下,软件开发人员和项目经理如何使用敏捷开发完成项目。   ·使用真实案例讲解如何用极限编程来设计、测试、重构和结

Scrum中文网-博客 1318

敏捷软件开发:原则、模式与实践 第七至九章读书笔记

第七章 敏捷设计 拙劣设计的症状定义: 僵化性(Rigidity): 设计难以改变 对软件进行一个单一改动,却引发一系列有依赖关系模块的连锁改动 脆弱性(Fragility): 设计易于遭到破坏 对软件进行单一改动时,程序的许多其他地方就会出现问题 牢固性(Immobility): 设计难以重用 设计中包含了对其他系统有用的部分,但是把这部分从系统中分离出来代价和风险很大 粘滞性( Viscos...

文森猫的记录 614

敏捷实践:SRP OCP LSP DIP ISP原则

敏捷开发提倡简单设计的实践,“并在实现新需求时抓住机会改进设计”以对同类性质的改动封闭,做到由需求的变化驱动设计的进化(我们不能因为设计的退化而责怪需求的变化),同时经验在此起到十分重要的作用,如有经验的设计人员可以凭经验在初始设计时做出必要的抽象来满足ocp原则等,或是在需求变动时确定系统所需的抽象(所需的封闭),当然应及早的刺激这种变化的出现(如测试驱动的开发方法)。   OOD承诺了一系列...

weixin_30508241的博客 400
上一篇: 敏捷软件开发 - 原则、模式与实践 —— 敏捷设计(四)里氏替换原则
下一篇: 敏捷软件开发 - 原则、模式与实践 —— 敏捷设计(六)接口隔离原则
feifeilb
博客等级 码龄22年 22粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值