Слайд 2Способы разработки приложений
Хотелось бы:
«Раз!» - «работка»
Есть:
«Раз!» - «…а получилось как обычно»
Должно быть:
![Способы разработки приложений Хотелось бы: «Раз!» - «работка» Есть: «Раз!» - «…а](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-1.jpg)
1. Раз-Ра-Бот-Ка
(«по-э-тап-но»)
Слайд 3PureMVC для ленивых
Вопрос: Зачем нужен PureMVC?
Ответ: Для экономии лени.
Лень – это друг
![PureMVC для ленивых Вопрос: Зачем нужен PureMVC? Ответ: Для экономии лени. Лень](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-2.jpg)
человека.
Количество лени во Вселенной ограничено и неизменно ;-(
Лень не берется из ниоткуда не исчезает в никуда.
Слишком умные отбирают лень у просто умных
PureMVC — оружие «слишком» умных.
Слайд 4Векторная карта Москвы
- пример PureMVC-приложения -
![Векторная карта Москвы - пример PureMVC-приложения -](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-3.jpg)
Слайд 5Векторная карта как дерево
На вид двумерная, но внутри четыре измерения
![Векторная карта как дерево На вид двумерная, но внутри четыре измерения](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-4.jpg)
Слайд 8Требования к карте
Карта Москвы с точностью до метра
9 уровней масштаба
Гибкая настройка стиля
![Требования к карте Карта Москвы с точностью до метра 9 уровней масштаба](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-7.jpg)
и поведения
Инструменты карты
«Чтобы работала лучше Mos2.ru»
Рабочая версия http://217.10.32.73:8080/map/
Слайд 9- рефакторинг -
Большая переделка
![- рефакторинг - Большая переделка](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-8.jpg)
Слайд 10Если вы попали в серьезную переделку
Рефакторинг или Реорганизация — процесс полного или
![Если вы попали в серьезную переделку Рефакторинг или Реорганизация — процесс полного](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-9.jpg)
частичного преобразования внутренней структуры программы при сохранении её внешнего поведения.
http://ru.wikipedia.org/wiki/Рефакторинг
Слайд 11Подходы к рефакторингу
Наивный (нет подхода):
как-нибудь да получится («какой-какой «рефакторинг?»)
Самоуверенный:
вера в
![Подходы к рефакторингу Наивный (нет подхода): как-нибудь да получится («какой-какой «рефакторинг?») Самоуверенный:](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-10.jpg)
идеальный код, не нуждающийся в переделке
Эгоистичный:
пусть рефакторит компьютер, он железный
Осознанный:
делаем с учетом будущего, придерживаемся правил
Стратегический:
применение паттернов, проектирование, фреймворки.
Слайд 12Методы рефакторинга
Изменение сигнатуры метода
Заключается в добавлении, изменении или удалении параметра метода.
Инкапсуляция поля
Было:
![Методы рефакторинга Изменение сигнатуры метода Заключается в добавлении, изменении или удалении параметра](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-11.jpg)
public var x: Number;
Стало: private var _x: Number; // добавляется getter-setter
Выделение метода
Самокомментирующийся код: если фрагмент кода требует комментария, то его следует выделить в отдельный метод и назвать так, чтобы данный комментарий стал ненужным.
Перемещение метода
Перемещается метод, который чаще обращается к другому классу, чем к своему собственному.
Слайд 13Проблемы от рефакторинга
Проблемы, связанные с базами данных
Проблемы изменения интерфейсов
Трудности при изменении дизайна
![Проблемы от рефакторинга Проблемы, связанные с базами данных Проблемы изменения интерфейсов Трудности при изменении дизайна](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-12.jpg)
Слайд 14PureMVC
- и паттерны проектирования -
![PureMVC - и паттерны проектирования -](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-13.jpg)
Слайд 15Что такое PureMVC
PureMVC - это классический мета-паттерн «Model-View-Controller»
Proxies = Модель
Mediator = Представление
Commands
![Что такое PureMVC PureMVC - это классический мета-паттерн «Model-View-Controller» Proxies = Модель](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-14.jpg)
= Контроллер
+ Notifications (Оповещения) для коммуникации.
+ Façade (Фасад) для координирования
Слайд 16Шутка про k=3
Математик идет по улице.
Видит — филармония, афиша, "Камерный оркестр Джо
![Шутка про k=3 Математик идет по улице. Видит — филармония, афиша, "Камерный](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-15.jpg)
Пауэлла".
О, говорит, интересно, зайду.
Через полчаса растроенный выходит: "Тьфу, тривиальный случай, k=3"
Математик что-то знал (Паттерны?).
Слайд 19Что дает PureMVC
Дисциплина разработки
Общий язык для архитекторов
Более устойчивый к рефакторингу проект
![Что дает PureMVC Дисциплина разработки Общий язык для архитекторов Более устойчивый к рефакторингу проект](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-18.jpg)
Слайд 20Структура PureMVC
Фасад:
Показать все, что скрыто.
Медиатор:
Скрыть все, что видно.
Посредник:
Отдать то,
![Структура PureMVC Фасад: Показать все, что скрыто. Медиатор: Скрыть все, что видно.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-19.jpg)
что взято.
Команда:
Сделать, когда нужно.
Оповещение:
Сделаю все, что скажут.
Пойду туда, куда пошлют.
Принесу то, не знаю что.
Слайд 21Популярность PureMVC
AS2
Java
AS3 Standard
AS3 MultiCore
ColdFusion
C#
Perl
PHP
Python
Ruby
![Популярность PureMVC AS2 Java AS3 Standard AS3 MultiCore ColdFusion C# Perl PHP Python Ruby](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-20.jpg)
Слайд 22Мы хотим знать разницу
PureMVC or Cairngorm?
>> Интересует Ваше мнение по этим библиотекам
![Мы хотим знать разницу PureMVC or Cairngorm? >> Интересует Ваше мнение по](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-21.jpg)
>> и вообще по паттерным решениям для Flex.
Без сомнения и то и другое полезно. Но если бы еще авторы их уделяли достаточно внимания "расжевыванию" своих замыслов реализованных во фреймворке.
Качественное "расжевывание" - это когда даже студенту-программисту незнакомому с паттернами будет ясно что к чему. Потому что когда специалист не может оценить риски по миграции - это уже либо бестолковое описание, либо "особая форма маркетинга" (сокрытие информации о недостатках продукта) ИМХО.
[http://groups.google.com/group/fpug/browse_thread/thread/3770e9c4a296dad9]
Слайд 23Изучение PureMVC
http://puremvc.org
Goals & Benefits
Conceptual Diagram
Framework Overview
Best Practices
![Изучение PureMVC http://puremvc.org Goals & Benefits Conceptual Diagram Framework Overview Best Practices](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-22.jpg)
Слайд 24Статьи о PureMVC на русском
10 советов по PureMVC
Что мы знаем о flash/flex
![Статьи о PureMVC на русском 10 советов по PureMVC Что мы знаем](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-23.jpg)
фреймуорках?
Пример Flash-галереи на PureMVC
Как создать простой FLV-плеер во Flex и Flash, используя PureMVC
Мои статьи
-= Чисто MVC =- (тут важны комменты)
Архитектура и ключевые фигуры фреймворка PureMVC
Фасад (Façade) — ядро и лицо фреймворка PureMVC
Как устроены Модель, Вид и Управление во фреймворке PureMVC
Кто использует Cairngorm?
Обновления по статьям, новые ссылки:
http://flash-ripper.com/archives/002194.php
Слайд 25Развитие PureMVC: Мультитон
Multiton вместо Singleton
http://en.wikipedia.org/wiki/Multiton_pattern
Мультитон – паттерн, подобный Синглтону, позволяющий создание более
![Развитие PureMVC: Мультитон Multiton вместо Singleton http://en.wikipedia.org/wiki/Multiton_pattern Мультитон – паттерн, подобный Синглтону,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-24.jpg)
одного экземпляра класса.
Вместо Одиночки – группа Одиночек, доступных по ключам (экземпляров).
Клиенты не могут добавлять ключи.
Никогда не возвращает пустую ссылку.
Польза: упрощение работы с общими ресурсами в приложении (shared objects).
Централизованный доступ к хранилищу.
Слайд 26Пример использования PureMVC
- в приложении карты -
![Пример использования PureMVC - в приложении карты -](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-25.jpg)
Слайд 27Обновление карты-1: Вид
Класс MapView (boundary)
package view
{
public class MapView extends Sprite
{
private function
![Обновление карты-1: Вид Класс MapView (boundary) package view { public class MapView](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-26.jpg)
updateMap():void
{
mapMediator.onBBoxChanged(layersToLoad);
}
}
}
Слайд 28Обновление карты-2: Медиатор
Класс MapMediator
package view
{
public class MapMediator extends Mediator
{
internal function
![Обновление карты-2: Медиатор Класс MapMediator package view { public class MapMediator extends](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-27.jpg)
onBBoxChanged(layersToLoad: Array): void
{
var noteBBoxUpdate: Notification = new Notification(ApplicatonFacade.NOTE_BBOX_UPDATE);
noteBBoxUpdate.setBody(layersToLoad);
facade.notifyObservers(noteBBoxUpdate);
}
}
}
Слайд 29Обновление карты-3: Фасад
Класс ApplicationFacade
package
{
public class ApplicatonFacade extends Facade implements IFacade
{
public static
![Обновление карты-3: Фасад Класс ApplicationFacade package { public class ApplicatonFacade extends Facade](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-28.jpg)
const NOTE_BBOX_UPDATE: String= "noteBBoxUpdate";
// Commands registration
override protected function initializeController(): void
{
super.initializeController();
// Layer Model.updatePatchesInRectangle
registerCommand(NOTE_BBOX_UPDATE, UpdateBBoxCommand);
}
}
}
Слайд 30Обновление карты-4: Команда
Класс UpdateBBoxCommand
package controller
{
public class UpdateBBoxCommand extends SimpleCommand
{
override public
![Обновление карты-4: Команда Класс UpdateBBoxCommand package controller { public class UpdateBBoxCommand extends](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-29.jpg)
function execute(note: INotification): void
{
ApplicatonFacade.msProxy.updateMap(note.getBody() as Array);
}
}
}
Слайд 31Обновление карты-5: Прокси
Класс MapServerProxy
package model
{
public class MapServerProxy extends Proxy
{
public function updateMap
![Обновление карты-5: Прокси Класс MapServerProxy package model { public class MapServerProxy extends](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-30.jpg)
(layersToLoad:Array):void
{
mapModel.loadLayers(layersToLoad);
}
}
}
Слайд 32Обновление карты-6: Модель
Класс MapModel
package model
{
internal class MapModel
{
internal function loadLayers (arrLayersToLoad:Array):void
{
// собственно
![Обновление карты-6: Модель Класс MapModel package model { internal class MapModel {](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-31.jpg)
загрузка данных
}
}
}
Слайд 33PureMVC спешит на помощь
Рефакторинг 1: Смена источника данных с Geo XML на
![PureMVC спешит на помощь Рефакторинг 1: Смена источника данных с Geo XML на AMF](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-32.jpg)
AMF
Слайд 34PureMVC помогает еще раз
Рефакторинг 2. Древовидный рендеринг карты.
Смена сигнатуры метода
Было: private function
![PureMVC помогает еще раз Рефакторинг 2. Древовидный рендеринг карты. Смена сигнатуры метода](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-33.jpg)
renderGeoEntity(data: FlashGeoEntity): void
Стало:
private function renderGeoEntity(): void // после initGeoEntity
Переход от Спрайтов к Шейпам
Откат на Спрайты☻
Слайд 355 советов по PureMVC
Используйте Медиаторы: создавайте API для компонентов вида в Медиаторах,
![5 советов по PureMVC Используйте Медиаторы: создавайте API для компонентов вида в](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-34.jpg)
а не используйте их методы напрямую.
Используйте Оповещения почаще (но не напрямую от Медиатора к Прокси).
Используйте Команды и МакроКоманды.
Используйте Remote Proxy.
Используйте Value Objects (VO).
Слайд 36Почему проект выжил
Благодаря разделению кода с самого начала
Благодаря разделению кода с самого
![Почему проект выжил Благодаря разделению кода с самого начала Благодаря разделению кода](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/474906/slide-35.jpg)
начала
Благодаря разделению кода с самого начала
Благодаря разделению кода с самого начала
Благодаря разделению кода с самого начала
Благодаря разделению кода с самого начала
Благодаря разделению кода с самого начала
Благодаря разделению кода с самого начала
Благодаря разделению кода с самого начала
Благодаря разделению кода с самого начала
Благодаря разделению кода с самого начала
Благодаря разделению кода с самого начала