Ste*_*ver 9 oop design-patterns inversion-of-control
提出这个问题的另一种方法是:根据你的控制反转是什么?
我问这个问题是因为关于IoC的维基百科文章被非OO解释劫持了.这是从讨论页面获取的,来自2007年:
我冒昧地完全重写了这个页面,因为之前的内容被无意义的"面向对象"喋喋不休地接管了......
我没有看到Inversion of Control如何在OO语言之外有任何意义.在程序语言中放弃控制已经有很多解释(事件编程就是一个),而纯函数式语言不需要像控制反转这样的概念,因为它们具有高阶函数.
此外,在Martin Fowler详细阐述IoC 的文章中,他专门处理OO示例.
那么,IoC是否只是一个OO概念,它到底是什么?
对我来说,IoC试图在大多数OO语言强加的限制内将函数转换为数据,并尝试将这些函数作为参数传递给其他函数.这不是IoC的唯一部分,但其中有一部分.
还有工厂设计模式,在传递之前构造和配置对象树.
对我而言,IoC完全是OO概念.
你的答案是什么?
Ree*_*sey 13
控制反转绝对不是OO概念.
IoC存在并且在非OO语言中经常使用.例如,它在C中很常见.一个典型的例子就是Windows API - 每当你调用任何通过回调工作的Windows API函数时,你基本上都是以最原始的形式使用IoC.
例如,看一下EnumWindows函数.使用它,将函数指针(EnumWindowsProc)传递给库,并从库代码中运行代码.
将此与维基百科的控制反转定义进行比较:"当库程序调用用户程序时,会发生控制反转."
它完全一样.
但是,当您添加富类型系统和许多OOP附带的其他工具时,IoC确实变得非常强大,灵活且易于使用.这使它更常见,因为它"更好",但它确实存在于OOP之前.
Azd*_*der 11
你从实施的角度来看待理论问题.出现的第一个问题应该是Control你反转的是什么?
然后你会意识到它的一个对象,方法,函数或诸如此类的东西并没有什么关系,但实际上代码的作用是什么.
简而言之,当您执行依赖注入时,您将反转对(资源的)依赖项的创建和使用的控制.
当您为Windows API函数提供指向回调函数的指针时,您可以控制使用自己的参数调用函数.
所以你看,IoC只是一个理论概念,当然,它可以有不同的实际实现.
好吧,"控制反转"的概念似乎适用于你可以通过某种方式传递函数指针的地方.基本上,具有兼容签名的插件概念和DLL(例如,考虑驱动程序)只不过是IoC的一种形式.
但是,当使用富类型和容器模型的IoC时,您基本上会自动进入OO世界.OOP的概念很好地映射到IoC概念,特别是在支持纯虚拟类(或"接口",也称为"接口")的多重继承的语言中.