提出这个问题的另一种方式是:您认为什么是控制反转?
我问这个问题是因为维基百科文章IoC http://en.wikipedia.org/wiki/Inversion_of_control已被非 OO 解释劫持。这是取自讨论页 http://en.wikipedia.org/wiki/Talk:Inversion_of_control#Rewrite_--_motivation_and_idea_behind从 2007 年开始:
我冒昧地完全重写了页面,因为之前的内容完全被毫无意义的“面向对象”胡言乱语所取代......
我不明白控制反转在面向对象语言之外有什么意义。在过程语言中放弃控制已经有很多解释(事件编程就是其中之一),纯函数语言不需要像控制反转这样的概念,因为它们具有高阶函数。
另外,在article http://martinfowler.com/articles/injection.htmlMartin Fowler 详细阐述了 IoC,他专门处理 OO 示例。
那么,IoC 是否完全是一个 OO 概念?它到底是什么?
对我来说,IoC 尝试在大多数 OO 语言施加的限制内将函数转换为数据,并尝试将这些函数作为数据作为参数传递给其他函数。这不是 IoC 的唯一部分,但也有一些。
还有工厂设计模式,其中对象树在传递之前被构造和配置。
对我来说,IoC 完全是一个 OO 概念。
你的答案是什么?
控制反转绝对不是面向对象的概念。
IoC 存在并且在非 OO 语言中使用得非常频繁。例如,这在 C 语言中很常见。一个典型的例子是 Windows API——任何时候你调用任何通过回调工作的 Windows API 函数,你基本上都是在以最原始的形式使用 IoC。
例如,看一下枚举窗口 http://msdn.microsoft.com/en-us/library/ms633497.aspx功能。使用它,您可以将函数指针 (EnumWindowsProc) 传递给库,并且您的代码从库代码中运行。
将此与维基百科中控制反转的定义进行比较:“当库过程调用用户过程时,就会发生控制反转。”
完全一样。
然而,当您添加丰富的类型系统和 OOP 附带的许多其他工具时,IoC 确实变得非常强大、灵活且易于使用。这使得它更常见,因为它使用起来“更好”,但它确实在 OOP 之前就存在。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)