依赖反转原理是什么,为什么它很重要?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (76)

依赖反转原理是什么,为什么它很重要?

提问于
用户回答回答于

它基本上说:

  • 高级模块不应该依赖于低级模块。两者都应该取决于抽象。
  • 抽象不应该依赖细节。细节应该取决于抽象。

至于为什么它很重要,简而言之:变化是有风险的,通过依赖一个概念而不是一个实现,可以减少在呼叫站点进行变更的需要。

有效地,DIP减少了不同代码段之间的耦合。我们的想法是,虽然有很多方法可以实施,比如日志设施,但您使用它的方式应该相对稳定。如果你可以提取一个代表日志概念的接口,那么这个接口应该比它的实现更加稳定,并且调用站点应该更少地受到你在维护或扩展该日志记录机制时所做的更改的影响。

通过使得实现依赖于接口,你可以在运行时选择哪种实现更适合你的特定环境。根据具体情况,这可能也很有趣。

用户回答回答于

敏捷软件开发,原则,模式和实践以及C#中的敏捷原则,模式和实践是完全理解依赖倒置原则背后原始目标和动机的最佳资源。文章“依赖倒置原则”也是一个很好的资源,但是由于它是草案的一个精简版本,最终进入了前面提到的书籍,所以它忽略了一些重要的关于包和界面所有权,这些是区分这个原则与在设计模式(Gamma等)一书中发现的“编程到界面而不是实现”的更一般建议的关键。

为了提供总之,依赖倒置原则主要是关于反转从“更高的水平”组件具有依赖性的常规方向为“较低级”组件,使得“较低级”组件是依赖于接口拥有的“更高级别”的部件。(注:“更高的水平”组分这里指的是部件需要外部依赖性/服务,分层架构内不一定其概念的位置)。在这样做时,耦合不减少这么多,因为它是移动从理论上部件对于重用理论上重用的组件更有价值。

这是通过设计组件的外部依赖性来实现的,组件的使用者必须提供实现的接口。换句话说,定义的接口表示组件所需要的,而不是你如何使用组件(例如“INeedSomething”,而不是“IDoSomething”)。

依赖倒置原理没有提到的是通过使用接口抽象依赖关系的简单实践(例如MyService→[ILogger⇐Logger])。虽然这将组件从依赖关系的特定实现细节中分离出来,但它并不颠覆消费者和依赖关系之间的关系(例如[MyService→IMyServiceLogger]⇐Logger)。

依赖性倒置原则的重要性主要体现在依赖外部依赖性(日志记录,验证等)的可重用软件组件的开发中,因为依赖这些依赖性需要消费者也需要相同的依赖关系。当您的图书馆的消费者选择使用不同的库来满足相同的基础设施需求时(例如NLog与log4net),或者他们选择使用与该版本不兼容的所需库的更高版本时,这可能会产生问题您的图书馆需要。

扫码关注云+社区