Dependency Injection 只是 Inversion of Control 的一种,其它语言需要进行 IoC 时并不一定需要 DI。Inversion of Control 的概念往往出现在框架当中,意思是从你调用框架提供的函数转变为你提供一个函数让框架选择在正确的时机调用它。(严格来说,这不一定需要是函数,这可以是任何东西,例如界面上的元素。)
对于函数不是变量也不是指针的语言来说,IoC 要求传递一个函数给框架这一点特别崩溃。没错,说的就是你,Java。Java 这一特性我们没办法直接传递函数,只能间接地把函数附着在一个对象上然后传递对象,这导致了后面的一系列问题……
既然 IoC 要传递函数,而 Java 不能传递函数,那怎么办呢?在没有 lambda 这类新功能之前,大家选择了使用 DI。不能传递函数,我整个类甚至整个包塞给你总可以了吧?而且你把这个等待我塞给你的包说成你依赖的包,那就是 DI 了。
支持传递函数的语言没有那么多麻烦事情。JavaScript?直接把函数当作变量一样传来传去。Haskell?人家的设计思想是利用高阶函数把小颗粒度的函数组合成你所需要的函数。
如果你仔细看完整本《设计模式》,你会发现里面很多模式是针对 Java 设计的。一般来说,设计模式是用来弥补语言设计缺陷的。有一件事情,描述它应该很容易,大家也经常描述类似的事情,但这门语言就是不支持,只能发明一个设计模式来描述这件事情。以后大家要描述相似的事情,就请用这个设计模式,虽然写出来的代码并不符合人类对这件事情描述的直觉,但在这门语言里面就是正确的。
《设计模式》里面有多少模式,Java 就有多少缺陷。很多相似的面向对象语言,例如 C#,也有很多同类的缺陷。但一旦你进入函数式编程语言,你会发现这本书里面的绝大部分模式都不适用,因为根本不需要。函数式编程语言内置很直观的方法描述这些事情,不需要通过设计模式来绕圈。
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有