Flash Ripper RSS Readers

Фасад (Façade) — ядро и лицо фреймворка PureMVC

Продолжаю описание флэш-фреймворка PureMVC рассказом о центре системы—Фасаде.

Внимательный читатель заметил, что в первой части "Архитектура и ключевые фигуры фреймворка PureMVC", в поименном перечислении членов фреймворка не были названы фундаментальные части MVC, чья необходимость самоочевидна: Model, View и Controller.

Там же мы узнали, что Фасад (Façade) — это участник, предоставляющий членам системы MVC прозрачный взаимный доступ друг к другу.

Наличие Фасада и есть причина отсутствия "Model", "View" и "Controller" в списке членов PureMVC. Дело в том, что Фасад "прячет" за собой эти части фреймворка, обеспечивая им взаимную видимость "сквозь фасад". Это так же прозрачно и для разработчика приложения. Конкретно, для разработчика-пользователя PureMVC это означает, что вы не обязаны явным образом создавать экземпляры этих трех ключевых классов: они строятся автоматически при создании Фасада. Разработчик создает один экземпляр класса Facade, а в дальшейшем все участники системы используют Фасад как централизованную точку доступа друг к другу.

Структура Фасада в PureMVC


Фасад в PureMVC является классом типа Синглтон (или Одиночка: класс, гарантирующий создание не более чем одного своего экземпляра и доступ к нему). Код Фасада состоит из таких блоков:
  1. Объявление имен Оповещений (Notifications) приложения. Задаются как статические константы типа static const NOTE_APP_INIT: String = "noteAppInit".
  2. Реализация Синглтона: метод getInstance, возвращающий ссылку на единственный экземпляр класса Façade.
  3. Регистрация Команд приложения: метод initializeController, регистрирующий в Контроллере все используемые в приложении Команды.

Зачем в PureMVC нужны Оповещения и Команды


Оповещения (Notifications) используются как микро-операции для взаимодействия каждого члена фреймворка PureMVC с остальными его членами. Это — "атомы" взаимодействия элементов PureMVC друг с другом. Например: некий Заместитель (Proxy), закончив обработку своих данных, создает соответствующее Оповещение. Фасад рассылает это Оповещение заинтересованному(ым) Медиатору(ам), который(е) эти данные отображает(ют) в нужном виде, а также может выполнить Команды, на это Оповещение зарегистрированные.

Команды же используются как макро-операции, руководящие работой системы в целом. Их деятельность можно уподобить действиям дирижера. Например, команды могут координировать последовательность действий при инициализации или закрытии приложения.
Каждая команда — это часть Контроллера. Фасад знает о Контроллере и дает прозрачный доступ к каждой Команде; таким образом, разработчик оперирует не самим Контроллером, а его представителями—Командами.

Фасад — структурное ядро приложения PureMVC


Итак, Фасад (Façade) как ядро системы PureMVC:
  1. Обеспечивает набор элементарных микро-частиц обмена информацией между членами PureMVC. Это Оповещения (Notifications).
  2. Строит костяк макро-управления работой приложения. Это Команды (Commands).

В следующей части — о том, как обмениваются Оповещениями участники PureMVC.

Вопрос: понятно ли я излагаю? Что следует уточнить, а на что дать ссылки?

Писал Rost, 29 Октябрь 2007 16:30

Найдены баги:

Рост, думаю что большое количество читающих твой блог, мало что поняли в этом посте. Признаюсь, сам сообразил не с первого раза о чем тут говориться, хотя GoF перечитывал этим летом. Тема довольно сложная для понимания. ИМХО: нужно более подробно останавливаться на каждом паттерне.

Кроме того, почему выбран для иллюстрации фреймворк PureMVC? ИМХО: его реализация довольно спорная. Взять тот же Фасад, обычно его используют, чтобы поделить программу на структурные блоки, чтобы каждый из этих блоков предоставлял общий интерфейс для элементов, которые в нем находятся, но никак не для того, чтобы обеспечить возможность взаимодействия всех элементов, находящихся в блоке, друг с другом.

Garbage Collector - 29 Октябрь 2007 19:13

Да, фасад тут явно сильно перегружен - много всего на один функциональный элемент повешено.

Классно что взялся за эту тему! Интересно было бы и про другие фреймворки почитать в твоей интерпретации :)

Racer - 29 Октябрь 2007 21:48

Да, создается впечатление, что Фасад действительно функционально перегружен.

Однако фраза "команды могут координировать последовательность действий при инициализации или закрытии приложения." наталкивает на мысль о типовом решении "Единица работы" по Фаулеру :) Регистрируя такие "единицы работы" в "Реестре" можно попытаться разгрузить фасад, делегировав часть рутины "Единицам работы" (напр. регистрация слушателей, оповещение слушателей, фабричное изготовление компонент)

Плюс можно частично делегировать некоторые операции по инициализации компонент, отлову исключений типовому решению "Intercepting Filter" (Фаулер)

Отличная статья, спасибо, Рост :)

Dimchansky - 30 Октябрь 2007 11:57

Да я бы не сказал, что просто перегружен функционал Фасада. Тут явный пример непонимания назначения этого паттерна. Вообще Фасад - это, пожалуй, самый часто используемый паттерн, просто мало кто об этом задумывается. Простой пример: делаете вы машинку для игры, определяете классы частей, из которых эта машинка будет состоять, налаживаете взаимодействие между этими частями и объединяете все эти части в единый комплекс, посредством включения этих частей в состав класса Car. Теперь вам не придется взаимодействовать с каждым элементом, из которых состоит машинка, напрямую вы работаете только с интерфейсом класса Car. А уже сам Car, реагируя на ваши действия, заставляет свои составные части что-то делать.

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

Т.е. мы не обращаемся теперь к каждому из четырех колес, повернись-мол на такой-то угол и вращайся с такой-то скоростью, а просто задаем текущее значение скорости и угол поворота для всей машины. И теперь сама машина должна задать нужный угол поворота и скорость вращения для каждого колеса.

Тем более почему Фасад должен быть синглетоном, я не понимаю. Разве в нашем случае имеет смысл запрещать создание 2 и более экземпляром машинки? Конечно же нет. Меня мучают подозрения, что авторы PureMVC недопонимают назначение паттерна Одиночка. Скорее всего разработчики воспользовались этим паттерном только для того, чтобы обеспечить глобальных доступ к Фасаду из любой точки приложения. Но это в корне не правильно. Одиночка нужен совсем не для того. Он нужен только для того, чтобы в программе не создавалось более одного экземпляра какого-либо класса. Обеспечение глобальной точки доступа - это уже второстепенная его задача.

Garbage Collector - 30 Октябрь 2007 19:21

Забыл упомянуть, что Car в предыдущем примере и есть образец паттерна Фасад.

Garbage Collector - 30 Октябрь 2007 19:24

>> Забыл упомянуть, что Car в предыдущем примере и есть образец паттерна Фасад.

Ничего, из контекста это сразу было понятно.

Отличный комментарий, Юр! Да, Фасад в PureMVC - не традиционный. Хотя — как посмотреть. В данном случае этот Фасад является окном видимости - потому и Фасад, и в то же время он глобален для всей системы - потому и Одиночка, так как приложение одно.

Кстати, наколько я помню, Макс Грынив когда-то сильно нарекал на Синглтонность ModelLocator в Cairngorm. Фасад PureMVC - это его тезка, но имеет радикально другой характер.

Рост - 30 Октябрь 2007 19:38

Побуквоедствую;)
Рост, а откуда в слове Facade у буквы "c" появилась cedilla?
В английском языке её нема, да и в книгах GoF фасад тоже простым английским словом обзывают.

Max Degtyarev - 3 Ноябрь 2007 4:12

Max Degtyarev™, я сам задался таким вопросом — откуда хвост у этой буквы ç. В Википедии приводят два варианта - с хвостом и без. Автор PureMVC выбрал хвост. Я ему следую. Хотя это не очень удобно в латинице. Но у нас есть русский язык, в котором Фасад без хвоста как ни крути Ж-)

Рост - 3 Ноябрь 2007 14:06

Юра, кстати, в той же Википедии увидел, что тамошнее определение Фасада вполне подходит под данный случай его иcпользования в PureMVC — с той оговоркой, что в PureMVC его стоит назвать Центральным Фасадом - вчера написал об этом.

Рост - 3 Ноябрь 2007 14:10

Dimchansky™

>> Да, создается впечатление, что Фасад действительно функционально перегружен.

На самом деле - нет. Думаю, многое станет яснее, когда пойдут примеры конкретного приложения (их будет даже два). Прошу дождаться их. Очень хочу изложить суть фреймворка последовательно (Кстати, не так уж много осталось излагать).

По поводу "единицы работы" - очень интересно. К своему стыду, именно этого я у Файлера еще не читал; обещаю наверстать, так как тема очень инетерсная. Мне кажется, что организация Команд (или Оповещений?) внутри PureMVC близка к подходу "Единиц Работы".

Рост - 3 Ноябрь 2007 14:15

>> Кроме того, почему выбран для иллюстрации фреймворк PureMVC?

Юр, причина очень простая: уже два месяца с ним работаю. Доволен. Давно хочу рассказать, но не считал правильным рассказывать о фреймвоке, не сделав на нем хотя бы одного серьезного проекта. И вот - это время пришло.

Что я в ПьюрМВЦ очень полюбил - так это его компактность, простоту и произносимое имя :)

Рост - 3 Ноябрь 2007 14:17

Очень интересная структура, но применима ли она для больших проектов?

Большой проект необходимо разделять на модули, как это сделать сдесь ведь в основе проекта сингелтоны

Не будет ли например View одного модуля конфликтовать с другим?
ведь медиаторы по сути добавяться к одному и тому же View?

OX - 9 Ноябрь 2007 11:35



Это запись из категории 'PureMVC'. 10 еще cвежих:

Архивы по категориям:

3D-18, Adobe AIR-30, Animation-1, Apache Ant-1, Architecture-1, ARP-1, Art-25, Articles-26, AS3-52, Books-7, Business-3, Cairngorm-2, CI-1, Classes-10, Coding-30, Community-113, Components-19, Contests-28, Cool-Job-5, Debug-18, Design-26, Development-84, EMO-1, Events-13, Extensions-2, FAQ-8, FDS-1, Flash and html-5, Flash Player-35, Flash Updates-8, Flash-scene-1, flash10-4, FlashLite-2, Flex-30, Flex 2-80, Flickr-1, FMS-1, FPUG-46, frameworks-1, Games-11, Good Job!-35, HaXe-14, Health-2, Humor-10, Ideas-13, JavaScript-1, Job-26, JSFL-8, Links-2, Linux-1, Maps-1, Math-8, Money-11, MXML-1, Open Source-15, Optimization-2, Patterns-2, Personalities-27, Politics-1, Preloading-3, Productivity-9, PureMVC-10, Pv3d-1, Rafpug-4, Red5-3, Remoting-11, Resources-21, Ruby-6, SAAS-1, Security-11, SEO-8, Silverlight-5, Sound-3, Strategy-120, Tamarin-1, Tools-113, Training-2, Trash-8, URAFPUG-13, Urgent-1, Usability-6, Video-6, VoIP-5, Wallop-1, Wishlist-2, Архив всех записей (большой)

За последние месяцы:

Июл 2008: Международная встреча разработчиков URAFPUG завершена, URAFPUG - трансляция студии Flex-фреймворка Mate, весь Июл

Июн 2008: Попытка предварительных выводов о встрече аниматоров, Онлайн трансляция встречи аниматоров в Донецке, весь Июн

Май 2008: Если 3D, то по-взрослому: официальный запрос в Adobe по поводу контроля над мип-маппингом. Нужна ваша поддержка!, В этом году «Russian Flash Awards» пройдет в «космическом стиле», весь Май

Апр 2008: Программирование под флэш платформу. Cтатья (местами спорная), Advanced Flash Components бесплатно раздает все свои AS2-компоненты, весь Апр

Мар 2008: Зарплаты программистов в 2007 году, FlashPhone как технология года? Технология года? В Рунете?, весь Мар

Фев 2008: ЙА ФПУГ — регистрация на первую встречу UAFPUG продолжается, Закулисы Flex и секрет успеха опенсорс-проекта, весь Фев





Примечания:
Статус документа
: в процессе
   2002-2007 Производство: Рост Прибыли · О проекте · Подписка на новости (RSS)