我应该在这里使用直接函数调用而不是事件处理程序吗?

时间:2012-12-21 07:35:17

标签: actionscript-3 flash actionscript

我正在使用Actionscript3,构建一个类似MMO的游戏,我负责UI等等。我在很多工作流程中都使用了Events,但我的合作伙伴建议我使用直接函数调用我的UI资源。这是一个例子:

  1. 我创建了一个 ColorChooser 类,我们用它来重新着色用户头像的某些部分。
  2. 当您单击某种颜色时, ColorChooser 会读取(点击色谱图像)的像素并调度一个事件( ColorChooser.COLOR_CHOSEN )。
  3. 我的 AvatarDesigner 类正在侦听此事件。
  4. 当调度事件时, AvatarDesigner 中的处理程序事件将(e.target as ColorChooser).chosenColor 读取并将该颜色应用于头像的选定部分。
  5. 我的搭档建议我改为:

    1. ColorChooser 提供其父 AvatarDesigner 对象( _avatarDesigner )的实例。
    2. 点击颜色后,阅读点击的像素( var chosenColor:uint )并从 ColorChooser 中调用 _avatarDesigner.colorAvatar(chosenColor) strong> object。
    3. 现在,我的大多数UI都使用了事件,因此我可以保留下拉菜单,按钮,textareas等资源,并且可以重复使用。我想我们会将这个ColorChooser对象重用于其他东西(ObjectDesigner,WallpaperDesigner,BuildingDesigner)。他说,每次将ColorChooser用于其他东西时,最好在ColorChooser中添加一个条件,所以也许就像:

      private function colorClicked(e:MouseEvent):void {
          var chosenColor:uint = *the color chosen (bitmapdata.getpixel());*
          switch(parent){
              case AvatarDesigner:    (parent as AvatarDesigner).colorChosen(chosenColor); 
                                      break;
              case ObjectDesigner:    (parent as ObjectDesigner).colorChosen(chosenColor); 
                                      break;
              case WallpaperDesigner: (parent as WallpaperDesigner).colorChosen(chosenColor); 
                                      break;
              case BuildingDesigner:  (parent as BuildingDesigner).colorChosen(chosenColor); 
                                      break;
          }
      }
      

      或类似的东西(也许不是检查父,在构造函数或其他东西中检查字符串“type”)。这对我来说很奇怪,因为每次在其他地方使用它时我都必须重新加入一个案例。而对于事件,它可以触发它的事件,并处理或不处理它,无论它的父级是什么。他的一些推理是:

      • 事件应仅用于异步事件或输入(鼠标,键盘)
      • 调度事件和侦听器占用更多cpu
      • 直接函数调用更快,因为它是当前线程的一部分,而不是在稍微不同的时间调度和处理
      • Actionscript3和Away3D(用于3D)不会以这种方式使用事件

      我觉得事件是合适的,例如:

      • 允许对象完全独立于父母,使其更具可重用性
      • 我不认为调度事件和侦听器占用更多CPU(例如,因为任何给定的Sprite在任何给定时间调度许多事件,如ENTER_FRAME,MOUSE_OUT,ADDED_TO_STAGE)而没有看到性能损失
      • 如果在dispatchEvent之后的侦听器中发生与顺序相关的任务,则轻微的异步性并不重要
      • Away3D在尝试了一下他们的API后,确实以这种方式使用它们。

      任何人都可以对此有所了解吗?每次我在不同类型的父母身上使用这个资产时,在新的逻辑条件下,比如说“ShinyButton”,是否值得进行硬编码?即使事件和监听器正在使用CPU,也不会添加这样的条件使它有点意大利面?是什么?

      另外,对于我的生活,我找不到一个Actionscript3最佳实践,以便在事件好或坏时,为什么。另外,如果有人知道如何在低级别使用事件,我会很高兴。

      感谢阅读!

2 个答案:

答案 0 :(得分:3)

我认为你的不同观点是基于习惯而不是真正的原因。

我会个人使用个人事件模型,这是我想到的最开放,最灵活的解决方案。

但是如果您想使用回调函数而无需返回ColorChooser,则可以使用IColorReceiver之类的必需方法创建类似applyColor(color:Color){};的接口(Speaking)编程最佳实践,您应该知道方法名称更清晰,使用“applyColor”或“chooseColor”等动词而不是形容词或“colorChosen”之类的名称,这并不意味着很多)

然后在您的colorPicked(e:MouseEvent){}方法中,确保parent实施IColorReceiver,并且在没有其他测试的情况下调用applyColor(chosenColor);而不是具有IColorReceiver的测试。它也可以与经典继承一起使用,但需要更多代码以降低灵活性。

我不提供代码,但你似乎有一个合理的水平,所以我很自信。 ;)

(希望我的英语是正确的)

答案 1 :(得分:1)

简短的回答,我认为你是对的,而你的朋友是错的。任何感知到的性能提升(如果有的话)都可以忽略不计,正如您预期的那样,引入的tight-coupling会使您在其他情况下重用组件变得困难,并使您的项目整体难以维护。

ActionScript是一种基于事件的异步语言,如果你鼓励他接受它而不是与它斗争,你就会帮助你的朋友!

要回答有关ActionScript 3.0开发最佳实践的问题,我认为您可能会比查看Flex框架的某些组件的结构更糟糕。这些是由Adobe工程师开发的,因此可以被视为最佳实践的演示。您将发现大量使用事件以避免不同组件或组件参与者之间的紧密耦合,以及最少使用您朋友建议的smelly代码。