|
|
|||||
Цитата:
На любой аргумент, можно придумать контраргумент, и т.д. и т.п. А в результате, скорее всего, каждый останется при своем... Любой вариант имеет право на жизнь... На примере меня, писать я могу по своему или так как того требуют правила... Мне в общем, все равно. Сейчас я нахожусь в положении, когда сам решаю как писать и диктую как это делать другим... Если окажусь в обратном, значит буду писать, как от меня будут требовать... Как говорится... "В этом мире, мой друг, люди делятся на два вида: те, у кого ружье, и те, кто копает."(с) Не подумайте, это не в ваш адрес, а просто...
__________________
Искренне Ваш, Джек. |
|
|||||
Modus ponens
|
Неряшливо оформленный - негде написать ASDoc комментарий к методу, следовательно слесующий программист, который будет его читать, будет долго искать откуда ж это вызывается, код тяжело однозначо понять, переменная объявлена формально не там, где она фактически объявлена, из кода не понятно зачем нужны такие манипуляции с _onClose, а что не нужно - то лишнее.
C# - другой стандарт, примерно на столько же родственный AS3, как птицы и динозавры. В AS3 констуркция if (object) всегда приводится к булиану, так что писать == null - избыточно. Это не так в C#, поэтому в C# правильно по-другому. Кроме того, в AS3 анонимные функции просто плохо реализованы. JIT компилятор их по сути eval()ом исполняет, как и конструкторы. Вы не сделали луче, да, стало не на много хуже, но зачем делать пусть только немного хуже, если в этом нет никакой необходимости? - другим на зло? - ну так а если у других монтировка?
__________________
Hell is the possibility of sanity |
|
|||||
По поводу анонимных функций, я писал, тут они не нужны... просто обращал внимание, на то, что в данном варианте плохого? В общем убедили, в данном случае анонимная функция не нужна...
Хотя, мне допустим все равно коробит от такого кода: public function MsgBox() { _closeButton.addEventListener(MouseEvent.CLICK, onBtnClick); } private function onBtnClick(e:MouseEvent):void { close(); } public function close():void { // } public function MsgBox() { _closeButton.addEventListener(MouseEvent.CLICK, close); } public function close(e:MouseEvent=null):void { // } Принято. На счет переменной, не совсем понял... На счет не очевидности функционала close... Ну допустим, хотя мне кажется все вполне очевидным. Будем считать – принято. На зло я ничего не делал. Я хотел получить ответ, чем данная запись плоха. Не важно, хуже она или лучше... Это языковая возможность... В общем вы меня убедили – анонимные функции зло, по крайней мере те, что реализованы в AS3. Добавлено через 3 минуты Если честно, у меня отчасти сложилось впечатление, большинство тут спорят из принципа и привычки все делать через события. Ну типа как "Есть такой, Копперфильд, и мне пофиг"(с) Шаг в сторону- считается побег. Расстрел на месте...
__________________
Искренне Ваш, Джек. Последний раз редактировалось JackFromChaos; 25.01.2011 в 15:53. |
|
|||||
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
Привычка хорошее дело. Мнение большинства тоже (я имею в виду только данный контекст). Приятно смотреть на код который написан "как у всех".
Чем ваш код плох? - а если придёт 5 алертов (например сообщений об ошибках) нужно помещать все показы в конвеер - не проще ли подписаться на событие закрыто и показывать следующее? - а если надо расширить (добавить кнопки да/нет/кэнсел)? - и просто мне не нравится, когда свойствам/методам придаётся неадекватный их имени функционал - это я про visible - ну и MessageBox и onButtonClick гораздо приятнее чем их сокращения на целых 3 буквы
__________________
Отряд Котовскага Последний раз редактировалось Котяра; 25.01.2011 в 16:20. |
|
|||||
Цитата:
Все, я умолкаю. Вы все правы, я не прав...
__________________
Искренне Ваш, Джек. |
|
|||||
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Цитата:
что один и тот же метод отрабатывает закрытие алерта и по событию и при вызове извне? можно разделить на два, естественно. по большому счету, у меня в проектах алерты всегда модальные, и у меня там стоит private, но поскольку применительно к своему коды Вы написали, что можно мессаджбоксы и снаружи закрывать - я поставил там паблик. |
|
|||||
Modus ponens
|
ОК, по поводу "не JIT'ятся". Вобщем, тут был недавно спор, так вот что имелось в виду: если никакие функциональные части функции не должны менятся в процессе работы программы, то ее (возможно) можно соптимизировать и закешировать соптимизированую версию - мне доподлино не извесно как рабоает JIT компилятор, но резонно предположить, что какая-то оптимизация такого рода делаестся. Возможно я заблуждаюсь, и никакой оптимизации на этом уровне не происходит (маловероятно). Мое утверждение было следующим: предполагая, что, раз для анонимных функций нужно сделать дополнительные операции для нахождения this, перевести их в машинные инструкции должно быть сложнее (менее оптимально). Мне достоверно не извесно, что не-анонимные функции не переводятся в машинные коды так же неоптимально, но больше шансов за то, что это не так.
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 25.01.2011 в 17:55. |
|
|||||
2wvcvw:
Не знаю, нужно ли это... Могу сказать, что анонимная функция компилируется приблизительно так же, как обычная. Но она как бы является объектом, который в момент создания получает, кроме всего прочего, контекст исполнения. Грубо говоря, массив всех локальных переменных функции в которой была вызвана. Это приблизительно... на глазок. Разбираться детальнее влом. Но факт, занимает в памяти она больше. По идее, работает слегка медленее, за счет того, что переменные из контекста выуживает по имени... Это результат 10 минут изучения opcode полученных путем: https://github.com/CyberShadow/RABCDAsm Добавлено через 8 минут Короче так... При создании анонимной функции создается класс, скорее всего наследник Function, среди членов которого есть что-то типа Dictionary всех локальных переменных функции, в которой она была создана. Далее она исполняется как и обычная Function, но в случае наличия в коде переменных из родительских функций, она читает свой Dictionary с этими переменными... Соответственно размер анонимной функции больше обычной приблизительно на объем локальных переменных родительской функции. Добавлено через 49 минут Подозревая, что вся разница с c# заключается в том, что в c# переменные родительской функции храняться не в Dictionary, и копируются не все,а только те, что используются непосредственно в анонимной функции. Т.е. в конечном этого затрат вообще никаких практически. Но в AS3 затраты тоже не мега большие получаются, если разобраться... В конечном этого стоит понимать, что addEventListener тоже принимает указатель на функцию - суть тот же callback. Т.е. разницы между: и если в функции из которой происходила подписка не будет переменных, будет не особо большая... Это не к тому, что бы продолжить спор А просто делюсь наблюдениями... Добавлено через 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. |
|
|||||
Modus ponens
|
опкоды тут ни при чем. Рассмотрим такую ситуацию:
getscope 0 в функции с единажды определенной цепочкой областей видимости: JIT компилятор сможет вместо колбека в VM записать обращение к участку памяти (потому что оно константа, и компилятор может ее вычислить). в анонимной функции: JIT "не знает" что вернется в любом случае, а только в конкретном вызове, т.е. ему для каждого конкретного вызова нужно будет перекомпилировать, либо просто оставить это как колбек куда-то в уже скомпилированый код VM. Мое предположение заключается в том, что JIT достаточно умный для того, чтобы сделать первую оптимизацию. Я не знаю как хранятся локальные переменные в C#, но разница должна быть вполне серьезной потому что в AS3 они не хранятся вообще (а шарповый рефлектор как-то может даже имена иногда восстановить). В AS3 они превращаются в последовательность процедур и записей в регистры. Как таковых переменных не существует. Т.е. мы "запоминаем", что переменную #1 мы положили в регистр #1, когда надо будет ее использовать, мы прочитаем значение в регистре #1.
__________________
Hell is the possibility of sanity |
|
|||||
При вызове функция не компилируется, это точно. Возможно компилируется при в момент "создания"(тут сложно сказать, что бы знать наверняка нужна документация на байткод). Там происходит волшебное newfunction... Что за ним скрывается, я не знаю... Но это, по идее, условная компиляция... Исходников в конечной swf нет. Есть такой же байткод, который мало чем отличается от обычного метода. Разница в наличии таких операций:
getlex QName(PackageInternalNs(""), "parentVariableName") где parentVariableName - имя переменной в родительской функции. Конечный результат этого волшебства практически ничем не отличается от обычной функции. Естественно, создание анонимных функций внутри цикла для какой нибудь разновидности замыкания - смерти подобно... В c# на сколько я знаю, имен локальных переменных нет, но есть имена аргументов функций... Поэтому рефлекторный код иногда кажется вполне вменяемым Я даже пользовался математикой успешно отрефлекченой из XNA
__________________
Искренне Ваш, Джек. |
Часовой пояс GMT +4, время: 09:22. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|