美文网首页
依赖注入 / 控制反转

依赖注入 / 控制反转

作者: 小凡凡520 | 来源:发表于2019-07-29 14:53 被阅读0次
    1957695-da23d0a0760c6e7e.jpg

    从图中可以看到,软件中的对象就像齿轮一样,协同工作,但是互相耦合,一个零件不能正常工作,整个系统就崩溃了。这是一个强耦合的系统。齿轮组中齿轮之间的啮合关系,与软件系统中对象之间的耦合关系非常相似。对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础。现在,伴随着工业级应用的规模越来越庞大,对象之间的依赖关系也越来越复杂,经常会出现对象之间的多重依赖性关系,因此,架构师和设计师对于系统的分析和设计,将面临更大的挑战。对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。

    一、依赖

    如果在 Class A中,有 Class B的实例,则称 Class A对 Class B 有一个依赖。例如下面类 ViewControllerA 中用到一个 ViewControllerB 对象,我们就说类 ViewControllerA 对类 ViewControllerB 有一个依赖。

    #import "ViewControllerB.h"
     
    @implementation ViewControllerA
     
     
    - (void)buttonTapped{
        ViewControllerB *vc = [[ViewControllerB alloc] init];
        [self.navigationController pushViewController:vc animated:YES];
    }
    

    仔细看这段代码我们会发现存在一些问题:

    1、如果现在要改变 ViewControllerB 生成方式,如需要用initWithOrderid:(NSString * orderid)初始化 vc,需要修改 ViewControllerA 代码;
    2、如果想测试不同 ViewControllerB 对象对 ViewControllerA 的影响很困难,因为 ViewControllerB 的初始化被写死在了ViewControllerA` 的构造函数中;
    3、如果[[ViewControllerB alloc] init]过程非常缓慢,单测时我们希望用已经初始化好的 ViewControllerB 对象 Mock 掉这个过程也很困难。
    
    二、依赖注入

    依赖注入 最大的特点就是:帮助我们开发出松散耦合(loose coupled)、可维护、可测试的代码和程序。这条原则的做法是大家熟知的面向接口,或者说是面向抽象编程。 众所周知该编程思想在各大语言中都有体现如jave、 C++、 PHP 以及 .net中。

    @interface ViewControllerA () 
     
    @property (nonatomic, readonly) ViewControllerB *vcB; 
     
    @end 
     
     
    @implementation ViewControllerA 
     
    // vcB是在ViewControllerA被创建之前被创建的并且作为参数传进来, 
    // 调用者如果想,还可以自定义。 
    - (instancetype)initWithEngine:(ViewControllerB *)vcB 
    { 
       ... 
     
       _vcB = vcB; 
     
       return self; 
    } 
     
    @end 
    

    上面代码中,我们将 vcB 对象作为构造函数的一个参数传入。在调用 ViewControllerA 的构造方法之前外部就已经初始化好了 vcB 对象。像这种非自己主动初始化依赖,而通过外部来传入依赖的方式,我们就称为依赖注入

    三、什么是依赖注入

    依赖注入(Dependency Injection) 是一个将行为从依赖中分离的技术,简单地说,它允许开发者定义一个方法函数依赖于外部其他各种交互,而不需要编码如何获得这些外部交互的实例。 这样就在各种组件之间解耦,从而获得干净的代码,相比依赖的硬编码, 一个组件只有在运行时才调用其所需要的其他组件,因此在代码运行时,通过特定的框架或容器,将其所需要的其他依赖组件进行注入,主动推入。

    相关文章

      网友评论

          本文标题:依赖注入 / 控制反转

          本文链接:https://www.haomeiwen.com/subject/dgrrrctx.html