Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Флейм (http://www.flasher.ru/forum/forumdisplay.php?f=53)
-   -   В AS 3.0 нехватает типов событий. (http://www.flasher.ru/forum/showthread.php?t=152072)

fish_r 11.03.2011 12:02

В AS 3.0 нехватает типов событий.
 
... Мне так кажется. Основным Display Object'ам для большей абстракции. Я бы хотел, чтобы было событие, например, Event.Movie для того, чтобы объект мог сообразить, что его перемещают. Всё равно кто - parent-объект или пользователь. А, то паренту приходится информировать чилда, что его вот уже 15 кадров по асфальту мордой таскают :). Или например Event.Resize, для того, чтобы сообщить объекту что его размеры изменяются чем то или кем то снаружи. Такие события сделали бы объект более похожим на физические объекты реального мира. Как думаете?

Может это очевидно, да сложности с практической реализацией?

А кому, ещё каких событий не хватает?

gloomyBrain 11.03.2011 12:13

Цитата:

например, Event.Movie для того, чтобы объект мог сообразить, что его перемещают.
Для этого можно переопределить методы get x /set x, get y/set y. Равно как и с ресайзом

CrazyFlasher 11.03.2011 12:41

Код AS3:

package {
        import flash.display.DisplayObject;
        import flash.events.Event;
 
        /**
        * ...
        * @author Anton Nefjodov
        */

        public class CommonDisplayObject extends DisplayObject {
 
                public function CommonDisplayObject() {
                        super()
                }
 
                override public function set x(value:Number):void {
                        super.x = value;
 
                        dispatchEvent(new Event("move"));
                }
 
                override public function set y(value:Number):void {
                        super.y = value;
 
                        dispatchEvent(new Event("move"));
                }
 
                override public function set z(value:Number):void {
                        super.z = value;
 
                        dispatchEvent(new Event("move"));
                }
        }
 
}


fish_r 11.03.2011 13:34

Ух-ты!!! Thank's! Блин, сам бы не додумался.

Добавлено через 2 минуты
Цитата:

Сообщение от CrazyFlasher (Сообщение 979537)
Код AS3:

package {
        import flash.display.DisplayObject;
        import flash.events.Event;
 
        /**
        * ...
        * @author Anton Nefjodov
        */

        public class CommonDisplayObject extends DisplayObject {
 
                public function CommonDisplayObject() {
                        super()
                }
 
                override public function set x(value:Number):void {
                        super.x = value;
 
                        dispatchEvent(new Event("move"));
                }
 
                override public function set y(value:Number):void {
                        super.y = value;
 
                        dispatchEvent(new Event("move"));
                }
 
                override public function set z(value:Number):void {
                        super.z = value;
 
                        dispatchEvent(new Event("move"));
                }
        }
 
}


А как в вашем коде на событие подписаться?

goodguy 11.03.2011 13:44

Можно и свое событие создать, в чем проблема то? Не понимаю как их может не хватать.

Цитата:

А как в вашем коде на событие подписаться?
Зачем подписываться на событие в коде, который это событие и посылает? Очевидно, что подписываются на событие где-то в другом месте. Как обычно:

Код AS3:

someObject.addEventListener("move", doSomething, false, 0, true);


CrazyFlasher 11.03.2011 13:47

Код AS3:

commonDsiplayObject.addEventListener("move", onMove);


fish_r 11.03.2011 13:59

Цитата:

Сообщение от CrazyFlasher (Сообщение 979561)
...

Спасибо, еще раз!

CrazyFlasher 11.03.2011 14:00

2goodguy: WeakReference - зло

fish_r 11.03.2011 14:05

Цитата:

Сообщение от goodguy (Сообщение 979560)
...Зачем подписываться на событие в коде, который это событие и посылает? ...

За тем, что это событие интересует именно тот объект который его и послал, конечно.
Хотя тут, конечно, можно уже и прямо метод вызывать.... в общем, да, вы правы, это в общем то и не нужно.

Diestro 11.03.2011 14:55

Схема с переопределением сеттеров на свойства x и y не всегда поможет. В частности при использовании startDrag().

fish_r 11.03.2011 15:13

Цитата:

Сообщение от Diestro (Сообщение 979590)
...

А часто ли startDrag() не сопровождается MOUSE_MOVE? Все равно же стараемся какой то контроль за перемещением объекта сохранять.

Diestro 11.03.2011 16:05

Я воообще-то об этом речь и веду, что при использовании startDrag() перемещение объекта придется отслеживать каким либо альтернативным способом, MOUSE_MOVE например.

А то что при изменении свойств объекта сеттер не срабаттывает никого не смущает?

fish_r 11.03.2011 16:28

Действительно, не срабатывает. Интересно - это баг или фича? :)

goodguy 11.03.2011 17:39

Цитата:

Сообщение от CrazyFlasher (Сообщение 979568)
2goodguy: WeakReference - зло

Нет. NormalReference - зло :D
Сами адобовцы рекомендуют использовать weak refference, что, собственно логично, нет объекта- нет слушателя. + уменьшает вероятность утечек памяти.

Цитата:

Я воообще-то об этом речь и веду, что при использовании startDrag() перемещение объекта придется отслеживать каким либо альтернативным способом, MOUSE_MOVE например.
Я бы лучше по энтер фрейму или по таймеру перемещение всех нужных объектов отслеживал. Надежнее и точнее.

Bgg 11.03.2011 17:41

Советует при каждой подписи слушателя?

goodguy 11.03.2011 17:54

Если бы советовали при каждой подписи, то скорее всего сделали бы параметр true по умолчанию.
Советуют использовать их, если есть вероятность, что разработчик забудет удалить слушатель с объекта, перед удалением самого объекта. В этом случае его удалит сборщик мусора. Но нет ни слова о том, что его не нужно использовать в каких бы то ни было ситуациях, стало быть можно всегда.
Лично я использую их всегда и везде уже более полугода, и никаких минусов не обнаружил.
Может CrazyFlasher, приведет какой-то весомый аргумент против WeakReference?

Bgg 11.03.2011 17:56

Я бы не стал полагаться на GC...

goodguy 11.03.2011 17:58

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

CrazyFlasher 11.03.2011 18:32

всё что создал, надо за собой и убрать...это должно войти в привычку...а то получается сыр-бор в коде...для отладки есть profiler.
я просто не вижу в weak reference смысла

ps_spectre 11.03.2011 18:47

Цитата:

я просто не вижу в weak reference смысла
+миллион.

всегда за собой надо подчищать, это аксиома.


кстате, на счет weak reference, может кто-то приведет примеры когда оно работает. (это риторический вопрос)
А то я видел только для анонимных функций полезность сего. (а сами аноним ф-ю для листенеров -- уже зло)


Добавлю: не так написал, конечно, когда ссылок нету и реально GC работает, то weak reference оно подчищается.
Только вот в реальном проекте это далеко не очевидно когда произойдет, т.к. GC не управляемый (не считая дебаг режим).
И лучше всего removeEventListener не забывать делать, а не полагаться на сборку мусора.

goodguy 11.03.2011 19:11

Цитата:

Сообщение от CrazyFlasher (Сообщение 979677)
всё что создал, надо за собой и убрать...это должно войти в привычку...а то получается сыр-бор в коде...для отладки есть profiler.
я просто не вижу в weak reference смысла

"не вижу смысла" и "это - зло" - абсолютно разные понятия. Должно войти в привычку делать все максимально надежно. И WeakReference уж точно никак коду не вредит, подчищать все за собой вручную не мешает и сыр-бора не создает. Так что лучше использовать weak reference, чем не использовать.

Bgg 11.03.2011 19:18

Цитата:

Сообщение от goodguy (Сообщение 979664)
Вдруг где-то забудешь удалить слушатель.

Забудешь - уволить, оштрафовать, сделать профилактическую трепанацию черепа, наложить порчу.

CrazyFlasher 11.03.2011 19:31

кстати насчёт вызова GC есть штуки (которые я не советую юзать)...до 10-го плеера можно было написать:
Код AS3:

                         try {
                                new LocalConnection().connect('foo');
                                new LocalConnection().connect('foo');
                        } catch (e:Error) {
 
                        }

с 10-ки
Код AS3:

new Loader().unloadAndStop(true);


goodguy 11.03.2011 19:38

Цитата:

(которые я не советую юзать)
- не убедительно
где аргументация?

iNils 11.03.2011 19:53

Цитата:

Сообщение от CrazyFlasher (Сообщение 979677)
всё что создал, надо за собой и убрать...это должно войти в привычку...а то получается сыр-бор в коде...для отладки есть profiler.
я просто не вижу в weak reference смысла

На самом деле, все упирается в надежность WeakReference. Если оно работает как надо, проблем нет, если бывают конкретные огрехи, тоже не так страшно, но если работает раз через раз, то это уже проблема. В самом первом случае я не вижу проблем в использовании WeakReference, практика "всё что создал, надо за собой и убрать" на сама деле усложняет код и как следствие ведет к ошибкам.

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

CrazyFlasher 11.03.2011 19:53

ну 1-ый способ не задокументированный...это скорее хак. И никто вам не гарантирует, что он будет работать в новых версиях плеера.
2-ой способ создан для того, чтобы вызывать GC после unloadAndStop. Соответственно
Код AS3:

new Loader().unloadAndStop(true);

опять таки хак.
Т.к. нет нормального способа, а System.gc() работает только в debug плеере, значит есть на то причины

Котяра 11.03.2011 19:54

Где-то на гарбажколлекторе есть убедительная статья - почему не надо юзать викреференсы.

iNils 11.03.2011 20:17

Цитата:

Сообщение от Котяра (Сообщение 979713)
Где-то на гарбажколлекторе есть убедительная статья - почему не надо юзать викреференсы.

В массы ее!

goodguy 11.03.2011 20:55

Там уже ничего нет, сайт дохлый http://www.garbagecollector.com/
а вот Грант Скиннер как раз рекомендует их использовать http://gskinner.com/blog/archives/20...akly_refe.html

Diestro 12.03.2011 09:04

Цитата:

Сообщение от fish_r (Сообщение 979628)
Действительно, не срабатывает. Интересно - это баг или фича? :)

Больше похоже на баг.

fish_r 12.03.2011 09:53

"This is why weakly referenced event listeners are so handy in AS3 – if you forget to remove the listener, you will not impede the Garbage Collector’s ability to collect the object... " Грант Скиннер

Как то звучит... незнаю. А если вы утром штаны забудете одеть? С другой стороны, эта фраза говорит ещё и о неуверенности, что на слабую ссылку можно положиться и уже не обращать внимание на "подтирание" за собой (прошу прощения за вульгарность, но это ведь так и есть :)). Получается не очень убедительно.


А слабая ссылка, всё таки, действительно работает надёжно? Или, действительно, ненадежно?

Добавлено через 14 минут
Мук пишет, что GC "по своему усмотрению" удалит объект на который подписались со слабой ссылкой. То есть если решение об удалении не будет принято, то он-объект будет всё так же диспатчить, например, события, хотя других ссылок на него уже может и не быть. И не рекомендует их использовать. Мук, может быть не для всех "икона стиля" , и не конечная инстанция, но всё таки еще одно авторитетное "против".

goodguy 12.03.2011 11:57

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

Цитата:

Мук пишет, что GC "по своему усмотрению" удалит объект на который подписались со слабой ссылкой.
Вообще, он такого не пишет, это чушь. Специально перечитал эту главу. Они пишет об анонимных функциях со слабой ссылкой. Если приложение не использует достаточно памяти, для того, чтобы сработал сборщик мусора, то и слушатель удален не будет. И никакого мнения против этого он не высказывал.
Цитата:

As a best practice, simply avoid stranding event
listeners.
Просто совет, и не более того.

fish_r 12.03.2011 13:03

Цитата:

Сообщение от goodguy (Сообщение 979851)
... И никакого мнения против этого он не высказывал...

"Специально перечитал эту главу":

"Из этого следует, что вообще не следует полагаться на параметр исполь -
зоватьСлабуюСсылку как на способ автоматического удаления приемников
событий. Наилучшее решение — просто избегать появления заброшенных приемников
событий."

Это что? Мнение "За"? Конечно, это совет, а как иначе, он ведь не начальник нам.

Что по поводу мухи, то в кодинге "мух" не бывает, или они кажутся мухами до поры до времени...

Добавлено через 22 минуты
Цитата:

Сообщение от goodguy (Сообщение 979851)
...Вообще, он такого не пишет, это чушь. Специально перечитал эту главу. Они пишет об анонимных функциях со слабой ссылкой...

А что? Велика разница между анонимной функцией со слушателем и объектом с аннулированными ссылками на него со слушателем, в рассматриваемом, разумеется, контексте?

goodguy 12.03.2011 13:52

Цитата:

"Из этого следует, что вообще не следует полагаться на параметр исполь -
зоватьСлабуюСсылку как на способ автоматического удаления приемников
событий.
Опять пришли к тому же :D
Как-будто кто-то кого-то заставляет использовать слабые ссылки.

Все началось с того, что КрейзиФлешер назвал их злом, каковым они не являются.
Для меня лично самое авторитетное мнение такое: "я их использую всегда, потому что мне так хочется" :D И пофиг другие мнения

Цитата:

Что по поводу мухи, то в кодинге "мух" не бывает, или они кажутся мухами до поры до времени...
"Мухи", в данном случае мелочи, бывают везде, и кодинг не исключение.

fish_r 12.03.2011 15:38

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

Котяра 12.03.2011 16:26

Цитата:

Сообщение от iNils (Сообщение 979720)
В массы ее!

это был не гарбажколлектор это:
http://riapriority.com/blogs/slon-vs...15/profiling-2
UPD вру. я имел в виду что-то другое. найти не могу.

goodguy 12.03.2011 17:09

Котяра, что в этой статье авторитетного? И тем более, где там убедительные аргументы против их использования?
Есть такая строчка:
Цитата:

Повсеместное применение Weak Reference снижает качество кода.
Которая выглядит, по меньшей мере глупо. Чем это снижает качество кода? Тем что кому-то не нравится дополнительная запись false, 0, true в объявлении слушателя?

fish_r 13.03.2011 04:16

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

Не использовал, и не использую, но не зарекаюсь... Может встретится такая ситуация когда это будет оправдано.

П.С. Не для холивара написал, просто такое у меня сложилось мнение. Не горячитесь.

Добавлено через 1 час 21 минуту
CrazyFlasher. Хотел спросить... Вот такой способ диспатча, это вообще насколько, как бы это сказать... валидный, что ли способ? Или это для применения в своих "домашних" проектах? Под Гаагский трибунал, потом, не отдадут коллеги-программисты? :)

CrazyFlasher 13.03.2011 13:25

ну лучше сделать свой Event который будет расширять базовый. Сделать константы типов свобытий, чтоб всё красиво выглядело

fish_r 13.03.2011 16:20

А, ну понятно. Спасибо!


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

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