为了账号安全,请及时绑定邮箱和手机立即绑定

如何理解IoC(Inversion of Control)?

如何理解IoC(Inversion of Control)?

茅侃侃 2018-11-22 09:06:29
RT,如何理解IoC(Inversion of Control)?如果能写个demo解释最好了。
查看完整描述

2 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

我试着搜了一下,中文资料基本都把IoC(控制翻转)和DI(依赖注入)混为一谈,就连StackOverflow上的第一位答案也犯了同样的问题(幸好下面有高票的反对评论,否则我的世界观都快坏掉了)

控制翻转是代码复用的一种模式(注意不是设计模式)

一般(非IoC)的复用,通常是用户代码调用组件(任意形式的被复用的代码,本答案中统称为组件)。也就是用户代码解决“Why it works, What to do”,组件解决“How to do”,逻辑的入口是用户代码,

而控制翻转则是组件来调用用户代码,也就是组件解决“Why it works, When to do”,用户代码解决“What to do”,逻辑的入口是组件

下面是除了DI之外的控制翻转的例子

  • 接口/虚函数 组件调用接口/虚函数,具体由用户代码实现

  • 发布订阅(事件)模式 组件触发事件,用户代码订阅事件

  • 回调 用户代码写回调,组件来调用

  • 几乎所有能被称之为框架的东西 用户代码在规定的地方实现具体业务逻辑,剩下的框架负责


查看完整回答
反对 回复 2018-11-27
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

通俗的说,一个项目由各个类组成。一个类在一个项目会被很多地方使用。

如果按照传统的写法就是每个用的地方都需要 new Class()
如果参数很复杂,每个地方都需要new Class(param1, param2, param3, ..)
此时每次修改类的构造函数, 那么每个地方需要跟着修改。工作量大,耦合度高。

但是可以把需要使用的类,初始化一次,放到一个容器中保存起来,其他需要使用的地方,
只需要调用容器的方法Container->getClassINeed()
那么,使用这个类和生成这个类通过中间的容器分开了。
示例可以看Phalcon框架,文档里给的例子,教你一步步搭建自己的容器

一些管理对象生成的设计模式,本身也算一种容器的实现, 例如常见的工厂模式


查看完整回答
反对 回复 2018-11-27
  • 2 回答
  • 0 关注
  • 799 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信