<h2>原则</h2>
<p>罗伯特·C·马丁对依赖倒置原则的定义
由两部分组成:</p>
<blockquote>
<ol>
<li>High-level modules should not depend on low-level modules. Both should depend on abstractions.</li>
<li>Abstractions should not depend on details. Details should depend on abstractions.</li>
</ol>
</blockquote>
<p>只是想澄清一下。。。<strong>模块可以是函数、类、文件。。。一段代码</p>
<h2>错误</h2>
<p>假设你有一个程序需要你烤面包</p>
<p>在更高的级别上,您可以调用<code>cook()</code></p>
<p>实现这一点的一个糟糕方法是创建一个函数,该函数既可以烹饪,也可以创建面包</p>
<pre><code>def cook():
bread = Bread()
bread.bake()
cook()
</code></pre>
<p>这不好</p>
<p>如您所见,<code>cook</code>函数<strong><em>依赖于<code>Bread</code></p>
<p>那么,如果你想烤饼干怎么办</p>
<p>新手犯的一个错误是添加如下字符串参数:</p>
<pre><code>def cook(food: str):
if food == "bread":
bread = Bread()
bread.bake()
if food == "cookies":
cookies = Cookies()
cookies.bake()
cook("cookies")
</code></pre>
<p>这显然是错误的。因为通过添加更多的食物,你会改变你的代码,你的代码会被很多if语句弄得一团糟。而且它几乎打破了所有的原则</p>
<h2>解决方案</h2>
<p>因此,您需要<code>cook</code>函数,它是一个更高级别的模块,而不是依赖于像<code>Bread</code>或<code>Cookies</code>这样的较低级别的模块</p>
<p>因此,我们唯一需要的是我们可以烘烤的东西。我们会烤它。现在正确的方法是实现一个接口。在Python中,这是不必要的,但强烈建议保持代码干净并经得起未来考验</p>
<blockquote>
<p>If it looks like a duck, swims like a duck, and quacks like a duck,
then it probably is a duck.</p>
</blockquote>
<p>他们说</em></p>
<p>现在让我们反转依赖关系</p>
<pre><code>from abc import ABC, abstractmethod
class Bakable(ABC):
@abstractmethod
def bake(self):
pass
def cook(bakable:Bakable):
bakable.bake()
</code></pre>
<p>现在<code>cook</code>函数<strong>依赖于<strong>抽象。不是在面包上,不是在饼干上,而是在抽象上。任何<code>Bakable</code>现在都可以烘焙了</p>
<p>通过<strong>实现接口</strong>我们确信每个<code>Bakable</code>都会有一个<code>bake()</code>方法来做一些事情</p>
<p>但是现在<code>cook</code>函数不需要知道。
cook函数将烘焙任何<code>Bakable</code>的内容</p>
<p><strong>依赖项现在转到客户端。客户就是那个想要烤东西的人。客户机是一段将使用<code>cook</code>函数的代码。客户知道要烤什么</p>
<p>现在通过查看<code>cook</code>函数,客户机知道<code>cook</code>函数等待接收<code>Bakable</code>而只接收<code>Bakable</code></p>
<p>那么让我们做一些面包</p>
<pre><code>class Bread(Bakable):
def bake():
print('Smells like bread')
</code></pre>
<p>现在,让我们创建一些cookies</p>
<pre><code>class Cookies(Bakable):
def bake():
print('Cookie smell all over the place')
</code></pre>
<p>好的!现在我们来煮吧</p>
<pre><code>cookies = Cookies()
bread = Bread()
cook(cookies)
cook(bread)
</code></pre>