Тихая ненависть к Flex

17 ноября 2008

Переход на другую среду разработки всегда идет не гладко. Все непривычно, все вызывает раздражение. А некоторые моменты просто бесят. Я только недавно начал работать с Flex, и меня в нем многое раздражает, а кое-что просто дико бесит, заставляя ругаться матом. Полагаю, этот переходный период закончится по мере привыкания и накопления опыта. Но пока хочется выплеснуть эмоции, почему я и пишу это. Итак, вот они, выплески ненависти:

UPD: Силами BAFPUG удалось прояснить некоторые моменты. А некоторые не удалось ...

Первое

У проекта должен быть основной класс приложения, который и компилируется. Их даже может быть несколько. Это не удивительно. Удивительно то, что этот класс не может быть внутри пакета. Я уже давно привык к тому, что классов вне пакета не бывает. Любой класс находится в пакете com.yourcompanydomain.projectname или глубже (обычно глубже). Пустой пакет -- плохой стиль программирования. Flex не дает мне сделать этого. Блин, мне нафиг не нужен класс MyCoolApp. Мне нужен класс com.yzh44yzh.myCoolProject.MyCoolApp и никак иначе. Flex вынужнает меня писать говнокод.

UPD: народ говорит, что с этим ничего не поделаешь. Но что-то мне помнится, как-то раньше, когда я возился с Flex, у меня получалось назначить главным классом приложения класс внутри пакета. Сейчас почему-то неполучается. Оставим вопрос открытым.

Второе

<mx:Button>
	<mx:label>Push Me</mx:label>
</mx:Button>	

Что вы можете скажать об этом коде? Я вот скажу, что это дублирование и информационный мусор. Каждый открытые тег нужно закрыть -- это в два раза больше букв, чем нужно.

import mx.controls.Button;
	
var b:Button = new Button();
b.label = 'Push Me';
Вот это понятно и лаконично. Для меня очевидно, чем лучше второй вариант -- меньше букв, легче и быстрее читается код. Для меня полная загадка, какие преимущества имеет первый вариант. Не вижу никаких.

Я не понимал раньше, не понимаю и теперь, нафиг нужен этот MXML. Почему не писать все тоже самое на ActionScript? Ну ладно. Они там хотят писать на MXML, пусть пишут. А я буду на ActionScript писать. А вот фиг там! Второй пример кода не компилируется.

1172: Definition mx.controls:Button could not be found.

Вероятно эти классы как-то можно подключить и как-то можно скомпилировать. Но сразу "из коробки" -- не работает. Да я и не буду с этим разбираться. До сих пор прекрасно обходился без пакета mx, и дальше обойдусь. У меня есть своя gui-библиотека, потрачу время, портирую ее на AS3 и будет мне счастье.

UPD: Это заявление предсказуемо вызвало споры. Я остался при своем мнении, но в чате были интересные мысли. Поэтому я частично публикую логи чата в конце статьи. Зато выяснилась ситуация с пакетом mx. Суть в том, что пакет можно импортировать в проекте типа Flex, но нельзя импортировать в проекте типа ActionScript (а я создавал именно такой проект). Правда Алексей Ventur Логинов говорит, что у него работает mx в ActionScript проекте, и класс внутри пакета можно задать, как главный класс приложения. И у него довольно старая версия Flex. Вероятно, это можно было делать в старой версии, но нельзя в новой.

Третье

К черту HTML-wrapper! Нафиг он включен по умолчанию? Кому нужен этот говнокод, пусть включает. Почему его нельзя отключить при создании проекта? Нужно создать проект, открыть его свойства, выключить wrapper, потом сделать project->clear, чтобы все говнофайлы удалились. Повторить в каждом новом проекте.

И кстати про swfobject. Говорят, что скоро Adobe будет использовать его как основное средство для внедрения swf-файла в html-код. Это можно было бы приветсвовать, если бы сам swfobject не скатился в сторону говнофункционала. Все было хорошо до выхода версии 2.0. А в версии 2.0 появилась такая хрень как Express Install. Он устанавливает флэш-плеер автоматически, не спрашивая пользователя. Разработчики вообще охренели, пользователей за быдло держат. Типа, мы лучше знаем, что у тебя должно быть установлено. А пользователю, может, нахрен не нужен флэш-плеер. Он, может, вообще не хочет его устанавливать. Это его право.

Хорошо еще, разработчики swfobject охренели не окончательно, и этот Express Install можно отключить, хотя по умолчанию он включен.

Четвертое

Уж не знаю, что это такое. У меня такая фича только в одном проекте проявляется, во всех остальных нормально работает. Жмешь F11 для отладки (или Ctrl-F11), и если в редакторе активен не основной класс приложения, а любой другой, то отладка не запускается. Выскакивает алерт This file can not be launched.. В итоге нужно всегда держать открытым основной класс приложения и переключаться на него перед запуском отладки.

Искал, чем этот проект отличается от всех прочих -- не нашел. Вроде бы все такое же и в настройках, и в структуре.

Эту фичу я готов простить, хоть и сильно мешает. Прогуглю и скорее всего разберусь, в чем там дело. В данном случае понятно, что это обычный баг в IDE, который у всех бывает. А вот все предыдущее, это не баги, это злонамеренный вред.

UPD: Удалил проект и создал заново -- помогло. Теперь проект компилируется при любом активном файле. Старое доброе шаманство до сих пор помогает.

UPD: теперь отрывки из обсуждения этой статьи в чате BAFPUG. Имена участников чата я на всякий случай скрою -- вдруг кто-нибудь обидится.

 Zhloba Yuri говорит: кстати, юзающие Flex, может есть что сказать по поводу моих 
разачарований в нем
 Zhloba Yuri говорит: желательно конструктивно -- то есть, направлено на решение проблем
 Zhloba Yuri говорит: за эмоции сории, писал ночью, после двух часов отчаянной борьбы с флексом
 user2 говорит: <mx:Button>
 <mx:label>Push Me</mx:label>
</mx:Button>
 user2 говорит: тут буду спорить
 user2 говорит: не сравнивай язык разметки с экшн скриптом
 user2 говорит: мог написать <mx:Button label = "dfdfgg"/>
 Zhloba Yuri говорит: не, суть не в том, плох MXML или хорош
 Zhloba Yuri говорит: суть в том, что должен быть выбор, на чем строить GUI
 user1 говорит: у тебя есть выбор
 user1 говорит: у меня есть проект на flex гед только 1 файл MXML
 user1 говорит: все остальное кодом
 user1 говорит: GUI тоже
 Zhloba Yuri говорит: ок, как создать mx.controls.Button без MXML, на AS ?
 Zhloba Yuri говорит: я догадываюсь, что это возможно, но не понял, как
 ...
 user2 говорит: Я не понимал раньше, не понимаю и теперь, нафиг нужен этот MXML. 
Почему не писать все тоже самое на ActionScript?  - а нахер нужен html, 
давайте писать на явасктипте :)
 Zhloba Yuri говорит: аналогия имеет право на существование
 Zhloba Yuri говорит: при том условии, что mx все-таки можно использовать без MXML
 user3 говорит: MXML – это классно, хотя и не всегда. позволяет написать 
легкочитаймые резиновые вещи
 user2 говорит: и лекгопросмартиваемые в билдере
 user3 говорит: я пробовал писать резинки на AS и пришел XML
 user3 говорит: иначе нечитабельно
 Zhloba Yuri говорит: легкочитаемые, легкопросматриваемые -- зависит от программиста и IDE, 
а не от языка. Это не есть уникальная особенность MXML
 Zhloba Yuri говорит: резиновый дизайн тоже
 ...
 Zhloba Yuri говорит: легкость использования, читаемость кода, экономия времени -- 
свойства GUI - библиотеки. Тоже не есть уникальное достоинство MXML
 Zhloba Yuri говорит: просто другие GUI-библиотеки мало известны
 Zhloba Yuri говорит: ладно, я не про то
 Zhloba Yuri говорит: я про отсутствие выбора
 Zhloba Yuri говорит: вот что плохо
 user3 говорит: в смысле, где отсутствие выбора?
 Zhloba Yuri говорит: поправьте, если я не прав, но тезис таков: 
если я не хочу использовать MXML, то я не могу использвать mx. Мне нужна другая gui-библиотека
 user3 говорит: попробую поправить
 user2 говорит: ты во флеше хочешь использовать mx?
 Zhloba Yuri говорит: я хочу во флексе использовать mx, но писать код не на MXML, а на AS
 Zhloba Yuri говорит: var b:Button = new Button();
 user2 говорит: спокойно можешь это делать
 Zhloba Yuri говорит: дык я ж говорю -- импорт не проходит
 user2 говорит: значит чета нетак сделал
 user3 говорит: не понял зачем тебе флекс, если тебе не нужны не их компоненты не mxml
 user3 говорит: ?
 Zhloba Yuri говорит: Как IDE для программирования на AS3
 user3 говорит: FDT!
 Zhloba Yuri говорит: FDT3 мне не нравится еще больше
 user2 говорит: а мне наоборот
 Zhloba Yuri говорит: такой уж я привиредливый
 Zhloba Yuri говорит: и, кстати, какая разница, FDT или Flex, если не подключаются импорты
 user2 говорит: короче Юра , если ты там создал флеш проджект, то на импорт билдер будет ругаццо
 user2 говорит: если флекс проджект, то не будет
 user3 говорит: это вопрос настроек
 Zhloba Yuri говорит: понял, создавать Flex проект с пустым главным MXML классом
 user2 говорит: да
 Zhloba Yuri говорит: и все остальное писать на AS
 user2 говорит: да
 Zhloba Yuri говорит: ок, вот это я и хотел узнать. Спасибо
...
 user3 говорит: use FDT, это г. но лучше остального г.
 Zhloba Yuri говорит: FDT по функционалу хорош, но тормозит, жрет много памяти, и парсер глючит
 Zhloba Yuri говорит: постоянно подсвечивает левые errors
 user3 говорит: а mxml не бойся, это обычные классы, их можно extand-ить если надо
 user3 говорит: public class extends Button{
 user2 говорит: угу
 Zhloba Yuri говорит: не то, чтобы я боялся MXML, просто не люблю черных ящиков. 
Flex все равно генерит AS из MXML, но не спрашивает меня, как
 user3 говорит: public class MyAS extends MyMXML{
...
<MyAS/>
 Zhloba Yuri говорит: это иррациональное недовольсто
 Zhloba Yuri говорит: не более того
 Zhloba Yuri говорит: Eclipse открыт, Flex -- черный ящик. Руки так и тянутся все поломать :)
...
 user2 говорит: Юра только если ты сделаешь новый флекс проджект, то мин размер твоей 
аппликухи будет 300 кб
 user2 говорит: потому что туда всунется весь фреймворк и менеджерами
 user2 говорит: помоему у флеша тоже есть класс симплБаттон
 Zhloba Yuri говорит: да, это характерно для всех больших gui-библиотек
 Zhloba Yuri говорит: наша библиотека тоже где-то на 300 к тянет
 user1 говорит: MXML нужен в первую очередь для визуально билдинга GUI
 Zhloba Yuri говорит: а, вот, первый серьезный аргумент
 Zhloba Yuri говорит: хотя Delphi делает тоже самое, и обходится без языка разметки
 user1 говорит: у каждого свои подходы
 user1 говорит: в том же делфи генерятся файлы описания форм
 Zhloba Yuri говорит: это да. Но преимущества подходов нужно доказывать и аргументировать
 Zhloba Yuri говорит: как-то мне не встречалась подобная аргументация за MXML
 Zhloba Yuri говорит: кажется, все просто принимают его как данность
 Zhloba Yuri говорит: и даже не задумываются, а почему?
 user1 говорит: MVC
 user1 говорит: View это MXML
 Zhloba Yuri говорит: это не аргумент, MVC возможен и без MXML
 user1 говорит: это инструмент для упрощения разделения логики и GUI
 user2 говорит: типа чтобы верстальщик тоже смог влезть в код
 Zhloba Yuri говорит: ага, примерно так я и высказался в своей статье 
"Программирование под флэш-платформу" еще в мае месяце
 Zhloba Yuri говорит: да, это годится как агрумент -- облегчает переход на Flex 
для html-верстальщиков, не программистов
 user4 говорит: mxml удобен при расстановке элементов управления
 user4 говорит: это больше для дизайнеров
 Zhloba Yuri говорит: Рост, кстати, за MXML тогда сказал, что дескать, 
сейчас везде есть тенденция к декларативному описанию интерфейсов
...
 user1 говорит: я готов в конструктивному спору по flex :)
 Zhloba Yuri говорит: ок, мои против изложены в статье на сайте. Давай свои за
 user1 говорит: щас по пунктам пройдусь
 user1 говорит: 1) основной MXML, это признаюсь ни как не поправить
 user1 говорит: такой у них подход
 user1 говорит: package {
 import mx.containers.Canvas;
 import mx.controls.Button;

 public class MyCanvas extends Canvas {
  public function MyCanvas() {
   super();
   var b:Button = new Button();
   b.label = "button label"
   addChild(b);
   
  }
  
 }
}
 user1 говорит: это пункт 2
 user1 говорит: про кнопку в коде
 Zhloba Yuri говорит: да, это уже понятно
 Zhloba Yuri говорит: я создавал AS3 проект, а нужно было Flex проект
...
 user1 говорит: я скажу просто про плюсы flex тогда, с моей точки зрения
 user1 говорит: 1) Фрейворк Flex позволяет создавать приложения, в которых требуются 
"стандартные" контролы значительно быстрее
 user1 говорит: то ест за нас уже придумали, при чем багов минимум
 Zhloba Yuri говорит: это позволяет делать любая gui-библиотека
 user2 говорит: БАГОВ МИНИМУМ
 Zhloba Yuri говорит: ладно, принимается, все равно их никто не знает, других gui-библиотек
 user2 говорит: но есть :)
 user1 говорит: 2) Удобные Managers, PopUp, tooltips, cursors, dragAndDrop
 user1 говорит: и еще куча
 user1 говорит: 3) Мощная вещь DataBinding
 user1 говорит: 4) возможность отделить визульное размещения контролов от основного кода
как пример, это разделение работы между 2-3 людьми
 user1 говорит: Например,  MXML позволяет в коде не хранить в коде такие вещи как <mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" 
  width="100%" height="26"
  verticalAlign="middle"
  cornerRadius="5" borderStyle="solid" borderThickness="0" 
  backgroundColor="#000000" backgroundAlpha=".1"
  paddingLeft="3" paddingRight="4"
  includeInLayout="{visible}"
  >
 user1 говорит: что делает код самих классов чище и читабельнее
 user1 говорит: 5) удобное скинование, CSS вам в руки
также динамическое скинование
 user2 говорит: см эксампл Валера делает mxml компонент и отдает его потом Сергею на 
скинование и Валентину на прикручивание логики
 user1 говорит: ну по сути все сводится к  'flex-фрейворк' и MXML
...
 Zhloba Yuri говорит: моя позиция не в том, что Flex это плохо (иначе бы я на нем не работал)
 Zhloba Yuri говорит: а в том, что там есть некоторые вещи, которые сделаны плохо
 Zhloba Yuri говорит: так вот, что касается вещей, которые сделаны плохо, то нужно 
либо разобраться, как сделать лучше, либо выяснить, что на самом деле это не плохо, 
а так и надо, либо смириться с их существованием
 Zhloba Yuri говорит: касательно моей статьи, по п1 -- смириться, по п2 -- решение найдено
 Zhloba Yuri говорит: п3 -- не обсуждался
 Zhloba Yuri говорит: п4 -- не обсуждался