控制反转是面向对象语言特有的吗?

2024-01-22

提出这个问题的另一种方式是:您认为什么是控制反转?

我问这个问题是因为维基百科文章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(使用前将#替换为@)

控制反转是面向对象语言特有的吗? 的相关文章

  • 是检测异常并抛出它们还是让运行时抛出它们更好?

    假设有这样的设置 public class MyClass public void DoSomething string Data if String IsNullOrWhiteSpace Data throw new NullRefere
  • 当需要不同数量和类型的参数时如何创建操作委托列表

    我们有一组大约两打的类 它们继承自具有抽象 Validate 方法的基类 当然 每个类都有不同的验证需求 但它们之间的不同组合需要规则 因此 正如您可以想象的那样 这导致了大量代码重复 例如 A 类需要规则 1 3 6 和 9B 类需要规则
  • PHP:调用另一个类的方法

    我仍在学习 OOP 所以这甚至可能是不可能的 尽管如果是这样我会感到惊讶 我需要一些帮助来调用另一个类方法 例如在ClassA I有这个方法 function getName return this gt name 现在从ClassB 不同
  • 确定列表编号是否连续

    我在 Java 工作 我有一个无序列表 包含 5 个数字 范围从 0 100 没有重复 我想检测其中 3 个数字是否连续且没有间隙 例子 9 12 13 11 10 true 17 1 2 3 5 true 19 22 23 27 55 f
  • 当前线程中的单例

    我的单身人士如下 public class CurrentSingleton private static CurrentSingleton uniqueInstance null private static object syncRoo
  • 通俗地说,Ruby on Rails ORM 是什么?请解释

    我无法理解 Ruby on Rails 中的 ORM 据我了解 表 列和对象 属性之间存在 1 1 的关系 所以每条记录都是一个对象 另外 模型到底是什么 我知道它映射到一张桌子 我真正追求的是对上述内容有更深入的理解 预先感谢您的帮助 我
  • 通过 Javascript 不断查询服务器 - 好主意吗?

    我有一个小型网站 大约有 5 到 10 名管理员 我已将其设置为监视每个管理员正在执行的操作 添加项目 删除项目等 我的管理面板中有一个列表 显示了集体管理部门之前执行的 10 项活动 今天 我决定每 30 秒进行一次自我更新 我的问题很简
  • 要实现 XML 可序列化,从 ICollection 继承的类型必须具有 Add 的实现

    我有来自现有项目的 CSLA 1 x 框架 对象 我试图在新的 Net 4 0 项目中使用它 这些对象正在生产中使用 如果没有 2 组对象 我确实无法将它们转换为 2 x 或 EF 在我的 c webservice 中 当我尝试运行它时 我
  • const int 列表而不是 enum

    我开始研究大型 C 代码库 并发现使用带有多个 const ints 字段的静态类 这个类的行为与枚举完全一样 我想将类转换为实际的枚举 但权力被拒绝 我想转换它的主要原因是这样我可以将枚举作为数据类型而不是 int 这对可读性有很大帮助
  • 允许调用函数覆盖默认选项 - jQuery UI 对话框

    我希望 CallingFunction 能够覆盖中提供的默认选项showDivPopUp功能 function calling showDivPopUp title of pop up box message to show buttons
  • 如何设计/规划Web应用程序开发?

    我有兴趣学习如何在多个开发团队场景中设计 规划 Web 应用程序开发 担任 项目经理 主管 的角色 成功的 Web 应用程序开发需要哪些 文档 需要哪些 UML 图以及需要到什么程度 在设计 计划阶段 是否需要根据用例对每个类进行图表化 类
  • C# 模式匹配

    我对 C 有点陌生 我正在寻找一个字符串匹配模式来执行以下操作 我有一个像这样的字符串 该书将在 唐宁街 11 号接待处 并将由主要医疗保健人员参加 我需要创建一个 span 标签来使用 startIndex 和 length 突出显示一些
  • “避免在公共 API 中使用库私有类型” - lint 警告,即使在说明书示例中也是如此?

    我注意到样式错误警告https dart lang github io linter lints library private types in public api html https dart lang github io lint
  • Python函数重载

    我知道 Python 不支持方法重载 但我遇到了一个问题 我似乎无法以一种很好的 Pythonic 方式解决它 我正在制作一个游戏 其中一个角色需要射击各种子弹 但是如何编写不同的函数来创建这些子弹 例如 假设我有一个函数 可以创建一颗以给
  • 使用 OOP 结构进行复数加法和减法

    我这里有一个代码应该打印两个复数的和与差 给出的说明是 制定方法add subtract and print to be void and 使用构造函数的对象进行测试 public class Complex param args publ
  • 对对象数组进行排序

    我在使用 PHP 手册中的示例时遇到了问题 所以我想在这里问这个 我有一个对象数组 有没有办法根据对象的内容对其进行排序 例如我的数组是 Array 0 gt stdClass Object id gt 123 alias gt mike
  • 在事件聚合器中混合枚举与事件类

    我最近尝试实现自己的简单事件聚合器 我从 MSDN 上的事件聚合器文章中获得了很多灵感 关于 MSDN 上的事件聚合器 我注意到一件事是事件实际上是它们自己的类 这根本不是一件坏事 然而 我只是觉得总是为每个小事件创建一个新的空类很尴尬 我
  • Android:单一活动,多个视图

    我不是 Android 专业人士 尽管我开发了一个包含 50 多个活动的应用程序 这使得该应用程序非常庞大 经过8周的开发 现在出现了一些问题 导致应用程序难以维护和升级 我正在处理的主要问题是 我无法将对象引用传递给活动的构造函数 事实上
  • 为什么我们需要将 delegate 设置为 self?为什么编译器不默认它?

    I think我完全理解授权的概念 我的问题是 当我们这样做时 class someViewController UIViewController UITableViewDelegate 会吗ever可能我们不想设置tableView de
  • [GoF]-ConcreteSubject 可以覆盖通知方法吗?

    我正在模拟一种情况 其中存在 通知框 观察者 list1 list2 list3 这个科目 现在我会制作一张图表 其中使用观察者模式描述每个列表实现不同类型的notify 这一事实 例如 列表状态的某些变化只需要按照某些标准通知给某些观察者

随机推荐

  • 可以使用iPhone进行编程吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 可以使用iPhone进行编程吗 任何
  • 强制捆绑程序将 gems 安装在用户的主目录中

    上次我尝试学习如何使用 Ruby on Rails 进行 Web 开发 并且使用了我的 Arch GNU Linux 机器 Arch 的政策要求 gems 安装在用户目录中 而不是通常的系统范围位置 然而 它与捆绑器的默认行为 尝试在系统范
  • 如何为 IntegerField 设置 NULL 而不是设置 0?

    我正在使用 xlrd 从 excel 文件上传一些数据 并将这些数据转换为 Django 中的模型 主要包含 IntegerField 值 我的 Excel 文件有大量缺失数据 不幸的是 这些缺失的数据在我的模型中被转换为 0 值 而不是
  • 不使用导航属性添加相关实体

    我有以下课程 用于测试 public class Company DatabaseGenerated DatabaseGeneratedOption Identity public int Id get set public string
  • 使用 PowerShell 替换方括号之间的逗号

    我有一个文本文件 在文件中 我有一些可能包含逗号的方括号 我想替换 删除这个逗号 说出文字 logissue type warning 列 员工 地址 职位 不要使用浮点数据类型 I want logissue type warning 列
  • 主题化 Drupal 7 的 Ubercart“/cart”页面

    我正在尝试为 Drupal 7 的 Ubercart 3 主题化 cart页面 但我正在努力寻找主题功能来做到这一点 我相信正确的代码可能位于template tpl php 但我不确定 Drupal 中哪里有主题化此页面的代码 创建一个新
  • simplexml 无需类型转换即可获取节点值

    有没有办法从a中获取节点值simplexml object without铸造它 amount int item gt amount 在我看来这不是很漂亮 我正在寻找一种更干净的方法 但到目前为止没有找到任何东西 wouldn t this
  • 如何在特定 XY 位置将位图覆盖在另一个位图上

    我正在开发一个使用画布的项目 用户可以触摸将一个位图覆盖移动到另一个位图 当用户按下保存按钮时 两个位图应合并并成为单个位图 我已经完成了所有操作 现在仍然在 XY 位置合并两个位图 在我的研究过程中 我发现了以下代码 private Bi
  • 使用 rscript 时出错

    我在 Mac OS X El Capitan 10 11 5 上安装了 R 的 Homebrew 版本 我已经成功使用 rscript 大约两周了 但是 当我今天早上尝试使用运行脚本时rscript file r 我收到以下错误 usr l
  • 模拟器中没有日历

    我正在构建一个应用程序 该应用程序访问 Facebook 帐户并获取事件 然后将它们添加到 Android 日历 模拟器中没有日历 我们尝试设置 Calendar apk 但没有成功 任何想法 我想直接通过代码将事件添加到日历中 是否可以或
  • IBM Worklight 6.0 - 启用控制台登录身份验证后出现混合端口号?

    希望进行 Worklight Console 身份验证 我按照此链接中的信息中心说明进行操作信息中心 http pic dhe ibm com infocenter wrklight v6r0m0 topic com ibm worklig
  • MATLAB 设置 - 如果出现错误则停止

    我发现 出错时始终停止 如果出错则停止 在调试 MATLAB 代码时非常有用 但是 关闭 matlab 也会将其重置为 如果出现错误 永不停止 我怎样才能让这个设置持续存在 这确实是解决方案 在 Mathworks 中进一步挖掘得出了确切的
  • 在 UIScrollView 中使用 UIImageView 或 UIButton 时出现问题

    我使用 UIScrollView 来保存大小为 80x80 的不同数量的图像 当用户点击一个图像时 我希望它启动到全屏显示等模式视图中 我遇到的问题是检测滚动视图内图像的触摸 到目前为止我已经尝试了两种方法 但每种方法都有一个问题 我以两种
  • 如何用前导 0 填充个位数

    我正在循环一个由一位数和两位数组成的数组 打印这些值时 我需要确保所有值都显示为两位数 我需要一个解决方案 在单位数字前面添加零 但保持两位数字不变 换句话说 我想通过添加零将数字字符串 左填充 到至少两位数字 如何更改代码以呈现值 1 到
  • 根据文本长度调整文本框和表单大小

    如何根据文本长度自动增大 减小 TextBox 和 Windows 窗体大小 您可以尝试覆盖文本更改时 http msdn microsoft com en us library system windows forms control o
  • axios response.blob 不是函数

    我试图从 nodeJS 传递一个类型为 image jpeg 的 blob 来做出反应 在nodejs端 我使用arraybuffer传递数据 在react端 我尝试使用res blob检索它 它通常应该将数据转换回来 问题是 axios
  • 创建两个具有相同源的 HTML5 视频元素不起作用

    我正在尝试做一件简单的事情 但到目前为止我还没有取得任何成功 而且我不明白为什么它不起作用 我需要两个 或多个 HTML5 视频元素来播放同一个视频 但它不起作用 这是我一直在尝试的代码 http jsfiddle net 4K8DZ ht
  • 杰克逊的“轻松”字段名称

    我正在尝试Jackson配置 我想知道是否有任何选项可以反序列化不同类型的字段模式 例如 我有一个对象 class DeserializeIt String fieldOne String fieldOneAndHalf String fi
  • IIS 7 重写规则和 Url.Content 问题

    我在 IIS 7 中有以下规则
  • 控制反转是面向对象语言特有的吗?

    提出这个问题的另一种方式是 您认为什么是控制反转 我问这个问题是因为维基百科文章IoC http en wikipedia org wiki Inversion of control已被非 OO 解释劫持 这是取自讨论页 http en w