依赖倒置原则的第二个陈述阐述

Dependency Inversion Principle's second statement elaboration

下面两条语句是依赖倒置原则(DIP)的核心:

"High-level modules should not depend on low-level modules. Both should depend on abstractions." "Abstractions should not depend on details. Details should depend on abstractions."

我阅读了不同的关于 DIP 的书籍和文章;他们都解释了第一个陈述,但 none 个解释了第二个陈述:"Abstractions should not depend on details. Details should depend on abstractions"。请解释第二个语句的确切含义。

您应该将 "details" 视为 "implementations": - 如果你声明了一些接口,它不依赖于它未来的实现类。 - 另一方面,实现 类 应该引用他们的接口并实现它的方法,所以他们依赖它。

这只是意味着您不想仅仅因为细节发生了变化而更改抽象,因为细节很可能会发生变化。

因为高层和低层模块都依赖于抽象,所以每当细节发生变化时,它们也必须改变。这显然是不可取的。

不要通过先查看实现(细节)来决定接口(抽象)

例如您可以定义一个 Repository 接口。但是在设计 Repository 接口时,您不应该通过查看 SQL 实现或 NoSQL 实现等特定解决方案来决定 接口(抽象) (详情)

让 Repository 接口是通用的并且 SQL 特性或者没有 SQL 特性实现应该是特定的。

如果您阅读 Martin Fowler

article,您将清楚第二个陈述

Switch out the repository for a different storage mechanism, there's no mention of SQL in its interface so we can use an in-memory solution, a NoSql solution or a RESTful service.