协慌网

登录 贡献 社区

什么是控制倒置?

控制反转(或 IoC)在第一次遇到时会非常混乱。

  1. 它是什么?
  2. 它解决了什么问题?
  3. 什么时候适当,什么时候不适合?

答案

控制反转(IoC)和依赖注入(DI)模式都是关于从代码中删除依赖关系。

例如,假设您的应用程序具有文本编辑器组件,并且您希望提供拼写检查。您的标准代码如下所示:

public class TextEditor {

    private SpellChecker checker;

    public TextEditor() {
        this.checker = new SpellChecker();
    }
}

我们在这里所做的是在TextEditorSpellChecker之间创建一个依赖关系。在 IoC 场景中,我们会做这样的事情:

public class TextEditor {

    private IocSpellChecker checker;

    public TextEditor(IocSpellChecker checker) {
        this.checker = checker;
    }
}

在第一个代码示例中,我们实例SpellCheckerthis.checker = new SpellChecker(); ),这意味着该TextEditor直接类依赖于所述SpellChecker类。

在第二个代码示例中,我们通过在TextEditor构造函数签名中使用SpellChecker依赖类来创建抽象(不在类中初始化依赖项)。这允许我们调用依赖项,然后将其传递给 TextEditor 类,如下所示:

SpellChecker sc = new SpellChecker; // dependency
TextEditor textEditor = new TextEditor(sc);

现在,创建TextEditor类的客户端可以控制使用哪个SpellChecker实现,因为我们将依赖项注入TextEditor签名。

这只是一个简单的例子,Simone Busoli 有一系列很好的文章更详细地解释了它。

控制反转是程序回调时得到的结果,例如 gui 程序。

例如,在旧学校菜单中,您可能有:

print "enter your name"
read name
print "enter your address"
read address
etc...
store in database

从而控制用户交互的流程。

在 GUI 程序或某些程序中,我们说:

when the user types in field a, store it in NAME
when the user types in field b, store it in ADDRESS
when the user clicks the save button, call StoreInDatabase

因此,现在控制被反转... 用户不是以固定顺序接受用户输入,而是控制输入数据的顺序,以及何时将数据保存在数据库中。

基本上,具有事件循环,回调或执行触发器的任何内容都属于此类别。

什么是控制倒置?

如果您按照这两个简单的步骤操作,那么您已完成控制反转:

  1. 什么做的部分与何时做的部分分开。
  2. 确保一部分都知道尽量 什么部分; 反之亦然。

根据您实施所使用的技术 / 语言,每种步骤都有几种可能的技术。

-

控制反转(IoC)的反转部分是令人困惑的事情; 因为反演是相对的术语。理解 IoC 的最好方法就是忘掉那个词!

-

例子

  • 事件处理。事件处理程序(有待完成的部分) - 提升事件(何时可执行部分)
  • 接口。组件客户端(部分时间) - 组件接口实现(可执行部分)
  • xUnit fixure。 Setup 和 TearDown(有待完成的部分) - xUnit 框架在开始时调用 Setup,在结束时调用 TearDown(when-to-do 部分)
  • 模板方法设计模式。模板方法什么时候做的部分 - 原始子类实现什么做的部分
  • COM 中的 DLL 容器方法。 DllMain,DllCanUnload 等(有什么要做的部分) - COM / OS(什么时候做部分)