11

我是编程新手,我一直在检查很多游戏编码教程。我注意到他们中的大多数使用自定义事件来触发方法,而不是直接调用方法。

这种做法背后的原因是什么?他们为什么不只是调用该方法?

例如:


我们有两个对象:ABA有触发条件A.methodA()B需要使用的方法。X

为什么要实施:

B调度一个A告诉A运行的事件A.methodA()

代替:

B用途A.methodA()

4

5 回答 5

16

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

这样做的一些好处是:

  • 更容易的单元测试(你可以在没有 B 类的情况下测试 A 类)
  • 更改 A 类或 B 类时破坏代码的可能性较小
  • 减少代码中对其他类的引用,从而减少内存泄漏的可能性
  • 更清洁的代码
  • 更灵活/可重用的代码(一堆其他类都可以监听/响应事件,而无需在调度程序中添加任何额外代码)
于 2012-11-27T17:29:23.203 回答
4

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

但是,直接函数调用将比事件执行得更快。

于 2012-11-27T16:48:26.910 回答
2

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

编辑:另外,值得注意的是,有时人们会按照您的描述来绕过必须传递事件参数。

假设您在舞台上有一个按钮,您需要能够单击它,但您还需要能够手动调用该方法。有些人没有意识到你可以传入一个空事件并且只有一个方法。或者您可以将其设置为 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。它只是让以后的事情变得更容易。

于 2012-11-27T18:04:32.210 回答
1

你可能想读这个。

还要注意使用回调方法允许您直接将参数传递给它,而不是通过自定义事件模型。

于 2012-11-27T19:15:18.120 回答
1

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

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

你可以建立自己的事件模型,它会让生活更简单,你的代码也更简洁。

于 2015-09-18T20:47:52.377 回答