Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events 何时使用事件?_Events_Oop - Fatal编程技术网

Events 何时使用事件?

Events 何时使用事件?,events,oop,Events,Oop,在工作中,我们有一个巨大的框架,并使用事件将数据从一部分发送到另一部分。我最近启动了一个personnal项目,我经常想用事件来控制对象之间的交互 例如,我有一个播放音效的混音器类,我最初认为应该接收事件来播放音效。然后我决定只让我的类保持静态并调用 Mixer.playSfx(SoundEffect) 在我的课堂上。我有很多这样的例子,我最初想到一个带有事件的实现,然后改变了主意,对自己说它太复杂了,什么都不能做 那么我什么时候应该在项目中使用事件呢?在哪些情况下,事件比其他技术具有更大的优

在工作中,我们有一个巨大的框架,并使用事件将数据从一部分发送到另一部分。我最近启动了一个personnal项目,我经常想用事件来控制对象之间的交互

例如,我有一个播放音效的混音器类,我最初认为应该接收事件来播放音效。然后我决定只让我的类保持静态并调用

Mixer.playSfx(SoundEffect)
在我的课堂上。我有很多这样的例子,我最初想到一个带有事件的实现,然后改变了主意,对自己说它太复杂了,什么都不能做


那么我什么时候应该在项目中使用事件呢?在哪些情况下,事件比其他技术具有更大的优势?

您通常使用事件来通知订阅者对象上发生的某些操作或状态更改。通过使用事件,可以让不同的订阅者做出不同的反应,通过将订阅者(及其逻辑)与事件生成器分离,对象变得可重用


在您的混音器示例中,我会让事件发出声音效果播放开始和结束的信号。如果我在桌面应用程序中使用它,我可以使用这些事件来启用/禁用UI中的控件。

调用子例程和引发事件之间的区别与:规范、选择、基数以及最终哪一方、发起方或接收方拥有控制权有关

对于调用,发起者选择调用接收例程,发起者指定接收者。这导致了多对一基数,因为许多调用者可能选择调用同一个子例程

另一方面,对于事件,发起者将引发一个事件,该事件将由选择接收该事件的例程接收。接收器指定它将从哪些启动器接收哪些事件。这将导致一对多基数,因为一个事件源可以有多个接收器


因此,关于调用或事件的决定,主要与发起方确定接收方还是接收方确定发起方有关。

这是简单性和可重用性之间的折衷。让我们用“发送电子邮件”过程来比喻:

如果你知道收件人,并且他们的数量是有限的,你可以随时确定,只需将他们放入“收件人”列表并点击“发送”按钮即可。这很简单,因为这是我们大部分时间使用的。这是直接调用函数

然而,对于邮件列表,您事先不知道有多少用户将订阅您的电子邮件。在这种情况下,您将创建一个邮件列表程序,用户可以在其中订阅邮件,电子邮件将自动发送给所有订阅的用户。这是事件建模

现在,即使在上述两个选项中,电子邮件都会发送给用户,但您可以更好地判断何时直接发送电子邮件以及何时使用邮件列表程序。运用同样的判断,希望你能得到答案:)

干杯


阿吉特

我在以前的工作场所使用了大量的代码库,我发现使用事件会大大增加复杂性,而且往往是不必要的

为了修复或扩展现有代码,我经常不得不对其进行反向工程。 在这两种情况下,当您可以简单地读取函数调用列表而不是仅仅看到事件的发生时,理解正在发生的事情要容易得多

该事件迫使您寻找用法,以便完全理解正在发生的事情。现代IDE没有问题,但如果您遇到许多函数,这些函数也会引发事件,它很快就会变得复杂。我曾经遇到过这样的情况,函数订阅事件的顺序很重要,尽管大多数语言甚至不能保证调用顺序

在某些情况下,使用事件确实是一个好主意。但是在你开始行动之前,考虑另一种选择。它可能更容易阅读和维护

使用事件的一个经典示例是UI框架,它提供按钮等元素。 您希望框架的函数“ButtonPressed()”调用一些函数,以便对用户操作作出反应。 例如,您可以订阅事件的替代方案是UI框架公开的公共bool“buttonPressed” 你可以定期检查它是否正确。当有数百个UI元素时,这当然是非常无效的