PDA

Просмотр полной версии : В AS 3.0 нехватает типов событий.


fish_r
11.03.2011, 12:02
... Мне так кажется. Основным 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
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 минуты

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
Можно и свое событие создать, в чем проблема то? Не понимаю как их может не хватать.

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

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

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

CrazyFlasher
11.03.2011, 13:47
commonDsiplayObject.addEventListener("move", onMove);

fish_r
11.03.2011, 13:59
...

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

CrazyFlasher
11.03.2011, 14:00
2goodguy: WeakReference - зло

fish_r
11.03.2011, 14:05
...Зачем подписываться на событие в коде, который это событие и посылает? ...

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

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

fish_r
11.03.2011, 15:13
...

А часто ли 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
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
всё что создал, надо за собой и убрать...это должно войти в привычку...а то получается сыр-бор в коде...для отладки есть profiler.
я просто не вижу в weak reference смысла

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

Bgg
11.03.2011, 19:18
Вдруг где-то забудешь удалить слушатель.

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

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

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

}


с 10-ки

new Loader().unloadAndStop(true);

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

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

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

CrazyFlasher
11.03.2011, 19:53
ну 1-ый способ не задокументированный...это скорее хак. И никто вам не гарантирует, что он будет работать в новых версиях плеера.
2-ой способ создан для того, чтобы вызывать GC после unloadAndStop. Соответственно
new Loader().unloadAndStop(true); опять таки хак.
Т.к. нет нормального способа, а System.gc() работает только в debug плеере, значит есть на то причины

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

iNils
11.03.2011, 20:17
Где-то на гарбажколлекторе есть убедительная статья - почему не надо юзать викреференсы.В массы ее!

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

Diestro
12.03.2011, 09:04
Действительно, не срабатывает. Интересно - это баг или фича? :)
Больше похоже на баг.

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
... И никакого мнения против этого он не высказывал...

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

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

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

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

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

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

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

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

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

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

Котяра
12.03.2011, 16:26
В массы ее!
это был не гарбажколлектор это:
http://riapriority.com/blogs/slon-vsapogah.php/2008/12/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
А, ну понятно. Спасибо!