以下两个陈述是依赖性倒置原则(DIP)的核心:
“高级模块不应该依赖于低级模块。两者都应该依赖于抽象。” “抽象不应该依赖于细节。细节应该取决于抽象。”
我阅读了有关DIP的不同书籍和文章;所有这些都解释了第一个陈述,但没有一个解释第二个陈述:“抽象不应该依赖于细节。细节应该取决于抽象”。请解释第二个陈述的确切含义。
答案 0 :(得分:2)
这只是意味着您不想仅因为细节发生变化而更改抽象,因为细节可能会发生变化。
由于高级和低级模块都依赖于抽象,因此只要细节发生变化,它们也必须进行更改。这显然是不可取的。
答案 1 :(得分:2)
首先通过查看实现(详细信息)来决定接口(抽象)。
e.g。您可以定义Repository接口。但是在设计Repository接口时,您不应该通过查看 SQL实现或NoSQL实现(详细信息)等特定解决方案来决定接口(抽象)。
让Repository接口是通用的,SQL功能或NoSQL功能实现应该是特定的。
如果您通过 Martin Fowler
阅读此article,您将会清楚地了解第二条陈述为不同的存储机制切换存储库,其界面中没有提及SQL,因此我们可以使用内存解决方案,NoSql解决方案或RESTful服务。
答案 2 :(得分:1)
您应该将“详细信息”视为“实施”: - 如果您声明某个接口,则它不依赖于其未来的实现类。 - 另一方面,实现类应该引用它们的接口并实现它们的方法,所以它们依赖于它。