资讯专栏INFORMATION COLUMN

如何理解依赖注入(DI)

anyway / 1940人阅读

摘要:什么是依赖注入依赖倒置原则高层模块不应该依赖于低层模块,两个都应该依赖于抽象接口。而依赖倒置原则的思想是,上层不应该依赖下层,应依赖接口。当然依赖倒置原则也始终贯彻在里面。

什么是依赖注入(Dependency Injection)

依赖倒置原则:高层模块不应该依赖于低层模块,两个都应该依赖于抽象(接口)。

依赖倒置是一种软件设计思想,在传统软件中,上层代码依赖于下层代码,当下层代码有所改动时,上层代码也要相应进行改动,因此维护成本较高。而依赖倒置原则的思想是,上层不应该依赖下层,应依赖接口。意为上层代码定义接口,下层代码实现该接口,从而使得下层依赖于上层接口,降低耦合度,提高系统弹性。

举个栗子:小霸王游戏机
// 如果使用单纯的面向对象来写
class XiaoBaWang
{    
    private $game;    
    public function loadGame()
    {        
    $this->game = new HunDouLuo();        
    $this->game->play();    
    }
}
class HunDouLuo{    
    public function play()    
    {        
    //玩游戏    
    }
}
$machine = new XiaoBaWang();
$machine->loadGame();

class XiaoBaWang
{    
    private $game;    
    public function loadGame()    
    {        
    $this->game = new Tank();       
     $this->game->play();    
}
}
class Tank 
{    
    public function play()    
    {        
        //玩游戏    
    }
}
$reg = new XiaoBaWang();
$reg->loadGame();
使用依赖注入的写法

小霸王游戏机:插拔式卡带

interface Game
{    
    public function play();
}
class HunDouLuo implements Game
{    
    public function play()    
{        
// 玩魂斗罗    
}
}
class Tank implements Game
{    
    public function play()    
{        
// 坦克大战    
}
}
class XiaoBaWang
{    
    private $game;    
    public function __construct(Game $game)    
    {        
        $this->game = $game;    
    }    
    public function loadGame()    
    {        
        $this->game->play();    
    }
}
$hunDouLuo = new HunDouLuo();
$tank = new Tank();
$machine = new XiaoBaWang($hunDouLuo);
$machine->loadGame();
$machine = new XiaoBaWang($tank);
$machine->loadGame();
上例就使用了"注入"这个思想,就像注射器一样将一个类的实例注入到另一个类的实例中去,需要用什么就注入什么。当然"依赖倒置原则"也始终贯彻在里面。"注入"不仅可以通过构造函数注入,也可以通过属性注入,上面你可以可以通过一个"set"来动态为"game"这个属性赋值。
ioc容器
不过开发中会有这样的经历,一开始类比较少,慢慢的功能越来越多,人员越来越多,编写了很多类,要使用这个类必须先引入那个类,而且一定要确保顺序正确。
于是。。。。
就出现了这样的情况, “a 依赖于b, b 依赖于c, c 依赖于 d, d 依赖于e”, 要获取‘a’的实例,你必须依次引入 ‘e,d,c,b’然后依次进行实例化。维护成本上升,开发成本上升,大家都是接盘侠。


再举一个栗子:游戏平台steam/battle
如果没有游戏平台,几个好友想要联机打魔兽争霸,我们过去是怎么做的?
1.每个人首先一起下载相同版本的游戏
2.安装驱动程序
3.建立/进入 局域互联网络
4.关闭防火墙
5.建房间,进入房间,开始游戏
如果我们玩了一段时间,想换星际争霸玩,那我们需要再来一次以上步骤。
最终,我们玩游戏这个动作是依赖于前面很多步骤的,如果有一步出了错,那么久不能正常开始游戏。
Steam/battle游戏平台做了什么?
当我们在游戏平台上面要一起玩一款游戏时,我们只需要:
1.下载安装游戏平台
2.选择一款游戏使用平台一键安装
3.开始游戏
这时,如果我们要换一款游戏,只需要换个游戏平台一键安装,然后开始游戏,不需要担心和理会之前安装的游戏和开始游戏流程对新游戏有什么影响。

有了以上的思路,我们就可以建一个steam类和游戏类了...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28437.html

相关文章

  • PHP程序员如何理解IoC/DI

    摘要:依赖注入容器管理应用程序中的全局对象包括实例化处理依赖关系。为了解决这样的问题,我们再次回到全局注册表创建组件。参考文章程序员如何理解依赖注入容器补充很多代码背后,都是某种哲学思想的体现。 思想 思想是解决问题的根本思想必须转换成习惯构建一套完整的思想体系是开发能力成熟的标志——《简单之美》(前言) . 成功的软件项目就是那些提交产物达到或超出客户的预期的项目,而且开发过程符合时间和费...

    DataPipeline 评论0 收藏0
  • 【译文】PHP-DI依赖注入的最佳实践

    摘要:在构造函数中注入依赖性在中作为服务的控制器这是痛苦的,当你有个以上的依赖项,你的构造函数是行样板代码在属性中注入依赖性这是我们建议的解决方案。 PHP-DI是用PHP编写的、强大的和实用的、框架无关的依赖注入容器。这是一个关于如何使用PHP-DI和依赖注入的最佳实践指南。 文章来源于PHP-DI,作者:Matthieu Napoli和贡献者。PHP-DI是用PHP编写的、强大的和实用的...

    ivydom 评论0 收藏0
  • PHP程序员如何理解依赖注入容器(dependency injection container)

    摘要:代码这就是控制反转模式。是变量有默认值则设置默认值是一个类,递归解析有默认值则返回默认值从容器中取得以上代码的原理参考官方文档反射,具有完整的反射,添加了对类接口函数方法和扩展进行反向工程的能力。 PHP程序员如何理解依赖注入容器(dependency injection container) 背景知识 传统的思路是应用程序用到一个Foo类,就会创建Foo类并调用Foo类的方法,假如这...

    Coding01 评论0 收藏0
  • Spring还可以这么学--IoC(控制反转) / DI(依赖注入)理解

    摘要:对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。控制被反转之后,获得依赖对象的过程由自身管理变为了由容器主动注入。于是,他给控制反转取了一个更合适的名字叫做依赖注入。 Spring还可以这么学--IoC(控制反转) / DI(依赖注入)理解 声明:文章的前三部分参考博文:https://www.cnblogs.com/Nouno...这篇文章首发是在我的个人微信订阅号每天学编...

    atinosun 评论0 收藏0
  • 搞懂依赖注入, 用 PHP 手写简易 IOC 容器

    摘要:依赖注入控制反转的一种具体实现方法。接下来,我们使用依赖注入实现控制反转,使依赖关系倒置依赖被动传入。从单元测试的角度看,依赖注入更方便和操作,方便了测试人员写出质量更高的测试代码。 前言 好的设计会提高程序的可复用性和可维护性,也间接的提高了开发人员的生产力。今天,我们就来说一下在很多框架中都使用的依赖注入。 一些概念 要搞清楚什么是依赖注入如何依赖注入,首先我们要明确一些概念。 D...

    antz 评论0 收藏0

发表评论

0条评论

anyway

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<