Лучшая практика здесь в отношении событий - PullRequest
0 голосов
/ 24 сентября 2010

Мне интересно, что можно считать лучшей практикой для этого. Это довольно несущественно, но меня интересуют мнения людей.

У нас есть два класса - TitleBar и TemplateMain. TitleBar - это панель в верхней части экрана, которая отображает заголовок проекта и несколько кнопок (настройки, печать, полноэкранный режим и т. Д.), Которые TemplateMain должен будет прослушивать для запуска соответствующих функций. В данный момент шаблон прослушивает событие мыши click, а затем использует оператор switch для получения начальной цели события, например:

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

     //     etc..

    }
}

Будет ли какое-либо преимущество или желательно перенести это в пользовательскую систему событий, либо расширяя собственный класс Event, либо, возможно, даже as3signals, чтобы заголовок заголовка сам слушал, а затем отправлял событие, которое TemplateMain подхватил и тогда действует соответственно? Один из негативных моментов, который я вижу, состоит в том, что наряду со слушателем щелчка мышью у меня получилось бы еще шесть слушателей пользовательских событий.

Как я уже сказал, возможно, это не имеет значения, но я хотел бы знать, как другие справляются с этой очень распространенной ситуацией.

Ответы [ 3 ]

1 голос
/ 24 сентября 2010

Я бы порекомендовал выбрать простой и понятный способ присоединения обработчиков 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);
  }
}
0 голосов
/ 24 сентября 2010

Лично я предпочитаю оставаться как можно ближе к принципу «черного ящика», когда один компонент должен знать как можно меньше информации от другого компонента.

Я бы пошел для определения событий в панели заголовка.Когда TemplateMain получает событие, ему не нужно знать, откуда оно происходит, каково это и как на него реагировать.

Это дает вам пару вариантов, вы можете использовать диспетчеробъект, или сам TitleBar может быть диспетчером, хотя я всегда предпочитаю, когда компоненты слабо связаны.

На конце прослушивания событий, использовать один обработчик или много функций будет зависеть от содержания ваших функций действительно,я бы пошел для ясности и разборчивости.Я не вижу смысла в создании функции для одного слоя, в таком случае я бы предпочел оператор switch.

Что касается создания ряда слушателей, я не вижу в этом проблемы, это позволяет вам легко удалить одну или другую в зависимости от срока службы функции.

0 голосов
/ 24 сентября 2010

Вы можете использовать пользовательское событие или обычное событие, но вам на самом деле не нужно шесть разных слушателей. Просто приведите аргумент события к чему-то общему, а затем проверьте «тип» события. Например:

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

Однако обычно лучше разбить ваши обработчики и не пытаться использовать один обработчик omnibus.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...