Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   альтернатива пользовательским событиям (http://www.flasher.ru/forum/showthread.php?t=211578)

Dmitriy154 25.09.2015 12:56

альтернатива пользовательским событиям
 
Уважаемые знатоки, подскажите такой теоретический вопрос по пользовательским событиям (ПС).
Для создания ПС мы делаем класс, допустим GameOver extends EventDispatcher и в конце игры делаем так
Код AS3:

dispatchEvent(new Event(GameOver.GAME_OVER));

В главном классе мы прописываем
Код AS3:

        var konec:GameOver = new GameOver ();
konec.addEventListener(GameOver.GAME_OVER, konecListener);

1.Не проще ли информировать о конце игры, вызывая к примеру метод Main.konecGame из нужного класса
2.Либо прослушивать флажок о конце игры в EnterFrame, ведь по сути слушатель ПС konec.addEventListener(GameOver.GAME_OVER, konecListener), также потребляет память каждый кадр?
В чем смысл использования ПС простыми словами?
Спасибо

alexandrratush 25.09.2015 13:44

1. Кривая архитектура приложения.
2. Не оптимально слушать в каждом кадре смену флажка.

Цитата:

ведь по сути слушатель ПС konec.addEventListener(GameOver.GAME_OVER, konecListener), также потребляет память каждый кадр
Кто вам такое сказал? Вы привязали слушатель к событию, и он вызовется, когда будет отправлено это событие.

Sevil 25.09.2015 13:53

Представь, у тебя 150 классов, 100 из них надо уведомить об окончании игры, что будешь делать?

Dmitriy154 25.09.2015 14:16

Цитата:

Сообщение от alexandrratush (Сообщение 1187249)
Вы привязали слушатель к событию, и он вызовется, когда будет отправлено это событие.

Для того он и слушатель, что постоянно слушает (как мне кажется, каждый раз в кадр), потребляя немного памяти, для чего же тогда удаляют ненужные слушатели(приемники)? И еще вопрос к вам, в чем заключается кривая архитектура?

Добавлено через 43 секунды
Цитата:

Сообщение от Sevil (Сообщение 1187250)
Представь, у тебя 150 классов, 100 из них надо уведомить об окончании игры, что будешь делать?

Т.е. мы регистрируем в каждом из 100 классов по слушателю пользовательского события? Или как мы будем информировать все классы? В чем различие (преимущество) от использования обычного метода класса Main?

udaaff 25.09.2015 14:25

События нужны, для обеспечения принципа слабой связанности компонентов программы, сокрытия кода и инкапсуляции. И это вопрос об архитектуре приложения в целом, а не о конкретном кейсе. Проще в частном случае, не означает проще в целом. В целом может быть сложнее. Код может превратиться в спагетти, т.к. части будут спутаны друг с другом.
Слушатель "не слушает". Это обработчик события - он "обрабатывает" событие, которое ему передаётся.

Dmitriy154 25.09.2015 14:31

Цитата:

Сообщение от udaaff (Сообщение 1187254)
Слушатель "не слушает". Это обработчик события - он "обрабатывает" событие, которое ему передаётся.

Я имею в виду отмену регистрации приемника

illuzor 25.09.2015 14:31

Цитата:

для чего же тогда удаляют ненужные слушатели?
- Для того, чтобы удалить лишние связи, когда они не нужны, чтобы gc мог сделать свою работу.
- Для избежания ошибок. В удалённом объекте, даже если на него не осталось ссылок, слушатели продолжат работать. Из-за этого возможны ошибки этапа выполнения.

Dmitriy154 25.09.2015 14:34

Цитата:

Сообщение от illuzor (Сообщение 1187256)
- Для того, чтобы удалить лишние связи, когда они не нужны, чтобы gc мог сделать свою работу.
- Для избежания ошибок. В удалённом объекте, даже если на него не осталось ссылок, слушатели продолжат работать. Из-за этого возможны ошибки этапа выполнения.

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

Добавлено через 2 минуты
Пока я для себя сделал вывод, что преимущество использования пользовательского события, как сказал Udaaff - для обеспечения принципа слабой связанности компонентов программы, сокрытия кода и инкапсуляции. Т.е. для небольшого приложения допустимо использовать другие способы.

undefined 25.09.2015 15:29

Цитата:

допустим GameOver extends EventDispatcher
лучше так:
GameOver extends flash.events.Event

MikroAcse 25.09.2015 16:10

Слушатели не "слушают" ничего каждый кадр.
Они просто посредники между двумя классами.

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


Часовой пояс GMT +4, время: 22:18.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.