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

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

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

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
В блоге у wxvxw посмотрите. Примерно те же события, но без объекта события. Ну и бегают быстрее.
Спасибо, посмотрю.. В остальном, предлагаю спор заканчивать. Явно каждый останется при своем мнении.
На любой аргумент, можно придумать контраргумент, и т.д. и т.п. А в результате, скорее всего, каждый останется при своем...
Любой вариант имеет право на жизнь... На примере меня, писать я могу по своему или так как того требуют правила... Мне в общем, все равно. Сейчас я нахожусь в положении, когда сам решаю как писать и диктую как это делать другим... Если окажусь в обратном, значит буду писать, как от меня будут требовать...
Как говорится... "В этом мире, мой друг, люди делятся на два вида: те, у кого ружье, и те, кто копает."(с)
Не подумайте, это не в ваш адрес, а просто...
__________________
Искренне Ваш, Джек.

Старый 25.01.2011, 15:07
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 62  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Неряшливо оформленный - негде написать ASDoc комментарий к методу, следовательно слесующий программист, который будет его читать, будет долго искать откуда ж это вызывается, код тяжело однозначо понять, переменная объявлена формально не там, где она фактически объявлена, из кода не понятно зачем нужны такие манипуляции с _onClose, а что не нужно - то лишнее.
C# - другой стандарт, примерно на столько же родственный AS3, как птицы и динозавры. В AS3 констуркция if (object) всегда приводится к булиану, так что писать == null - избыточно. Это не так в C#, поэтому в C# правильно по-другому.
Кроме того, в AS3 анонимные функции просто плохо реализованы. JIT компилятор их по сути eval()ом исполняет, как и конструкторы. Вы не сделали луче, да, стало не на много хуже, но зачем делать пусть только немного хуже, если в этом нет никакой необходимости? - другим на зло? - ну так а если у других монтировка?
__________________
Hell is the possibility of sanity

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

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
По поводу анонимных функций, я писал, тут они не нужны... просто обращал внимание, на то, что в данном варианте плохого? В общем убедили, в данном случае анонимная функция не нужна...
Хотя, мне допустим все равно коробит от такого кода:
Код AS3:
public function MsgBox()
{
	_closeButton.addEventListener(MouseEvent.CLICK, onBtnClick);
}
 
private function onBtnClick(e:MouseEvent):void 
{
	close();
}
 
public function close():void 
{
	//
}
а от такого еще больше:

Код AS3:
public function MsgBox()
{
	_closeButton.addEventListener(MouseEvent.CLICK, close);
}
 
public function close(e:MouseEvent=null):void 
{
//
}
“Кроме того, в AS3 анонимные функции просто плохо реализованы.”
Принято.

На счет переменной, не совсем понял...

На счет не очевидности функционала close... Ну допустим, хотя мне кажется все вполне очевидным. Будем считать – принято.

На зло я ничего не делал. Я хотел получить ответ, чем данная запись плоха. Не важно, хуже она или лучше... Это языковая возможность...
В общем вы меня убедили – анонимные функции зло, по крайней мере те, что реализованы в AS3.

Добавлено через 3 минуты
Если честно, у меня отчасти сложилось впечатление, большинство тут спорят из принципа и привычки все делать через события. Ну типа как "Есть такой, Копперфильд, и мне пофиг"(с)
Шаг в сторону- считается побег. Расстрел на месте...
__________________
Искренне Ваш, Джек.


Последний раз редактировалось JackFromChaos; 25.01.2011 в 15:53.
Старый 25.01.2011, 16:18
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 64  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Привычка хорошее дело. Мнение большинства тоже (я имею в виду только данный контекст). Приятно смотреть на код который написан "как у всех".
Чем ваш код плох?
- а если придёт 5 алертов (например сообщений об ошибках) нужно помещать все показы в конвеер - не проще ли подписаться на событие закрыто и показывать следующее?
- а если надо расширить (добавить кнопки да/нет/кэнсел)?
- и просто мне не нравится, когда свойствам/методам придаётся неадекватный их имени функционал - это я про visible
- ну и MessageBox и onButtonClick гораздо приятнее чем их сокращения на целых 3 буквы
__________________
Отряд Котовскага


Последний раз редактировалось Котяра; 25.01.2011 в 16:20.
Старый 25.01.2011, 16:47
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 65  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

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

Старый 25.01.2011, 16:58
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 66  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Цитата:
а от такого еще больше:

Код AS3:

public function MsgBox()
{
_closeButton.addEventListener(MouseEvent.CLICK, close);
}

public function close(e:MouseEvent=null):void
{
//
}
тут-то чего не понравилось?
что один и тот же метод отрабатывает закрытие алерта и по событию и при вызове извне?

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

Старый 25.01.2011, 17:21
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 67  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

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


Последний раз редактировалось wvxvw; 25.01.2011 в 17:55.
Старый 25.01.2011, 17:56
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 68  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
2wvcvw:
Не знаю, нужно ли это...
Могу сказать, что анонимная функция компилируется приблизительно так же, как обычная. Но она как бы является объектом, который в момент создания получает, кроме всего прочего, контекст исполнения.
Грубо говоря, массив всех локальных переменных функции в которой была вызвана.
Это приблизительно... на глазок. Разбираться детальнее влом.
Но факт, занимает в памяти она больше. По идее, работает слегка медленее, за счет того, что переменные из контекста выуживает по имени...

Это результат 10 минут изучения opcode полученных путем: https://github.com/CyberShadow/RABCDAsm

Добавлено через 8 минут
Короче так... При создании анонимной функции создается класс, скорее всего наследник Function, среди членов которого есть что-то типа Dictionary всех локальных переменных функции, в которой она была создана. Далее она исполняется как и обычная Function, но в случае наличия в коде переменных из родительских функций, она читает свой Dictionary с этими переменными...
Соответственно размер анонимной функции больше обычной приблизительно на объем локальных переменных родительской функции.

Добавлено через 49 минут
Подозревая, что вся разница с c# заключается в том, что в c# переменные родительской функции храняться не в Dictionary, и копируются не все,а только те, что используются непосредственно в анонимной функции. Т.е. в конечном этого затрат вообще никаких практически.

Но в AS3 затраты тоже не мега большие получаются, если разобраться...

В конечном этого стоит понимать, что addEventListener тоже принимает указатель на функцию - суть тот же callback.
Т.е. разницы между:
Код AS3:
_closeButton.addEventListener(MouseEvent.CLICK, onHide);
и
Код AS3:
_closeButton.addEventListener(MouseEvent.CLICK, function(e:Event):void{visible=false;});
если в функции из которой происходила подписка не будет переменных, будет не особо большая...

Это не к тому, что бы продолжить спор А просто делюсь наблюдениями...

Добавлено через 2 часа 20 минут
Судя по всему, класс "анонимная функци", сам по себе весит довольно много(710 байт). Работает где то на 7% медленее обычной функции
В 3 раза быстрее, чем класс отсюда http://www.flasher.ru/forum/blog.php?b=305 (по большей части это связано со скоростью работы фунцкии Function.apply)
addEventListner работает где то в 4 раза быстрее, чем создание анонимной функции.
Все это меркнет в сравнении скорости работы функции dispatchEvent. Она работает в 26 раз медленее чем вызова анонимной функции. И более чем в 9 раз медленнее чем метод execute в классе Callback.

Добавлено через 2 часа 53 минуты
Пора переходить на сигналы
__________________
Искренне Ваш, Джек.


Последний раз редактировалось JackFromChaos; 25.01.2011 в 18:13.
Старый 25.01.2011, 20:56
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 69  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
опкоды тут ни при чем. Рассмотрим такую ситуацию:
getscope 0

в функции с единажды определенной цепочкой областей видимости:
JIT компилятор сможет вместо колбека в VM записать обращение к участку памяти (потому что оно константа, и компилятор может ее вычислить).

в анонимной функции:
JIT "не знает" что вернется в любом случае, а только в конкретном вызове, т.е. ему для каждого конкретного вызова нужно будет перекомпилировать, либо просто оставить это как колбек куда-то в уже скомпилированый код VM.

Мое предположение заключается в том, что JIT достаточно умный для того, чтобы сделать первую оптимизацию.

Я не знаю как хранятся локальные переменные в C#, но разница должна быть вполне серьезной потому что в AS3 они не хранятся вообще (а шарповый рефлектор как-то может даже имена иногда восстановить). В AS3 они превращаются в последовательность процедур и записей в регистры. Как таковых переменных не существует. Т.е. мы "запоминаем", что переменную #1 мы положили в регистр #1, когда надо будет ее использовать, мы прочитаем значение в регистре #1.
__________________
Hell is the possibility of sanity

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

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
При вызове функция не компилируется, это точно. Возможно компилируется при в момент "создания"(тут сложно сказать, что бы знать наверняка нужна документация на байткод). Там происходит волшебное newfunction... Что за ним скрывается, я не знаю... Но это, по идее, условная компиляция... Исходников в конечной swf нет. Есть такой же байткод, который мало чем отличается от обычного метода. Разница в наличии таких операций:
getlex QName(PackageInternalNs(""), "parentVariableName")
где parentVariableName - имя переменной в родительской функции.
Конечный результат этого волшебства практически ничем не отличается от обычной функции.
Естественно, создание анонимных функций внутри цикла для какой нибудь разновидности замыкания - смерти подобно...

В c# на сколько я знаю, имен локальных переменных нет, но есть имена аргументов функций... Поэтому рефлекторный код иногда кажется вполне вменяемым Я даже пользовался математикой успешно отрефлекченой из XNA
__________________
Искренне Ваш, Джек.

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

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

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


 


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


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