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

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(使用前将#替换为@)

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

  • 为什么不在java中的匿名类中使用构造函数?它与OOPs规则相矛盾[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题似乎偏离主题 因为它缺乏足够的信息来诊断问题 更详细地描述您的问题或包括一个最小的例子 http stackoverflow co
  • 如何在C++中正确实现工厂方法模式

    C 中有这样一件事让我在很长一段时间内感到不舒服 因为老实说我不知道 该怎么做 尽管它听起来很简单 如何在 C 中正确实现工厂方法 目标 允许客户端使用工厂方法而不是对象的构造函数来实例化某个对象 而不会产生不可接受的后果和性能影响 我所说
  • 这种设计模式在 JavaScript/jQuery 中被称为什么?

    我正在查看 JavaScript 源代码光滑网格 https github com mleibman SlickGrid 我注意到 slick grid js 具有以下结构 function Slick Grid extend true w
  • 每个用户的单例模式 ASP.NET C#

    我正在使用 asp net c 构建一个 Web 应用程序 并且我有一个类 我想在多个页面中使用该类 而无需每次都实例化它 我需要加载其中的数据并且在用户会话期间永远不会丢失它们 我考虑过单例模式 但它在浏览器之间共享类的实例 我该如何解决
  • 全局常量是反模式吗?

    我一直认为仅仅为了保持常量而创建一个类是一个糟糕的设计 但最近 我尝试用谷歌搜索它 发现只有一个界面作为常量是不好的反模式 没有提到使用一类常量 我认为 由于常量类实际上与全局变量没有太大区别 这就是我反对它并倾向于重构此类类的原因 它创建
  • 将状态上下文作为附加方法参数嵌入到状态中有何优缺点?

    在设计模式的背景下state 嵌入的优点和缺点是什么StateContext作为附加方法参数State 为了更清楚地说明 public void handle Object obj vs public void handle StateCo
  • 如何将只缓存某些内容的字段添加到ADT?

    我经常需要向 ADT 添加字段 仅记住一些冗余信息 但我还没有完全弄清楚如何又好又高效地做到这一点 说明问题的最好方法是举个例子 假设我们正在使用无类型 lambda 项 type VSym String data Lambda Var V
  • 丰富的领域模型和 ORM

    Martin Fowler 认为贫血领域模型是一种反模式 将持久性模型作为域模型进行滚动似乎也严重偏离 因为对象关系阻抗不匹配 http en wikipedia org wiki Object Relational impedance m
  • matlab中类库的全局变量

    我有一些matlab声明的类 我如何声明所有类中都可见的常量 例如 这些常量可以是在所有类的方法中使用的物理常量 首先想到的是使用全局变量 还有更好的办法吗 最好在单独的文件中声明这些常量 包含常量的类是执行此操作的一种很好的干净方法 请参
  • 使用超类创建构建器时,父类无法返回子类的实例[重复]

    这个问题在这里已经有答案了 如果我使用构建器模式来配置新对象 我可能有两个类 例如Game and HockeyGame 如下所示 当我想创建一个新的HockeyGame 我得到它的构建器并开始调用方法来根据需要配置对象 我遇到的问题显示在
  • Objective-C 继承中@synthesize/@property 的使用

    如果您有一个带有实例变量 foo 的类 A 该类具有 property synthesize 指令 并且类 B 继承自类 A 那么它是否还需要 property synthesize foo 我问的原因是因为当我尝试使用 B 类的 foo
  • 有哪些基于对象的 shell?

    我打算写一个面向对象的shell 基于Python 我已经有很多想法了 但在实现它之前 我想通过一些现有的 shell 来激发我的灵感 我所说的面向对象的基本意思是 参数不仅仅是字符串数组 而且是对象数组 返回值也是一个对象 不仅有 std
  • 如何只获取父类对象的属性

    我有两节课 class Parent object def init self id name self id id self name name self parent vars id name make a copy def print
  • 访客模式如何不违反开放/封闭原则?

    来自维基百科 这个想法是 一旦完成 类的实现只能修改为 纠正错误 新的或更改的功能将需要创建不同的类 该类可以通过继承重用原始类的代码 据我了解 访问者模式是一种强大的技术 可以通过使用双重分派来遍历实现相同接口的相似但不同的对象 在我的一
  • 使用 Unity 如何将命名依赖项注入构造函数?

    我有IRespository在以下代码中注册了两次 带有名称 Setup the Client Repository IOC Container RegisterType
  • 如何使用 Laravel IoC 将数据库注入构造函数

    我想使用 DB 类与 IoC 容器进行事务处理 use Illuminate Database Connection as DB public function construct DB db this gt db db 但是当使用 db
  • tkinter - 使用按钮在帧之间来回切换

    我需要功能 最好是一个功能 当按下下一页和后退按钮时可以在页面之间来回切换 我想这可以通过将布尔变量分配给后退和下一页按钮来完成 不确定是否可以这样做 来确定您是否要前进或后退所有页面的有序列表 需要知道当前升高的框架的索引 索引可用于找出
  • 当在 Repository/UnitOrWork 之上使用 Service 类时,我应该在哪里放置逻辑不适合 Repository 的常用数据访问代码?

    In my 先前的问题 https stackoverflow com questions 24906548 using the generic repository unit of work pattern in large projec
  • 你怎么知道何时使用设计模式? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 任何人都可以阅读 GoF 书来了解什么是设计模式以及如何使用它们 但是弄清楚设计模式何时解决问题的过程是什么 模式的知识是否驱动设计
  • 开闭原则背后的含义和推理是什么?

    开放 封闭原则规定软件实体 类 模块等 应该对扩展开放 但对修改关闭 这意味着什么 为什么它是良好的面向对象设计的重要原则 这意味着您应该将新代码放入新的类 模块中 现有代码应仅针对错误修复进行修改 新类可以通过继承重用现有代码 开放 封闭

随机推荐

  • 可以使用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