Actionscript 3 为什么使用自定义事件而不是直接方法调用?

Actionscript 3 为什么使用自定义事件而不是直接方法调用?,actionscript-3,flash,apache-flex,oop,events,Actionscript 3,Flash,Apache Flex,Oop,Events,我是编程新手,我已经查阅了很多游戏编码教程。我注意到,在大多数情况下,它们使用自定义事件来触发方法,而不是直接调用方法 这种做法背后的原因是什么?他们为什么不直接调用这个方法呢 例如: 我们有两个对象:A和BA有方法A.methodA()需要使用B方法 为什么要实施: B向A发送事件,通知A运行A.methodA() 而不是: B使用A.methodA() 通常在大型应用程序中,使用事件将有助于抽象所有内容。当您有15个以上的类,并且它们都在将事件添加到控制器时,要想弄清楚发生了什么事情要比通

我是编程新手,我已经查阅了很多游戏编码教程。我注意到,在大多数情况下,它们使用自定义事件来触发方法,而不是直接调用方法

这种做法背后的原因是什么?他们为什么不直接调用这个方法呢

例如:


我们有两个对象:
A
B
<当触发
X
条件时,code>A有方法
A.methodA()
需要使用
B
方法

为什么要实施:

B
A
发送事件,通知
A
运行
A.methodA()

而不是:

B
使用
A.methodA()


通常在大型应用程序中,使用事件将有助于抽象所有内容。当您有15个以上的类,并且它们都在将事件添加到控制器时,要想弄清楚发生了什么事情要比通读代码的所有不同部分来跟踪函数容易得多。使用回调开始创建意大利面代码


但是,直接函数调用的执行速度将比事件快

主要原因是利益分离。当使用事件时,类A不需要知道类B的存在(反之亦然)

这样做的一些好处是:

  • 更简单的单元测试(您可以在不使用类B的情况下测试类A)
  • 更改类别A或B时,破坏代码的可能性更小
  • 减少对代码中其他类的引用,从而减少内存泄漏的可能性
  • 清洁代码
  • 更灵活/可重用的代码(一堆其他类都可以侦听/响应事件,而无需在dispatcher中添加任何其他代码)

就我个人而言,我使用自定义事件只是为了方便使用。我可以让一个类在某件事情发生时(比如动画完成或下载时发生错误)调度一个事件,并且任意数量的其他类基于该事件运行任意数量的其他函数。此外,我还为可重用性编写了代码。每个类的目标是完全独立,这样它就可以在任何项目中运行,而不需要其他包。因此,我没有让一个类调用另一个类的方法,而是从第一个类中分派一个事件,第二个类侦听该事件,然后运行该方法。然后,当我需要另一个项目的第一个类时,我可以复制/粘贴它,而不必修改它,也不丢失任何功能

编辑: 另外,值得注意的是,有时人们会按照你的描述去做,以避免不得不在事件中传递参数

假设您在舞台上有一个按钮,您需要能够单击它,但是您还需要能够手动调用该方法。有些人没有意识到您可以传入一个null事件,并且只有一个方法。也可以将其设置为空默认参数,请参见以下内容:

private function onClickHandler( e:MouseEvent = null ):void{
    //as long as you never reference "e" within this method, this method can be used both for MouseEvent listeners and manually calling it elsewhere in the code
}
这种技术有助于避免事件处理程序只调用另一个方法而不调用其他方法。在编程的这一点上,我编写的每个AS3事件处理程序都默认将事件参数设置为null。这只会让以后的事情变得更容易。


另外请注意,使用回调方法允许您直接向其传递参数,而不是通过自定义事件模型。

我构建了自己的、非常简化的事件调度程序系统。事件模型非常强大,但在99%的情况下,您不需要这种能力。将参数作为事件激发的简单回调就足够了。您仍然可以保留事件模型的多功能性,但不需要为一个简单的按钮编写太多的代码行。 我可以设置这样一个简单的事件:

Buttonizer.autoButton(_buttQuit, this, "onPress");
public function onPressQuit(c:Sprite) {
// Execution goes here
}

您可以构建自己的事件模型,这将使生活更简单,代码更简洁。

好吧,每次需要触发方法时都进行引用,这将使垃圾收集器的生活更轻松=)(他将无需担心的事情)。+1;我还要补充一点,事件是对象与其父对象通信的正确方式。方法调用或公共属性是父类与其子类通信的正确方式。@www.Flextras.com-同意,特别是当子类与不同的父类一起使用时。