gpt4 book ai didi

oop - 在OOP中,如果对象之间互相发送消息,是不是很容易出现死循环?

转载 作者:行者123 更新时间:2023-12-02 08:55:08 25 4
gpt4 key购买 nike

在一篇关于面向对象编程的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com