Эх, что-то последнюю неделю много эмоций накопилось о славном продукте adobe flex.. так много, что появилось стойкое желание ознаменовать открытие блога неким опусом про него..
А началось всё с того, что с недавнего времени приходится писать проект, используя эту штуковину. Изначально стоял выбор WPF vs Flex. Поработав пару тройку недель на WPF, разобравшись немного с ней, понял, что штука очень хорошая, хотя и сложная. Большой шаг вперёд по сравнению с GDI(+). Но сейчас не об этом.
С флешем раньше никогда не работал, с флексом и подавно. Повседневный опыт использования компьютера подсказывал, что на флеше в основном пишут рекламные ролики, ради которых по большому счёту и ставятся блокираторы рекламы к любимым браузерам. Язык же actionscript прочно ассоциировался с javascript (с коим пришлось в своё время поработать, попортить нервов), так что, ничего хорошего платформа flex, казалось, не предвещала. Нам же предстояло писать довольно серьезный "бизнес" проект. Однако, в примерах недостатка не было: начиная от игрушек типа
falling bush, и заканчивая поражающим воображение несведующего во флеше человека текстовым редактором
buzzword.
Что же, ставим Adobe Flex Builder beta 2. Среда разработки построена на eclipse (с которой, кстати, тоже никогда не имел дело). Довольно удобная, надо сказать. Есть даже такие фичи, которых нет в студии, но очень удобные (например, go to last edit location). Язык вполне такой объектно-ориентированный, классы даже называются class'ами, а не function'ами, как в javascript'е. Синтаксис дурацкий конечно, в духе var a:Number = 2, но жить можно. В общем, внешне понравилось, если равняться на javascript, то значительно лучше его, и на том спасибо.
Однако сравнение с C# + Visual Studio + ReSharper явно не в пользу флекса. Вот, напримр, интересная идея есть во флексе: automatic build - автоматически собирает проект после сохранения файла. Ну и, по идее, делает это в фоновом режиме. А потом подсвечивает ошибки на строках. Вроде бы всё хорошо, но решарперовским анализатором кода, так сказать, real time, пользоваться гораздо удобнее, не говоря уже про его quick fix'ы. (Кстати, я довольно быстро понял, чем объявление переменной в стиле C# удобнее: после того, как напишешь тип, имя решарпер предлагает автоматически, причём в 80% случаев именно то, которое и подходит, а в 90% нужное имя есть в списке. Даже если бы к actionscript'у и было какое-то подобие resharper'а, то с var name:type, такая фишка уже не получится при всём желании.) Плюс ко всему эта "фоновая" компиляция кушает прилично ресурсов, так что иногда даже текстовый редактор подтормаживает. В общем, хороша идея, но до ума не довели..
Едем дальше. Intellisence вроде даже работает, но только на названия переменных и методов. Всякие ключевые слова, типа private, public, function, не предлагает. Довольно быстро перестало получаться набирать слово "function", пришлось забиндить горячую клавишу, чтобы вставлять его целиком :) По началу много кода пришлось переносить из WPF (кстати сказать, внутренняя архитектура этих систем довольно сильно похожа: и там, и там, есть display list, routed events, и там, и там отрисовка происходит в большинстве случаев автоматически при изменении свойств графических элементов; несколько режимов layout'а, файлы описания разметки - mxml и xaml, и т.д.). Так что, несколько раз искал инструменты для перевода c#->actionscript в автоматическом или хотя бы полуавтоматическом режиме, но готового так ничего и не нашёл, пришлось делать всё руками, хотя и не без помощи макрокоманд.
В общем, когда нас, наконец, попросили выбрать между WPF и Flex, единогласно все были за первое, написали кучу аргументов, ну.. начальство и согласилось. Только начали входить во вкус, как на тебе, решили обратно переходить на флекс. Мол, флешевые приложения на любом браузере работают, а для WFP надо framework ставить, кучу клиентов потеряем, и т.п.. хотя Silverlight на горизонте.
Ну что ж, делать нечего, флекс, так флекс.. Тут и началась настоящая разработка. Тут и начались настоящие проблемы. Язык хоть и объектно-ориентированный, но почему-то конструкторы все должны быть публичными. Нельзя их сделать даже internal (об интернал обязательно напишу позже, отдельная тема). Нет перегрузки функций. Есть правда умолчательные параметры, но это явно немного не то. Нет enum'ов. Да, казалось бы, и горя мало, но вот как переносить c#-овские enum'ы во флекс? Приходится писать класс со статическими полями, который хранит внутри цифирку, а чтобы нельзя было его создать как попало (ведь конструктор публичный), приходится
извращаться. Нет абстрактных методов! Пишем везде throw new AbstractMethodCallError(). То ли ещё будет..
Порадовали встроенные коллекции. Отнаследовался от одной, перекрыл виртуальные методы типа addChild и addChildAt. Надо было при добавлении что-то ещё делать, уже, правда, не помню что. Всё бы хорошо, только вот это "что-то" то и дело по 2 раза вызывается при добавлении в коллекцию, а потом при удалении падает напрочь. Оказалось, из addChild зовётся addChildAt (!) Мда, видимо библиотеки адобовцы пишут в первый раз..
Эх, на первый раз хватит, спать уже хочется, хотя эмоции на эту тему ещё не исчерпаны. Буду писать про флекс ещё, повод для этого возникает последнее время не редко.