2010-03-10
Так случилось, что фильтрация коллекций ни разу не беспокоила меня. А тут коллега задал вопрос, который послужил толчком к тому, что вы сейчас прочитаете. =) Коллеге необходимо показать во view отфильтрованную ArrayCollection. Сама ArrayCollection находится в модели. Когда во view применяется фильтр, то данные модели очень сильно выглядят измененными. Что делать? Как быть? Конечно, мы с вами знаем, что данные на самом деле не меняются. source коллекции так и остается исходным. Но не работать же в модели с source? Конечно, не работать! И уж конечно, не делать копии коллекций! Тут спасибо Константинеру за наводку. =) Можно использовать ListCollectionView в качестве обертки нашей исходной коллекции уже на уровне view. Тогда довольная модель работает с ArrayCollection, как и прежде, а view показывает, что захочет. В качестве примера использую пример из доков Adobe для фильтрации коллекций. XML:
Тут у нас два выпадающих списка: один с source коллекции, а второй с самой коллекцией. Что же мы делаем? Тут и далее использован беглый стиль программирования, потому что все-таки пример. =) Code:
После создания приложения создаем эту нашу обертку: Code:
Фильтруем уже эту обертку, ее же показываем во втором выпадающем списке. Вот как выглядит код после изменений: XML:
В результате получаем фильтрацию исключительно на уровне view. А модель живет своей счастливой и долгой жизнью. =) Этот же подход можно использовать и при необходимости показывать одну и ту же коллекцию в разных контролах с разными фильтрами. 2010-03-03
Мне кажется, что есть три стадии принятия программистами паттерна Singleton.
Жалко, что не все доходят до третьей стадии. =) Теги: заметки на полях, паттерны
2009-10-16
Часто flex-разработчики работают в небольших командах, либо (о, ужас) в одиночку. А это может привести к тому, что утрачивается критическое отношение к своему коду. Но мы же не хотим деградации! =) Некоторое время назад Adode выпустили инструмент, который покритикует, укажет на недоработки, ошибки и bad practices в коде – это FlexPMD. Даже если вы пишете идеальный код (чего, конечно, не бывает), то будет полезно узнать про пару-тройку неиспользуемых методов или наличие пустых используемых методов. Или может в каком-то методе затесался неиспользуемый аргумент? =) На пути к идеальному коду у вас три этапа:
Набор правилПрежде всего необходимо определиться с набором правил, по которым будет проверяться код. Адобе предоставил FlexPMD Ruleset Creator, который по умолчанию предлагает набор из 84 правил разного приоритета: Error, Warning, Info. Этот набор можно редактировать и сгенерить файл pmd.xml, который будет в дальнейшем использоваться при проверке кода. Расскажу кратко про некоторые правила. Error priorityОшибками считается:
Warning priority
Info priority
В общем, лично я считаю эту программу крайне полезной. Если вы практикуете в команде ревью кода, то это может помочь на начальном этапе. Если команды нет, то полезно для самоорганизации. Шаги к идеальному коду с помощью AntПриведу шаги, в результате которых, вы сможете узнать всю правду про свой код. =)
2009-10-08
Когда давно я писала о вариантах передачи версии в приложение. Там упоминалось возможное использования для этого сonditional compilation, но тогда еще Flex 3 не вышел. Сейчас уже давным давно вышел Flex 3 и даже 4 не за горами. Сейчас расскажу про то, как легко и непринужденно передать версию вашего приложения при компиляции, а потом и запросто использовать ее в приложении. Передать константы в приложение можно, используя опцию компилятора compiler.define. Константы могут быть типов Boolean, String, Number или выражения, которые могут быть преобразованы в ActionScript в процессе компиляции. Далее эти константы доступны в приложении как глобальные. Используя опцию define, необходимо для константы определить: namespace, имя и значение:
Пример:
Доступ из приложения доступен пока только из as-классов. В скором будущем, возможно будет работать и доступ из mxml-классов. Говорят, что в mxml-классах можно использовать только Boolean. Но зачем нам? Мы же код в mxml не пишем.
Подробнее про использование conditional compilation в доках. Теги: flex, компиляция
2009-07-23
ArrayCollection является источником множества событийСлучается, что разработчики сильно расстроены разговорчивостью коллекций вплоть до того, что используют вместо них просто Array. Событие CollectionChange рассылается при каждом изменении коллекции. Например, при удалении двух элементов и добавлении трех, разошлется как минимум 5 событий. А тогда, например, визуальные компоненты, напрямую реагирующие на изменения коллекций (они подписаны на CollectionChange), будут производить слишком много промежуточных действий, хотя их волнует только финальное состояние коллекции. Да и некоторых разработчиков откровенно пугает, что столько неприкаянных ненужных событий бродит по просторам родного и горячо любимого приложения. А оно тебе надо?Но перед тем, как с чем-то бороться, призываю все-таки задуматься. Нужно ли с этим бороться? Чем лично тебе мешает частая рассылка событий коллекции? Ведь если мешает чисто “просто так", то паранойя - это, вообще говоря, серьезное заболевание, которое можно лечить. Мне в голову приходит не так много ситуаций, когда эта проблема должна беспокоить. При адекватной разработке компоненты не реагируют на изменения коллекции молниеносно, обработка происходит в отложенном режиме. Сколько бы раз ни пришло событие, обработка произойдет только в commitProperties, например. Поэтому на работе стандартного RIA это особо не скажется. Однако бывают все-таки неприятные вещи. Например, происходит какая-то долгая обработка коллекции, которая занимает времени больше, чем кадр или несколько кадров, то приложение входит в фазу полного зависания. Изменения коллекции еще не завершились, а отрисовка уже запустилась и т.п. Если все-таки надо.Когда посещают мысли что-то с этим делать, то конечно, немедленно хочется воспользоваться методом disableAutoUpdate, который позволяет отменить рассылку событий. Вызвав этот метод, вы можете быть уверены, что никто не узнает об изменениях коллекции. Метод enableAutoUpdate включит рассылку событий обратно. Обратите внимание, что это приведет к рассылке всех событий, накопленных за время “молчания” коллекции. Казалось бы все просто. Но тут есть интересная особенность. В зависимости от того сколько раз вы вызвали disableAutoUpdate, столько раз и придется вызвать enableAutoUpdate, чтобы кто-нибудь все-таки узнал об изменениях. Это может быть неудобно, особенно, если учесть, что, например, DataGrid использует эти механизмы сам. Если вы хотите сами решать, когда сообщать об изменении коллекции, то можно унаследоваться от класса коллекции и переопределить метод enableAutoUpdate таким образом, чтобы рассылка никогда не возобновлялась. Однако это приведет к тому, что коллекция все равно будет сохранять данные о своих изменениях. Тут есть еще интересная особенность. Вызов метода refresh приводит к рассылке события CollectionChange вне зависимости от того, отключен автоапдейт или нет. Не знаю, баг это или фича, но этот же метод еще и обнуляет массив накопленных за “время молчания” изменений. Таким образом, переопределив метод enableAutoUpdate и вызывая refresh только тогда, когда сочтете нужным, вы решите проблему рассылки лишних событий и их накопления в коллекции. 2009-04-06
Если вы мечтаете стать сертифицированным flex-разработчиком, то безусловно порадуетесь тому, что программа для подготовки к тесту Attest стала бесплатной. Приятно, что это произошло несмотря на мировой финансовый кризис. Будущие Adobe Flex 3 with AIR Certified Developer-ы дерзайте! PS: А есть желающие стать сертифицированными? 2009-03-10
Недавно в посте Многопоточность и flash платформа вместе я уже предлагала обсудить многопоточность. И вот сегодня читаю пост Threading in Flex про библиотеку AsyncThreading. Можно сказать, что библиотека эта для Flex, потому что в ней используются флексовые классы (я заметила один). И вот это уже действительно похоже на библиотеку, которую можно брать и использовать. Удачи тем, кому многопоточность необходима. 2009-03-09
Существуют разработчики, которым сильно не хватает многопоточности во flash и flex. Понятное дело, что они уже давно сделали свои эмуляции и живут прекрасно. Вот и еще один пост об этом же: Ender Lib - Threads for Flex. Библиотека Ender Lib, насколько я успела посмотреть, основана на использовании события ENTER_FRAME, но судя по всему вы можете использовать и таймер, так как нужные методы protected. А расскажите про свои реализации или чьи-нибудь уже известные и опробованные. 2008-09-08
В эту субботу у Константина Ковалева aka Constantiner был день рождения! Теги: birthday
2008-08-26
В воскресенье мы посетили августовскую встречу RAFPUG почти полным составом riapriority. Причем доклады про flex-фреймворки читали опять же представители riapriority: Константин Ковалев aka Constantiner рассказывал про Mate и Павел Кожин aka Vertex про Cairngorm. Таким образом встреча целиком прошла под эгидой Flex, и было много интересного, но обо всем по порядку. Если вы не были очевидцами, то вполне сможете посмотреть презентации докладчиков, поэтому расскажу о том, что в презентациях может и не найдете. First of all шок дня - Иван Дембицкий признал существование Flex. Ура, товарищи! Первый доклад про Gumbo порадовал богатыми перспективами Flex. Об этом уже многие писали, в том числе и Constantiner в посте Flex 4 “Gumbo” увидеть не хотите ли? И Gumbo, действительно, прекрасен.
В качестве переходного этапа к рассказам о Cairngorm и Mate был мини-доклад про то, зачем нужны фреймворки. Constantiner вкратце рассказал о проблематике командной разработки, о спагетти-коде, и о том, как перестать Кстати Constantiner придумал очень интересный проект - написать одно и тоже приложение с использованием разных фреймворков. Приложение не очень сложное - это поисковик книжек в Ozon, из функционала - собственно сам поиск и сохранение избранного в shared objects. Далее Vertex очень подробно рассказал про Cairngorm. В результате сложилось впечатление, что полезно знать этот фреймворк, так как он очень распространен сейчас. С другой стороны кажется, что тяжеловесность и неповоротливость Cairngorm-а, может склонить разработчика к принятию решения о выборе другого фреймворка. А какого другого фреймворка спросите вы? При принятии этого решения может оказать незаменимую помощь доклад Кости про Mate. Неформальная часть тоже порадовала темами для обсуждения и приятным общением. Сообщество интересуется и разработкой серверной части, и работой с системами контроля версий, и общей организацией разработки, и многим другим. А если вы еще ни разу не посетили встречу, то обязательно это сделайте в ближайшее время. Все-таки не всем разработчикам на flash-платформе повезло работать в команде, а тут такая возможность обменяться опытом. |