Евгений Потапенко признался, что уже месяца два как выложил ActionScript3-версию своего класса Conveyor, ставшим для многих незаменимым помощником во флэш-программировании.
По ссылке - отличнейшая статья и исходники.
А я своим пользуюсь ;)
очень понравилось: "Далее. Garbage Collector ну просто зверь. Удаляет из памяти работающие анонимные конвейеры с большой охотой." ;)
Конвейер для зарабатывания денег от Евгения Потапенко...
Забавно, как часто одни и те же мысли независимо приходят разным людям :)
Как-то не верится в перпективность этого подхода на больших командных проектах...
Если сделать компилятор, который будет использовать конвееры прозрачно, то это будет гораздо лучше традиционного подхода.
Особенно на больших командных проектах.
можно подробнее о компиляции? ;) звучит немного нелепо.
по поводу больших проектов... тоже не понял ;)
На 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 ждёт своей очереди.
Разве это не более читабельно и интуитивно понятно, чем масса событий и их обработчиков, да ещё и с делегированием методов?
а, понял, трансляция (генерация) кода.... для меня лично данный код менее читабельный, так как не показывает реальную логику работы приложения.
Если есть интерес в придумывании своих языков и кодогенерации, посмотрите jetbrains MPS.. это пока бета и для джавы (генерится пока только в джаву). Очень увлекательно. Для AS не применимо, но сознание расширяет.
Вот ещё пример (сильно утрированный).
Пишем:
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 и т.д.
В результате код получается на порядок чище и разработчик освождается от рутины.
угу, выглядит как эмуляция потоков исполнения и их остановки в AS, идея старая, и я о ней писал в первой статье. Зашибись конечно, но честно говоря не понимаю зачем. А что код получается чище - опять же могу поспорить, для меня код читабельный - в первую очередь отображающий реальное положение дел, а в вашем коде, то что поток остановится - не очевидно, что код будет выполнен после ответа сервера - тоже из кода не видно, по мне лучше уж использовать конвейер, тут есть логика исполнения, которая видна из кода, плюс AS3 в котором есть куча преимуществ, так как там делегирование встроенное.
если есть идея - добро пожаловать, реализуйте, покажите, можно будет пощупать. а так... это праздные разговоры, о том как было бы хорошо иметь такие-то возможности.
> для меня лично данный код менее читабельный, > так как не показывает реальную логику работы > приложения.
Как раз таки прекрасно видна последовательность действий. Что после чего следует.
> а в вашем коде, то что поток остановится - не > очевидно, что код будет выполнен после ответа > сервера - тоже из кода не видно
В других языках народ как-то не особо с этим парится. Напротив, неблокирующие вызовы, которые возвращаются сразу, а исполняются когда-то потом чаще становятся причинами ошибок. А когда пишут sleep(100) прекрасно понимают, что на 100 милисекунд выполнение приостановится. Или пишут: if (socket.connect(...)) { socket.send(...); } и прекрасно понимают, что отправка произойдёт только после соединения. В AS для этого приходится писать несколько фукнций и присваивать из в обработчики событий. В результате логика оказывается сильно размазана.
> для меня код читабельный - в первую очередь > отображающий реальное положение дел
Чтобы чётко отображать реальное положение дел необходимо писать на Flasm :)
Но почему-то многие считают, что чем выше уровень абстракции, тем лучше код.
так никто не лишает вас возможности такой подход реализовать, вам нравится - вперед :)
а по другим языкам, я уже достаточно долго пишу на джаве 95 процентов своего рабочего времени, 5 процентов флекс, серверную часть, там где многопоточность дикая, так вот сделал там я конвейер и это решило огромное количество проблем, и с производительностью и с логикой. Хотя казалось бы остановил поток и "все читабельно".
в общем тут вопрос больше вкуса, а к вашему посту - "сделайте - посмотрим" как я уже говорил
кстати, как я понял
sleep(100)
if (socket.connect(...)) { socket.send(...); }
из джавы во всяком случае код похож, так вот, за sleep(100) обычно отрубают руки по плечи, а
это пример "из учебника", когда пишут серьезное приложение с сокетом, такой подход работы с потоками и сокетами просто не используется, ибо опять же нужно руки отрубать по майку, гляньте MINA - event driven куда эффективнее и понятнее.
а когда плюс конвейер - так вообще сказка, поверьте.
и флейм этот нужно закрывать, хотите поболтать добро пожаловать - mail собака potapenko com
Критерий тут, возможно, такой. - Можно ли использовать такие приложения как, например, 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.
Т.е., по аналогии, часть конвейера, которая, может быть, не совсем "объектная" - вынести ее в фиксированную часть кода в шаблонах.
Цитата на счет возможностей создания кода(http://sparxsystems.com.au/products/ea_features.html):
P.S. Вообще, наверное, до того, как разработчики не реализуют поддержку генерации кода на AS3, смысла от такого шаблона будет немного. Но, это можно узнать - может быть поддержка AS3 вот-вот будет добавлена. Про то, что поддерживается именно AS2 - написано у них вот тут: http://sparxsystems.com.au/products/ea.html
Ой, Ctrl-C/Ctrl-V сработало не так, получилось дублирование, не заметил.
Прочтите P.S. в конце предыдущего поста.
Прочитал еще список последних фич 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" написано про С.
Так что один из путей упрощения угадал верно.
в ЕА уже давно есть поддержка AS3 в любую сторону, но есть пару ошибок в темплитах кода для генирации AS3 файлов, где-то я видел как их править но уже не помню - смысл такой 1. неверно проставляются импорты (нужно их перенисти в тело пакета) 2. при генирации интерфейса генерирует видимостьего методов (приват/паблик) на что ругаеться компилдтор.
А вообще отличный инструмент, я им регулярно пользуюсь!
Все верно, AS 3 есть. Я до этого в плотную не занимался такими вещами.
У кого-нибудь под рукой есть ссылочка на исправленные теймплейты по AS3, или может в текущей версии (7) они уже исправлены?
И что тут за опция в разделе настроек генерации AS-кода: Collection Classes - ?
Жмем F1, открывается Help, в нем просто перечислены пункты в этом окне. Хм...
Нажал F1 в диалоговом окне "Collection Classes", хелп показывается с подробным описанием. Вопрос снимается.