Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Когда Callback лучше чем Event (http://www.flasher.ru/forum/showthread.php?t=149298)

JackFromChaos 22.01.2011 14:33

Когда Callback лучше чем Event
 
Рискую начать очередной холивар, но все таки напишу...
Почитал старую темку про Callback vs Event, и задумался(вчера тоже эта темя затрагивалась). А действительно, в каких ситуациях callback лучше чем событие, по крайней мере для меня?
Думал, думал, почему в одних случаях я делаю то или другое, и понял...

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

Пример:

Код AS3:

connection.login(usr,pwd,complete:Function);

Соответственно код, который вызывает этот callback:

Код AS3:

if(_complete)
        _complete(result);
_complete=null;


В такой ситуации event был бы куда менее удобен.

Аналогичным примером являются всевозможные твинеры.

А как считаете вы?

wvxvw 22.01.2011 15:00

Был такой дядька, очень любил бриться, Оккамом звали. Так вот, следуя из того, что он говорил, если событие не нужно, то оно не нужно :)

JackFromChaos 22.01.2011 15:35

Цитата:

Сообщение от wvxvw (Сообщение 966814)
Был такой дядька, очень любил бриться, Оккамом звали. Так вот, следуя из того, что он говорил, если событие не нужно, то оно не нужно :)

Тоже верно, согласен:D

f.g.programmer 22.01.2011 21:07

Вместо
Код AS3:

if(_complete)
        _complete(result);
_complete=null;

лучше использовать
Код AS3:

var fun:Function = _complete;
_complete = null;
if(fun !== null){
  fun(result);
}

В общем случае это чтобы не боятся, что код внутри _complete(result) может изменить значение переменной _complete

Psycho Tiger 22.01.2011 22:07

Гипотетически предположим, что это самое поле _complete как то доступно скоупу передаваемого метода, что в реальной жизни из разряда фантастики.
Изменили, ага. И что?

f.g.programmer 23.01.2011 00:28

Гипотетически это может быть не разовое действие, а перезапускаемое, и передаваемый метод как раз может при некоторых условиях перезапускать эту активность. А мы _complete занулим, и наша активность уперётся в путое место при окончании.
Знаю, что это всё "если бы да ка бы", но это не из разряда фантастики и в реальной жизни я такое встречал.

Добавлено через 9 минут
Даже в данном примере, это может быть попытка залогиниться повторно.

Psycho Tiger 23.01.2011 00:44

Изменили. Теперь _complete = null. И что, присваивая fun = _complete = null в нём чудом появится ссылка на начальный метод _complete?
Цитата:

А мы _complete занулим, и наша активность уперётся в путое место при окончании.
Знаю, что это всё "если бы да ка бы", но это не из разряда фантастики и в реальной жизни я такое встречал.
_complete - приватный или протектед член класса. То есть на коллбек нужно передать метод того же класса.

Внимание, вопрос: на кой передавать метод того же класса в коллбек, если можно его сразу же дёрнуть?

f.g.programmer 23.01.2011 01:06

Не понял Вашу мысль, или скорее не смог понятно выразить свою.
Попробую ещё раз
Код AS3:

private var _login_pairs:Array = [{"usr":"user1", "pwd":"12"}, {"usr":"user1", "pwd":"13"}]; 
private function tryLogin():void {
        if (_login_pairs.length > 0) {
                var pair:Object = _login_pairs.shift();
                _connection.login(pair.usr, pair.pwd, onLogin);
        }
}
private function onLogin(result:Object):void {
        if (result.success) {
                continueProgram();
        }
        else {
                tryLogin();
        }
}

_complete - приватное поле _connection, хранит ссылку на onLogin
если мы выполним _complete, который запустит повторную попытку логина, а потом обнулим _complete, то повторная попытка ничем не закончится.

GBee 23.01.2011 01:11

Меня тоже интересует основной вопрос топикстартера, сам событиями пользоваться не очень люблю. Хотелось бы услышать мнение как профи, так и "профи".

Psycho Tiger 23.01.2011 01:33

Цитата:

если мы выполним _complete, который запустит повторную попытку логина, а потом обнулим _complete, то повторная попытка ничем не закончится.
А ещё можно tryLogin не вызвать и роптать на баги флешплеера.
Где реально можно ошибиться, занулив коллбек случайно?


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

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