Универсальная замена анонимных функций и не только...
Собственно, класс способный заменить замыкание, да и вообще может быть весьма полезным... С моей точки зрения, естественно...
package utils { /** * ... * @author Denis `Jack` Vinogradsky */ public class Callback { private var _callback:Function; private var _params:Array; public function execute():void { if (_callback == null) return; _callback.apply(null, _params); } public function Callback(callback:Function,...rest) { _params = rest; _callback = callback; } } }
Всего комментариев 41
Комментарии
|
|
|
В default ошибка в конце: ..._params[14],_params[15],,_params[15]);
|
|
|
|
Кстати, вместо кучи case-ов можно использовать:
http://www.ericfeminella.com/blog/20...een-functions/ |
|
|
|
Спасибо за подсказку.
Упростил, убрал функцию release(проверил, убедился, что если на нее никто не ссылается, она прекрасно собирается...) |
|
|
|
На мой взгляд лучше переименовать Callback -> Delegate. Ближе по смыслу.
|
|
|
|
Нубский вопрос: а замыкание по-твоему принципиально не должно ничего возвращать?
|
|
|
|
Хочется пример использования, на котором было бы видны его удобства.
|
|
|
|
это обёртка вокруг apply?
|
|
|
|
он не позволяет избавится от анонимных функций. он переносит их на другой уровень.
|
|
|
|
JackFromChaos, да не у меня вопрос. А в статью это добавить, т.к. не очевидно.
А вообще упёртость автора заслуживает уважения. Давайте посмотрим, кто знает, может он наш мессия. |
|
|
|
@JackFromChaos, я не разжигаю. я говорю, что ваш класс не убирает и не упрощает их использования вообще никаким боком.
@Psycho Tiger, угу. вон в разделе АС3 мессиит по полной =) |
|
|
|
Не нужно отучать людей использовать замыкание. Это нормальный механизм программирования. Вопрос может стоять, как его лучше реализовывать, но не как от него избавиться...
|
|
|
|
Нужно, нормального в нем ничего нет.
|
|
|
Обновил(-а) iNils 26.01.2011 в 03:50
|
|
|
|
Что хорошего в паттерне command?
по поводу того, что плохого в замыкании... нашел вот только про анонимные функции от Блуда... Я так понимаю, тут это и имеется ввиду. Итак, по пунктам: анонимные функции: 1. создаются каждый раз при попадании в функцию родитель. Не когда заходят в функцию, а когда доходят до места, где она декларируется. То что EventDispatcher не подписывают 2 раза подрят одну и ту же функцию, не значит, что вызывать многократно функцию init которая на что-то подписывается – красивый код... То, что Adobe сделала защиту от дурака, не значит что надо себя вести как... Опять же, класс который я привел вполне управляем, все можно создавать тогда и столько раз, сколько надо... Хотя с анонимами тоже можно это вполне проделать, если голову включить. 2. имеют кривую типизацию. Не более кривую, чем эвенты. Да, адоба придумала для нас стандартную сигнатуру для эвента. Никто не мешает ввести у себя дополнительный стандарт на какие то свои колбэки. Мехнизмы теже... Типизация та же... 3. жрут больше памяти. Приведенный класс эту проблему решает. Кстати, анонимы кроме того что жрут больше, работают в 25 быстрее чем эвент. 4. у них плавающий объект активации. Приведенный класс решает эту проблему. Вообще подозреваю, что данной проблеме есть разумное объяснение, но не суть... Не хочу сейчас выяснять этот вопрос. 5. от них проблемно отписываться. Проблемно, но можно. Опять же, данный класс решает эту проблему... 6. их нельзя сравнивать друг с другом. Ни разу в жизни не сравнивал указатели на функции. Попахивает какой то магией... и т.д. и т.п. Пока, как бы не нашел адекватных причин, что плохо... Замыкание держат ссылку и не дают нормально работать коллектору? Есть множество способов держать ссылку не давая объекту удалиться. Вопрос здесь не механизма замыкания, а кривизны рук программиста. |
|
|
Обновил(-а) JackFromChaos 26.01.2011 в 04:36
|
|
|
|
Если под "замыканием" понимается исключительно "анонимная функция", то извините, был не прав... Анонимными функциями лучше в AS3 не пользоваться, безусловно. Т.е. они не так страшны как из расписывают, но множество подводных камней, на которые по не знанию можно напороться... Тут не спорю.
Но причем тут изменения мышления? Если под замыканием понимать более общее понятие: "Замыкание (англ. closure) в программировании — процедура, которая ссылается на свободные переменные в своём лексическом контексте. Замыкание, так же как и экземпляр объекта, есть способ представления функциональности и данных, связанных и упакованных вместе." То в этом плохого ничего нет. И класс вверху вполне решает многие из задач, которые может захотеться решить анонимными функциями. По сути являющиеся механизмом «замыкание», по словам того же Блуда... |
|
|
Обновил(-а) JackFromChaos 26.01.2011 в 05:10
|
|
|
|
Как я и ожидал, аргументы размыты и сводятся к тому, что можно подумать, решить и избежать, вот только смысла это делать, я так и не увидел.
Единственная конкретика была в пункте 3, но... быстрее в каком плане, и откуда данные про 25 раз? PS. Я с детства не люблю теорию оторванную от практики. Любой практик заткнет за пояс теоретика, который замыкается на теории без примеров практического применения. |
|
|
Обновил(-а) iNils 26.01.2011 в 05:23
|
|
|
|
ChuwY, да всё что угодно можно. например, можно корову доить прищепками.
|
|
|
|
BlooDHounD, я в споры не ввязывался, ни с кем (просто хочу лучше узнать тему на конкретном примере) и прошу ответить мне с чуть меньшей долей сарказма, если тебя не затруднит
![]() |
|
|
|
Ну вот и разобрались. За сим считаю спор законченным.
|
|
|
|
Обновил(-а) JackFromChaos 26.01.2011 в 15:24
|
|
|
|
Код, состоящий в своей массе из callback очень сложен в понимании и отладке. Очень неприятно обслуживать подобные проекты.
|
Последние записи от JackFromChaos
- Универсальная замена анонимных функций и не только... (25.01.2011)
- Класс для управления анимацией сделанной во FLASH. (11.01.2011)












