Универсальная замена анонимных функций и не только...
Собственно, класс способный заменить замыкание, да и вообще может быть весьма полезным... С моей точки зрения, естественно...
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
Комментарии
25.01.2011 04:30 | |
В default ошибка в конце: ..._params[14],_params[15],,_params[15]);
|
25.01.2011 05:11 | |
Кстати, вместо кучи case-ов можно использовать:
http://www.ericfeminella.com/blog/20...een-functions/ |
25.01.2011 05:34 | |
Спасибо за подсказку.
Упростил, убрал функцию release(проверил, убедился, что если на нее никто не ссылается, она прекрасно собирается...) |
25.01.2011 08:19 | |
На мой взгляд лучше переименовать Callback -> Delegate. Ближе по смыслу.
|
25.01.2011 11:05 | |
Нубский вопрос: а замыкание по-твоему принципиально не должно ничего возвращать?
|
25.01.2011 12:09 | |
Хочется пример использования, на котором было бы видны его удобства.
|
25.01.2011 12:45 | |
это обёртка вокруг apply?
|
25.01.2011 14:00 | |
он не позволяет избавится от анонимных функций. он переносит их на другой уровень.
|
25.01.2011 14:28 | |
JackFromChaos, да не у меня вопрос. А в статью это добавить, т.к. не очевидно.
А вообще упёртость автора заслуживает уважения. Давайте посмотрим, кто знает, может он наш мессия. |
25.01.2011 14:32 | |
@JackFromChaos, я не разжигаю. я говорю, что ваш класс не убирает и не упрощает их использования вообще никаким боком.
@Psycho Tiger, угу. вон в разделе АС3 мессиит по полной =) |
26.01.2011 03:36 | |
Не нужно отучать людей использовать замыкание. Это нормальный механизм программирования. Вопрос может стоять, как его лучше реализовывать, но не как от него избавиться...
|
26.01.2011 03:48 | |
Нужно, нормального в нем ничего нет.
|
|
Обновил(-а) iNils 26.01.2011 в 03:50
|
26.01.2011 04:34 | |
Что хорошего в паттерне command?
по поводу того, что плохого в замыкании... нашел вот только про анонимные функции от Блуда... Я так понимаю, тут это и имеется ввиду. Итак, по пунктам: анонимные функции: 1. создаются каждый раз при попадании в функцию родитель. Не когда заходят в функцию, а когда доходят до места, где она декларируется. То что EventDispatcher не подписывают 2 раза подрят одну и ту же функцию, не значит, что вызывать многократно функцию init которая на что-то подписывается – красивый код... То, что Adobe сделала защиту от дурака, не значит что надо себя вести как... Опять же, класс который я привел вполне управляем, все можно создавать тогда и столько раз, сколько надо... Хотя с анонимами тоже можно это вполне проделать, если голову включить. 2. имеют кривую типизацию. Не более кривую, чем эвенты. Да, адоба придумала для нас стандартную сигнатуру для эвента. Никто не мешает ввести у себя дополнительный стандарт на какие то свои колбэки. Мехнизмы теже... Типизация та же... 3. жрут больше памяти. Приведенный класс эту проблему решает. Кстати, анонимы кроме того что жрут больше, работают в 25 быстрее чем эвент. 4. у них плавающий объект активации. Приведенный класс решает эту проблему. Вообще подозреваю, что данной проблеме есть разумное объяснение, но не суть... Не хочу сейчас выяснять этот вопрос. 5. от них проблемно отписываться. Проблемно, но можно. Опять же, данный класс решает эту проблему... 6. их нельзя сравнивать друг с другом. Ни разу в жизни не сравнивал указатели на функции. Попахивает какой то магией... и т.д. и т.п. Пока, как бы не нашел адекватных причин, что плохо... Замыкание держат ссылку и не дают нормально работать коллектору? Есть множество способов держать ссылку не давая объекту удалиться. Вопрос здесь не механизма замыкания, а кривизны рук программиста. |
|
Обновил(-а) JackFromChaos 26.01.2011 в 04:36
|
26.01.2011 05:08 | |
Если под "замыканием" понимается исключительно "анонимная функция", то извините, был не прав... Анонимными функциями лучше в AS3 не пользоваться, безусловно. Т.е. они не так страшны как из расписывают, но множество подводных камней, на которые по не знанию можно напороться... Тут не спорю.
Но причем тут изменения мышления? Если под замыканием понимать более общее понятие: "Замыкание (англ. closure) в программировании — процедура, которая ссылается на свободные переменные в своём лексическом контексте. Замыкание, так же как и экземпляр объекта, есть способ представления функциональности и данных, связанных и упакованных вместе." То в этом плохого ничего нет. И класс вверху вполне решает многие из задач, которые может захотеться решить анонимными функциями. По сути являющиеся механизмом «замыкание», по словам того же Блуда... |
|
Обновил(-а) JackFromChaos 26.01.2011 в 05:10
|
26.01.2011 05:19 | |
Как я и ожидал, аргументы размыты и сводятся к тому, что можно подумать, решить и избежать, вот только смысла это делать, я так и не увидел.
Единственная конкретика была в пункте 3, но... быстрее в каком плане, и откуда данные про 25 раз? PS. Я с детства не люблю теорию оторванную от практики. Любой практик заткнет за пояс теоретика, который замыкается на теории без примеров практического применения. |
|
Обновил(-а) iNils 26.01.2011 в 05:23
|
26.01.2011 14:16 | |
ChuwY, да всё что угодно можно. например, можно корову доить прищепками.
|
26.01.2011 14:18 | |
BlooDHounD, я в споры не ввязывался, ни с кем (просто хочу лучше узнать тему на конкретном примере) и прошу ответить мне с чуть меньшей долей сарказма, если тебя не затруднит
|
26.01.2011 14:46 | |
Ну вот и разобрались. За сим считаю спор законченным.
|
26.01.2011 15:18 | |
Обновил(-а) JackFromChaos 26.01.2011 в 15:24
|
27.01.2011 21:27 | |
Код, состоящий в своей массе из callback очень сложен в понимании и отладке. Очень неприятно обслуживать подобные проекты.
|
Последние записи от JackFromChaos
- Универсальная замена анонимных функций и не только... (25.01.2011)
- Класс для управления анимацией сделанной во FLASH. (11.01.2011)