关于活动的最佳实践

时间:2010-09-24 13:17:41

标签: flash actionscript-3

我想知道最佳做法是什么。这是相当无关紧要的,但我对人们的意见感兴趣。

我们有两个类 - TitleBar和TemplateMain。 TitleBar是屏幕顶部的一个栏,显示项目标题和几个按钮(设置,打印,全屏等),TemplateMain需要监听这些按钮才能运行相关功能。目前,模板侦听click mouseevent,然后使用switch语句获取事件的初始目标,例如:

protected function onTitleBarClick(e:MouseEvent):void {
  switch (e.target){
    case (titleBar.settingsButton):
            addSettings();
            break;

     //     etc..

    }
}

是否有任何优势或者是否可以将其移植到自定义事件系统中,或者扩展本机Event类,或者甚至是as3signals,以便标题栏本身具有click监听器,然后调度TemplateMain选择的事件和那么行动呢?我可以看到的一个负面影响是,与鼠标点击监听器一起,我最终会有另外六个自定义事件的监听器。

就像我说的那样,也许没关系,但我想知道其他人如何处理这种非常普遍的情况。

3 个答案:

答案 0 :(得分:1)

我建议采用简单直接的方法将TemplateMain处理程序直接附加到各个按钮。如果您不想在两者之间建立紧密的关系,那么请使用单独的代理或其他东西来注册事件处理程序。

class TemplateMain {
  function addSettings(...) { }
  function doSomethingElse(...) { }
  function doAnotherThing(...) { }
}

class Broker {
  function registerHandler() {
    titleBar.settingsButton.addEventHandler("click", templateMain.addSettings);
    titleBar.somethingElseButton.addEventHandler("click", templateMain.doSomethingElse);      
    titleBar.anotherThingButton.addEventHandler("click", templateMain.doAnotherThing);
  }
}

答案 1 :(得分:0)

您可以使用自定义事件或常规事件,但实际上并不需要六个不同的侦听器。只需将事件参数转换为泛型,然后测试事件的“类型”。例如:

protected function onTitleBarClick(event:Event = null) : void {
  if (event is MouseEvent && event.type is MouseEvent.CLICK) {
    if (event.target is titleBar.settingsButton) {
      // statements
    }
    if (event.target is titleBar.someOtherButton) {
      // statements
    }
  }
  if (event is MyCustomChangeEvent && event.type is MyCustomChangeEvent.SOME_TYPE) {
     // statements, etc.
  }
}

然而,通常情况下,最好分手处理程序而不是尝试使用一个综合处理程序。

答案 2 :(得分:0)

我个人更喜欢尽可能接近“黑匣子”原则,其中一个组件需要尽可能少地了解另一个组件。

我会去定义TitleBar中的事件。当TemplateMain收到一个事件时,它不必知道事件的来源,它是什么以及如何对它作出反应。

这为您提供了几个选项,您可以使用调度程序对象,或者TitleBar本身可以作为调度程序,尽管我总是喜欢组件松散耦合。

在事件监听结束时,使用单个处理程序或许多函数将完全取决于函数的内容。我会去清楚&易读性。我没有看到为一个内衬创建函数的意义,在这种情况下我会赞成switch语句。

至于创建一些听众,我不认为这是一个问题,它允许你根据功能的生命轻松删除一个或另一个。