依赖倒置原则:如何为他人定义“高级策略”和“低级细节”?


13

我试图向我的(主要是初级)同事解释依赖倒置原则。在软件中,我们如何定义哪个是“高级策略”,哪个是“低级细节”?例如,如果我们的软件使多个业务应用程序的工作流程自动化,为什么我们要说工作流程自动化是高级策略,而业务应用程序就是细节?

Answers:


11

注意:这已从我之前的示例中完全重写

考虑一下电源插座。在任何给定的国家/地区,高级别政策都是电源插座始终相同。无论从哪里获得电力(煤炭,天然气,核能),墙壁上的插座都应始终通过同一组连接器输出相同数量的电力。

现在,您可以将任何设备插入该插槽,因为它们都有一个公共接口,即“插头”。高级策略永远不必规定实施细节的任何部分。只需插上电源即可。

现在,如果您有不需要交流电源的设备(也许它在7V直流电路上运行),您仍然可以使用该高级策略,则只需在电源和设备之间使用某种适配器即可。而且,由于每个人都有相同的高级策略,因此制造商可以将其内置到实施中,而无需更改高级策略。将实施与策略(您插入笔记本电脑)连接的人也不需要真正理解。

此外,如果制造商想在另一个国家/地区销售相同的设备,则他们要做的就是开发不同的适配器。因此,同一实现可以使用多个策略,而同一个策略可以运行多个实现。

这是依赖倒置的完美示例。

但这是有趣的一点:回到我最初所说的。“从哪里获得电力都没关系。” 这也是一个实现细节。高级别策略仍然是所有电源插座都具有相同的形状并发出相同类型的电源。低层的实施细节既是电力的来源,又是电力的运行方式。

用编程的术语来说,这意味着高级策略是API提供并且应用程序使用的接口(语言在其中支持语言。DI的另一种形式是鸭嘴式。),而低级实现细节都是使用它的应用程序和API本身,两者都不需要相互理解。

适配器可用于将同一实现适合不同的策略。


+1曲棍球。不知道我可以从一个简单的电源插座中学到很多东西:)
dreza

7

软件重用的经典方法是构建不依赖其他组件的组件(这就是使它们成为低级别的组件),然后构建依赖于较低级别组件的较高级别组件。“高级别”和“低级别”具体取决于依赖关系的方向,这不是组件功能所固有的,而通常只是体系结构决策。

因此,当构建单个业务应用程序不依赖于工作流自动化,但是您的工作流控制器直接依赖于该业务应用程序时,则应该清楚的是,工作流自动化是“高级策略”,而业务应用程序则是“高级策略”。 “低级”组件。请注意,这种结构不是强制性的-如果您的工作流自动化组件是通用框架,也没有与特定的业务应用程序耦合,但是可以配置为服务于不同的应用程序,那么您已经开始应用DIP。在这种情况下,在这两件事之间“高级别” /“低级别”的分离可能不再有意义。

因此,名称“依赖倒置”在某种程度上具有误导性-因为依赖不是“倒置”而是完全删除了(或更确切地说,是从编译时的依赖变为运行时的依赖)。


1
不完全的。发生反转是因为较低的级别依赖于接口。应用接口隔离原理(SOLID中的I),该接口“属于”客户端。因此,下层隐喻地依赖于客户端。
迈克尔·布朗

2
@MikeBrown:这是一种可能的观点。我喜欢看的地步接口不要么属于A或B,但对A和B的基础设施或环境
布朗博士

1

我用一个简单的图像来说明DIP。软件开发的经典观点是作为一个构建过程,每一层都位于支持它的较低层之上。使用依赖倒置原理更像是构建移动设备。挂手机

移动层中的高层通过连接它们的字符串而不是高层坐在较低层上。在某种程度上,较低的层依赖于该接口来提供支持(没有它们掉落的字符串)。简而言之就是DIP。


+1比较不错。在这张照片中,您可能会看到我的观点-所有层都取决于接口,但高层不取决于较低层,反之亦然。
Doc Brown

我明白您在说什么,该接口既不属于上级也不属于下级。
迈克尔·布朗

1
他没有询问如何解释DIP,而是询问如何解释应用程序的哪些部分是高级策略,哪些是低级实现。您的类比并不需要延伸很多。您只需要能够在不更改字符串的情况下更改修饰即可(因为如果不能,那么高级移动策略将过多地涉及修饰实现)。
pdr

1
(实际上,您可以使用不同的材料构建一个全新的手机,并在其上悬挂相同的装饰-这是Doc Brown的观点)
pdr 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.