- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在一篇关于面向对象编程的 Apple 论文中,它描述了对象之间发送消息。因此,Appliance
可以向 Valve
发送消息,表示请求水,然后 Valve
对象可以向 Appliance 发送消息
,“给水”。
(发送消息实际上是调用对方对象的方法)
所以我想知道,这是否会以某种方式导致微妙的无限循环,甚至连程序员都没有预料到?例如,一种情况是,如果我们对两个对象进行编程,每个对象都通过重力相互拉动,因此一个对象发送到另一个对象,即存在“拉”力,并且另一个对象的方法被调用,然后依次调用向第一个对象发送消息,它们将进入无限循环。因此,如果计算机程序只有 1 个进程或 1 个线程,它将简单地进入无限循环,并且永远不会运行该程序中的任何其他内容(即使两个对象最终碰撞在一起,它们仍然继续相互拉动)。这种编程范例实际上是如何防止这种情况发生的?
更新:这是 Apple 论文:http://developer.apple.com/library/mac/documentation/cocoa/conceptual/OOP_ObjC/OOP_ObjC.pdf
更新:对于所有看到这个明显的例子并说“你错了!程序应该是有限的,等等”的人,好吧,我的目标是,什么如果有数百或数千个对象,并且它们相互发送消息,并且当收到消息时,它们可能会依次向其他对象发送其他消息。那么,如何确定不会出现死循环,程序无法继续执行下去。
另一方面,对于那些说“程序必须是有限的”的人来说,那么简单的 GUI 程序又如何呢?它具有事件循环,并且是一个无限循环,运行直到用户明确要求程序停止。那么一个不断寻找素数的程序又如何呢?它可以继续查找(使用 BigNum,例如在 Ruby 中,这样整数可以有任意位数),因此程序只是编写为继续运行,并将下一个更大的素数写入硬盘(或写入每百万次找到更大的素数时,它会写入硬盘一次 - 因此它会找到 100 万个素数,并将第 100 万个素数写入硬盘驱动器,然后继续查找下一个 100 万个素数,并将第 200 万个素数写入硬盘驱动器(只写 1 个数字,而不是 100 万个)。好吧,对于一台 12GB 或 RAM 和 2TB 硬盘的计算机,也许你可以说程序可能需要 20 年才能超出计算机的能力,当硬盘磁盘已满或者12GB RAM无法容纳所有变量(1GB RAM可能无法容纳一个整数可能需要数十亿年),但就程序而言,它会继续运行,除非内存管理器无法分配另一个BigNum,或者硬盘已满,会引发异常并强制停止程序,但程序被编写为无限期运行。因此,并非所有程序都必须编写为有限的。
最佳答案
为什么Appliance
要反复请求水?
为什么 Valve
应该轰炸 Appliance
说正在供水?
理论上 - 它可能会创建无限循环,但实际上 - 它归结为您的对象的正确建模。
Appliance
应仅发送一次 ICanHasWater
消息,等待响应、接收水或收到无法提供水的答复,或者将来当 设备
可能想再次尝试请求水。
that's why I went into the 2 objects and gravity example instead.
仅当您在计算时触发此计算时,才会发生物体之间重力效应计算的无限循环。
我认为常见的方法是引入Time
概念并计算特定TimeFrame
的引力,然后继续进行下一轮计算。这样,您的World
就可以控制TimeFrames
之间的线程,并且您的应用程序可能会做一些比无休止地计算重力效应更有用的事情。
关于oop - 在OOP中,如果对象之间互相发送消息,是不是很容易出现死循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5484278/
我遇到的问题不是紧急情况,但我不知道该怎么做。我有两个 aspx 网络表单页面。每个都有一个下拉列表。两者都由来自 sql server 的相同数据源填充。问题是,如果我在第 1 页选择一个值,然后转
我正在使用 OpenvSwitch-2.5.2 在两个虚拟机上设置第 2 层网络,如上图所示。 在阅读了 ovs 官方教程和其他一些文章后,我在每个虚拟机上尝试了以下命令: # on vm1 ip l
我是一名优秀的程序员,十分优秀!