Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.01.2011, 14:33
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 1  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
По умолчанию Когда Callback лучше чем Event

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

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

Пример:

Код AS3:
connection.login(usr,pwd,complete:Function);
Соответственно код, который вызывает этот callback:

Код AS3:
if(_complete)
	_complete(result);
_complete=null;

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

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

А как считаете вы?
__________________
Искренне Ваш, Джек.


Последний раз редактировалось JackFromChaos; 22.01.2011 в 14:35.
Старый 22.01.2011, 15:00
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 2  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Был такой дядька, очень любил бриться, Оккамом звали. Так вот, следуя из того, что он говорил, если событие не нужно, то оно не нужно
__________________
Hell is the possibility of sanity

Старый 22.01.2011, 15:35
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 3  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
Цитата:
Сообщение от wvxvw Посмотреть сообщение
Был такой дядька, очень любил бриться, Оккамом звали. Так вот, следуя из того, что он говорил, если событие не нужно, то оно не нужно
Тоже верно, согласен
__________________
Искренне Ваш, Джек.

Старый 22.01.2011, 21:07
f.g.programmer вне форума Посмотреть профиль Отправить личное сообщение для f.g.programmer Найти все сообщения от f.g.programmer
  № 4  
Ответить с цитированием
f.g.programmer
 
Аватар для f.g.programmer

блогер
Регистрация: Sep 2010
Адрес: Россия
Сообщений: 137
Записей в блоге: 3
Вместо
Код AS3:
if(_complete)
	_complete(result);
_complete=null;
лучше использовать
Код AS3:
var fun:Function = _complete;
_complete = null;
if(fun !== null){
   fun(result);
}
В общем случае это чтобы не боятся, что код внутри _complete(result) может изменить значение переменной _complete

Старый 22.01.2011, 22:07
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 5  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Новосибирск :D
Сообщений: 6,597
Записей в блоге: 17
Гипотетически предположим, что это самое поле _complete как то доступно скоупу передаваемого метода, что в реальной жизни из разряда фантастики.
Изменили, ага. И что?

Старый 23.01.2011, 00:28
f.g.programmer вне форума Посмотреть профиль Отправить личное сообщение для f.g.programmer Найти все сообщения от f.g.programmer
  № 6  
Ответить с цитированием
f.g.programmer
 
Аватар для f.g.programmer

блогер
Регистрация: Sep 2010
Адрес: Россия
Сообщений: 137
Записей в блоге: 3
Гипотетически это может быть не разовое действие, а перезапускаемое, и передаваемый метод как раз может при некоторых условиях перезапускать эту активность. А мы _complete занулим, и наша активность уперётся в путое место при окончании.
Знаю, что это всё "если бы да ка бы", но это не из разряда фантастики и в реальной жизни я такое встречал.

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

Старый 23.01.2011, 00:44
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 7  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Новосибирск :D
Сообщений: 6,597
Записей в блоге: 17
Изменили. Теперь _complete = null. И что, присваивая fun = _complete = null в нём чудом появится ссылка на начальный метод _complete?
Цитата:
А мы _complete занулим, и наша активность уперётся в путое место при окончании.
Знаю, что это всё "если бы да ка бы", но это не из разряда фантастики и в реальной жизни я такое встречал.
_complete - приватный или протектед член класса. То есть на коллбек нужно передать метод того же класса.

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

Старый 23.01.2011, 01:06
f.g.programmer вне форума Посмотреть профиль Отправить личное сообщение для f.g.programmer Найти все сообщения от f.g.programmer
  № 8  
Ответить с цитированием
f.g.programmer
 
Аватар для f.g.programmer

блогер
Регистрация: Sep 2010
Адрес: Россия
Сообщений: 137
Записей в блоге: 3
Не понял Вашу мысль, или скорее не смог понятно выразить свою.
Попробую ещё раз
Код 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, то повторная попытка ничем не закончится.

Старый 23.01.2011, 01:11
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 9  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Меня тоже интересует основной вопрос топикстартера, сам событиями пользоваться не очень люблю. Хотелось бы услышать мнение как профи, так и "профи".
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 23.01.2011, 01:33
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 10  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Новосибирск :D
Сообщений: 6,597
Записей в блоге: 17
Цитата:
если мы выполним _complete, который запустит повторную попытку логина, а потом обнулим _complete, то повторная попытка ничем не закончится.
А ещё можно tryLogin не вызвать и роптать на баги флешплеера.
Где реально можно ошибиться, занулив коллбек случайно?

Создать новую тему Ответ Часовой пояс GMT +4, время: 09:04.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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