Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.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
Flash 在这里进行有关活动的最佳实践_Flash_Actionscript 3 - Fatal编程技术网

Flash 在这里进行有关活动的最佳实践

Flash 在这里进行有关活动的最佳实践,flash,actionscript-3,Flash,Actionscript 3,我想知道这方面的最佳做法是什么。这相当无关紧要,但我对人们的意见感兴趣 我们有两个类-TitleBar和TemplateMain。标题栏是屏幕顶部的一个栏,显示项目标题和TemplateMain运行相关功能所需的几个按钮(设置、打印、全屏等)。此时,模板侦听click MouseeEvent,然后使用switch语句获取事件的初始目标,例如: protected function onTitleBarClick(e:MouseEvent):void { switch (e.target){

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

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

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

     //     etc..

    }
}
将其移植到自定义事件系统中是否有任何优势或可取之处,或者扩展本机事件类,或者甚至作为3信号,以便标题栏本身具有单击侦听器,然后发送TemplateMain拾取的事件,然后相应地执行操作?我可以看到的一个负面影响是,除了鼠标单击侦听器之外,我还有另外六个自定义事件的侦听器


就像我说的,也许这并不重要,但我想知道其他人如何处理这种非常常见的情况。

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

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.
  }
}

但是,通常情况下,最好将处理程序分解,不要尝试使用一个综合处理程序。

我建议采用简单而直接的方法,将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);
  }
}

我个人更喜欢尽可能接近“黑箱”原则,即一个组件需要尽可能少地了解另一个组件

我会在标题栏中定义事件。当TemplateMain接收到事件时,它不必知道事件来自何处,只需要知道它是什么以及如何对它作出反应

这为您提供了两个选项,您可以使用dispatcher对象,或者标题栏本身可以是dispatcher,尽管我总是更喜欢组件松散耦合的情况

在事件侦听端,使用单个处理程序或多个函数实际上取决于函数的内容。我会追求清晰易读。我不认为为一行程序创建函数有什么意义,在这种情况下,我更喜欢switch语句


至于创建多个侦听器,我不认为这是一个问题,它允许您根据函数的使用寿命轻松删除其中一个侦听器。

为什么建议这样做?我认为最好尽量减少事件听众的数量,这就是我目前的做法。@U_tchock博士,我见过人们做你正在做的事情,但这并不好。它添加了在每次触发事件时都必须运行的额外代码,这是完全不必要的。单独的处理程序也更容易理解和维护——每个小函数只做一件事。在Flash的旧时代,使用单个处理程序处理所有事情是很常见的,因为Flash不支持闭包,但即使是在Flash MX 2004时代,ActionScript生成的闭包类也解决了这一问题。