Flash Ripper RSS Readers

Конвейер для ActionScript3 от Евгения Потапенко

Евгений Потапенко признался, что уже месяца два как выложил ActionScript3-версию своего класса Conveyor, ставшим для многих незаменимым помощником во флэш-программировании.

По ссылке - отличнейшая статья и исходники.

Писал Rost, 12 Июль 2007 23:16

Найдены баги:

А я своим пользуюсь ;)

nouba - 13 Июль 2007 9:20

очень понравилось:
"Далее. Garbage Collector ну просто зверь. Удаляет из памяти работающие анонимные конвейеры с большой охотой."
;)

The Helmsman - 13 Июль 2007 12:30

Конвейер для зарабатывания денег от Евгения Потапенко...

Иван - 13 Июль 2007 22:54

Забавно, как часто одни и те же мысли независимо приходят разным людям :)

Dan - 17 Июль 2007 11:06

Как-то не верится в перпективность этого подхода на больших командных проектах...

ManowaR - 17 Июль 2007 11:59

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

Особенно на больших командных проектах.

Dan - 18 Июль 2007 11:01

можно подробнее о компиляции? ;) звучит немного нелепо.

по поводу больших проектов... тоже не понял ;)

Евгений Потапенко - 18 Июль 2007 12:54

На AS 2.0 пишем:

class Foo {
function bar() {}
}
а компилятор это превращает в
Foo.prototype.bar = function() {}

Прозрачное использование прототипов.


Ничто не мешает сделать компилятор, который будет превращать
function roll() {
startRоulette();
var result = sendRollRequest();
stopRоulette(result.num);
animateWinNumber(result.num);
animatePayout(result.payout);
}
в конвеер.

Скорее всего, подребуется какое-то ключевое слово, чтобы сказать, что функция "блокирующая", то есть выполнится не сразу, а спустя какое-то время, в течение которого исполнение дальше не происходит.

Пока не прийдёт ответ от сервера, считается, что выполняется sendRollRequest и stopRоulette ждёт своей очереди.


Разве это не более читабельно и интуитивно понятно, чем масса событий и их обработчиков, да ещё и с делегированием методов?

Dan - 19 Июль 2007 13:16

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

Если есть интерес в придумывании своих языков и кодогенерации, посмотрите jetbrains MPS.. это пока бета и для джавы (генерится пока только в джаву). Очень увлекательно. Для AS не применимо, но сознание расширяет.

Евгений Потапенко - 19 Июль 2007 14:27

Вот ещё пример (сильно утрированный).

Пишем:

function foo() {
// что-то делаем до логина
this.sendLoginRequest(this.username, this.password);
// что-то делаем после логина
}

Компилятор делает из этого нечто вроде такого:

function foo() {
// делаем что-то до логина
var c = new BlockingCall(this, this.sendLoginRequest, [this.username, this.pass]);
c.onComplete = function() {
// делаем что-то посел логина
}
}

Т.е. разбивает функцию на две части, сам прописывает обработку события, сам оформляет функцию sendLoginRequest так, чтобы она делала не просто return, а вызывала onComplete и т.д.

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

Dan - 19 Июль 2007 15:15

Вот ещё пример (сильно утрированный).

Пишем:

function foo() {
// что-то делаем до логина
this.sendLoginRequest(this.username, this.password);
// что-то делаем после логина
}

Компилятор делает из этого нечто вроде такого:

function foo() {
// делаем что-то до логина
var c = new BlockingCall(this, this.sendLoginRequest, [this.username, this.pass]);
c.onComplete = function() {
// делаем что-то посел логина
}
}

Т.е. разбивает функцию на две части, сам прописывает обработку события, сам оформляет функцию sendLoginRequest так, чтобы она делала не просто return, а вызывала onComplete и т.д.

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

Dan - 19 Июль 2007 15:16

угу, выглядит как эмуляция потоков исполнения и их остановки в AS, идея старая, и я о ней писал в первой статье. Зашибись конечно, но честно говоря не понимаю зачем.
А что код получается чище - опять же могу поспорить, для меня код читабельный - в первую очередь отображающий реальное положение дел, а в вашем коде, то что поток остановится - не очевидно, что код будет выполнен после ответа сервера - тоже из кода не видно, по мне лучше уж использовать конвейер, тут есть логика исполнения, которая видна из кода, плюс AS3 в котором есть куча преимуществ, так как там делегирование встроенное.

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

Евгений Потапенко - 19 Июль 2007 15:30

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

Как раз таки прекрасно видна последовательность действий.
Что после чего следует.

> а в вашем коде, то что поток остановится - не
> очевидно, что код будет выполнен после ответа
> сервера - тоже из кода не видно

В других языках народ как-то не особо с этим парится. Напротив, неблокирующие вызовы, которые возвращаются сразу, а исполняются когда-то потом чаще становятся причинами ошибок.
А когда пишут
sleep(100)
прекрасно понимают, что на 100 милисекунд выполнение приостановится.
Или пишут:
if (socket.connect(...)) {
socket.send(...);
}
и прекрасно понимают, что отправка произойдёт только после соединения.
В AS для этого приходится писать несколько фукнций и присваивать из в обработчики событий.
В результате логика оказывается сильно размазана.

> для меня код читабельный - в первую очередь
> отображающий реальное положение дел

Чтобы чётко отображать реальное положение дел необходимо писать на Flasm :)

Но почему-то многие считают, что чем выше уровень абстракции, тем лучше код.

Dan - 20 Июль 2007 10:23

так никто не лишает вас возможности такой подход реализовать, вам нравится - вперед :)

а по другим языкам, я уже достаточно долго пишу на джаве 95 процентов своего рабочего времени, 5 процентов флекс, серверную часть, там где многопоточность дикая, так вот сделал там я конвейер и это решило огромное количество проблем, и с производительностью и с логикой. Хотя казалось бы остановил поток и "все читабельно".

в общем тут вопрос больше вкуса,
а к вашему посту - "сделайте - посмотрим" как я уже говорил

Евгений Потапенко - 20 Июль 2007 11:40

кстати, как я понял

sleep(100)

if (socket.connect(...)) {
socket.send(...);
}

из джавы во всяком случае код похож,
так вот, за sleep(100) обычно отрубают руки по плечи, а

if (socket.connect(...)) {
socket.send(...);
}

это пример "из учебника", когда пишут серьезное приложение с сокетом, такой подход работы с потоками и сокетами просто не используется, ибо опять же нужно руки отрубать по майку, гляньте MINA - event driven куда эффективнее и понятнее.

а когда плюс конвейер - так вообще сказка, поверьте.

и флейм этот нужно закрывать, хотите поболтать добро пожаловать - mail собака potapenko com


Евгений Потапенко - 20 Июль 2007 12:04

Критерий тут, возможно, такой. - Можно ли использовать такие приложения как, например, Enterprise Architect, совместно с подобным конвейером.

Поясню. Enterprise Architect позволяет создавать, используя UML, различные модели будующего приложения, и потом применять Reverse Code Engineering, с возможностью генерации кода в том числе и на ActionScript 2.0

Цитата на счет возможностей создания кода
http://sparxsystems.com.au/products/ea_features.html

" Fully template driven code generation engine - modify inbuilt templates or write your own from scratch
Add additional target languages
Syntax highlighted source code editor with quick "save and synch" capability
Inbuilt support for C++, Java, C#, VB.Net, Visual Basic, Delphi, PHP, Python and ActionScript
Support for CORBA also available as free plug-in"

*******

Раз заявлено о "Fully template driven code generation engine", стало быть - нужно это и реализовать, соответствующие templates.

Кому-то, может, и ActionScript 1 кажется достаточно высокоуровневым, а кому-то, может, и ассемблер - верх торжества над компьютером.

Но, согласитесь, на AS1 создать большое и робастое приложение невозможно. Мы упремся в сложность. Как раз со сложностью и призваны бороться все более и более высокоуровневые абстракции и языки программирования.

Ну а какая замечательная получается тут возможность - создать "высокоуровневые" UML-модели, сгенерировать потом за мгновение - одновременно код для двух различных клиентов - на Flash и на Java (область применения может быть и как desktop-приложение, а не только web).

Так что, Евгений, такая прекрасная возможность - создать templates для Enterprise Architect и этим увенчать разработку.

А если возможностей (желания) особо нет, то, может быть, Constantiner, сможет все проанализировать и создать такие templates. Знаний то хватает.

Я просто пока, на данную минуту, не могу сообразить, как это сделать, Reverse Code Engineering для конвейера - БЕЗ использования таких templates. Но может нужно просто подумать/разобраться?
Но, все же, раз конвейер написан на AS3, без создания новых templates все равно никак не обойтись.

Может быть кто-то еще хочет в лучах славы погреться - создать эти templates?

Одно важно замечание. Как упростить. В Java существует поддержка вызовов native-методов, написанных на C.
И достаточно широко используется.
Конечно же Enterprise Architect не будет генерировать код на С и поддержку его в Java, при создании Java-приложения по объектной модели, описанной на UML.

Т.е., по аналогии, часть конвейера, которая, может быть, не совсем "объектная" - вынести ее в фиксированную часть кода в шаблонах.

Критерий тут, возможно, такой. - Можно ли использовать такие приложения как, например, Enterprise Architect, совместно с подобным конвейером.

Поясню. Enterprise Architect позволяет создавать, используя UML, различные модели будующего приложения, и потом применять Reverse Code Engineering, с возможностью генерации кода в том числе и на ActionScript 2.0

Цитата на счет возможностей создания кода(http://sparxsystems.com.au/products/ea_features.html):

" Fully template driven code generation engine - modify inbuilt templates or write your own from scratch
Add additional target languages
Syntax highlighted source code editor with quick "save and synch" capability
Inbuilt support for C++, Java, C#, VB.Net, Visual Basic, Delphi, PHP, Python and ActionScript
Support for CORBA also available as free plug-in"

*******

Раз заявлено о "Fully template driven code generation engine", стало быть - нужно это и реализовать, соответствующие templates.

Кому-то, может, и ActionScript 1 кажется достаточно высокоуровневым, а кому-то, может, и ассемблер - верх торжества над компьютером.

Но, согласитесь, на AS1 создать большое и робастое приложение невозможно. Мы упремся в сложность. Как раз со сложностью и призваны бороться все более и более высокоуровневые абстракции и языки программирования.

Ну а какая замечательная получается тут возможность - создать "высокоуровневые" UML-модели, сгенерировать потом за мгновение - одновременно код для двух различных клиентов - на Flash и на Java (область применения может быть и как desktop-приложение, а не только web).

Так что, Евгений, такая прекрасная возможность - создать templates для Enterprise Architect и этим увенчать разработку.

А если возможностей (желания) особо нет, то, может быть, Constantiner, сможет все проанализировать и создать такие templates. Знаний то хватает.

Я просто пока, на данную минуту, не могу сообразить, как это сделать, Reverse Code Engineering для конвейера - БЕЗ использования таких templates. Но может нужно просто подумать/разобраться?
Но, все же, раз конвейер написан на AS3, без создания новых templates все равно никак не обойтись.

Может быть кто-то еще хочет в лучах славы погреться - создать эти templates?

Одно важно замечание. Как упростить. В Java существует поддержка вызовов native-методов, написанных на C.
И достаточно широко используется.
Конечно же Enterprise Architect не будет генерировать код на С и поддержку его в Java, при создании Java-приложения по объектной модели, описанной на UML.

Т.е., по аналогии, часть конвейера, которая, может быть, не совсем "объектная" - вынести ее в фиксированную часть кода в шаблонах.

P.S. Вообще, наверное, до того, как разработчики не реализуют поддержку генерации кода на AS3, смысла от такого шаблона будет немного. Но, это можно узнать - может быть поддержка AS3 вот-вот будет добавлена.
Про то, что поддерживается именно AS2 - написано у них вот тут:
http://sparxsystems.com.au/products/ea.html

Евгений Н. - 22 Июль 2007 1:28

Ой, Ctrl-C/Ctrl-V сработало не так, получилось дублирование, не заметил.

Прочтите P.S. в конце предыдущего поста.

Евгений Н. - 22 Июль 2007 1:34

Прочитал еще список последних фич
http://sparxsystems.com.au/products/ea_history.html

В разделе "Changes and fixes for Build 814" говорится, что "Increased range of embedded elements that can be created through automation interface."

А в разделе "Summary of features for Enterprise Architect - > Code Engineering" написано про С.

Так что один из путей упрощения угадал верно.

Евгений Н. - 22 Июль 2007 2:18

в ЕА уже давно есть поддержка AS3 в любую сторону, но есть пару ошибок в темплитах кода для генирации AS3 файлов, где-то я видел как их править но уже не помню - смысл такой
1. неверно проставляются импорты (нужно их перенисти в тело пакета)
2. при генирации интерфейса генерирует видимостьего методов (приват/паблик) на что ругаеться компилдтор.

А вообще отличный инструмент, я им регулярно пользуюсь!

__i - 22 Июль 2007 21:25

Все верно, AS 3 есть. Я до этого в плотную не занимался такими вещами.

У кого-нибудь под рукой есть ссылочка на исправленные теймплейты по AS3, или может в текущей версии (7) они уже исправлены?

И что тут за опция в разделе настроек генерации AS-кода: Collection Classes - ?

Жмем F1, открывается Help, в нем просто перечислены пункты в этом окне. Хм...

Евгений Н. - 22 Июль 2007 22:12

Нажал F1 в диалоговом окне "Collection Classes", хелп показывается с подробным описанием. Вопрос снимается.

Евгений Н. - 22 Июль 2007 22:17



Это запись из категории 'Classes'. 10 еще cвежих:

Архивы по категориям:

3D-18, Adobe AIR-30, Animation-1, Apache Ant-1, Architecture-1, ARP-1, Art-25, Articles-26, AS3-52, Books-7, Business-3, Cairngorm-2, CI-1, Classes-10, Coding-30, Community-113, Components-19, Contests-28, Cool-Job-5, Debug-18, Design-26, Development-84, EMO-1, Events-13, Extensions-2, FAQ-8, FDS-1, Flash and html-5, Flash Player-35, Flash Updates-8, Flash-scene-1, flash10-4, FlashLite-2, Flex-30, Flex 2-80, Flickr-1, FMS-1, FPUG-46, frameworks-1, Games-11, Good Job!-35, HaXe-14, Health-2, Humor-10, Ideas-13, JavaScript-1, Job-26, JSFL-8, Links-2, Linux-1, Maps-1, Math-8, Money-11, MXML-1, Open Source-15, Optimization-2, Patterns-2, Personalities-27, Politics-1, Preloading-3, Productivity-9, PureMVC-10, Pv3d-1, Rafpug-4, Red5-3, Remoting-11, Resources-21, Ruby-6, SAAS-1, Security-11, SEO-8, Silverlight-5, Sound-3, Strategy-120, Tamarin-1, Tools-113, Training-2, Trash-8, URAFPUG-13, Urgent-1, Usability-6, Video-6, VoIP-5, Wallop-1, Wishlist-2, Архив всех записей (большой)

За последние месяцы:

Июл 2008: Международная встреча разработчиков URAFPUG завершена, URAFPUG - трансляция студии Flex-фреймворка Mate, весь Июл

Июн 2008: Попытка предварительных выводов о встрече аниматоров, Онлайн трансляция встречи аниматоров в Донецке, весь Июн

Май 2008: Если 3D, то по-взрослому: официальный запрос в Adobe по поводу контроля над мип-маппингом. Нужна ваша поддержка!, В этом году «Russian Flash Awards» пройдет в «космическом стиле», весь Май

Апр 2008: Программирование под флэш платформу. Cтатья (местами спорная), Advanced Flash Components бесплатно раздает все свои AS2-компоненты, весь Апр

Мар 2008: Зарплаты программистов в 2007 году, FlashPhone как технология года? Технология года? В Рунете?, весь Мар

Фев 2008: ЙА ФПУГ — регистрация на первую встречу UAFPUG продолжается, Закулисы Flex и секрет успеха опенсорс-проекта, весь Фев





Примечания:
Статус документа
: в процессе
   2002-2007 Производство: Рост Прибыли · О проекте · Подписка на новости (RSS)