« flex-coding-guidelinesПубличные переменные...это зло »

Пример неудачного, использования CairngormEventDispatcher

Краткое описание действующих лиц.

Паттерны программирования
http://en.wikipedia.org/wiki/Design_pattern_(computer_science)
http://zeus.sai.msu.ru:7000/SE/project/pattern/index.shtml
http://www.exciton.cs.rice.edu/JavaResources/DesignPatterns/singleton.htm
http://www.csc.calpoly.edu/~dbutler/tutorials/winter96/patterns/

J2EE (Java 2 Enterprise Eddition)
http://ru.sun.com/java/j2ee/index.html
http://www.codenet.ru/webmast/java/j2ee.php

J2EE Patterns
http://java.sun.com/blueprints/patterns/catalog.html
http://www.patterndepot.com/put/8/JavaPatterns.htm

Cairngorm Микро архитектурный фреймворк, основанный на J2EE паттернах, адаптированных для flex /flash (ria). Т.е. это реализация нескольких паттернов для flex и общая рекомендация о связке между ними.

CairngormEventDispatcher – Централизованный диспетчер событий, Singleton.
Позволяет послать событие из любой точки программы.

CairngormEvent – пользовательское событие, его можно переопределить для отсылки данных вместе с событием.
MyEvents.MY_EVENT – имя пользовательского события, которое ассоциируется с командой.

отсылаем событие:

  1. var theMyEvent : CairngormEvent = new CairngormEvent( MyEvents.MY_EVENT );
  2. CairngormEventDispatcher.getInstance().dispatchEvent ( theMyEvent );

Архитектура Cairngorm подразумевает, что обработка этих событий будет реализована через FrontController, который определяет соответствие событий и команд(ICommand). Другими словами, обработка реакции на события происходит централизованно.

Но существует возможность подписаться на это событие в любом месте приложения. Без использования команд и FrontController.

подписываемся на событие без использования комманд:

  1. CairngormEventDispatcher.getInstance().addEventListener ( MyEvents.MY_EVENT, MySuperHandler );

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

Но если Вы напишите достаточно много таких вызовов, то потеряете контроль над своим приложением. Особенно, если работаете в команде над общим кодом.
Первая проблема, которую я вижу, это циклический вызов. Остальные предоставлю вам найти самостоятельно, если всё же решите использовать данную конструкцию.

Bookmark this article at

Постоянная ссылка 2007-02-03 18:49:14, от agahov Email , 115 слов, Рубрики: Flex, AS3 , 4 комментариев »

4 комментариев

Комментарий от: GB [Посетитель] Email
Не сказал, что такая возможность впечатлила и меня (хотя ты на меня и намекал, наверное), "но щаз я есть очень расстроенный", короче бум править ;о))
2007-02-05 @ 15:49
Комментарий от: GB [Посетитель] Email
Подумал над исправлением. Получается обработчик события лежит не в объекте, который его ждет, а в команде, которая через МодельЛокатор меняет данные объекта ( а как же инкапсуляция? ). При этом есть еще один минус пухнет МодельЛокатор, в который приходиццо пихать ссылки на все объекты, изменяемые командами... Что ж как выход - несколько специализированных МодельЛокаторов?



Или я чего то не догоняю?
2007-02-06 @ 13:04
Комментарий от: GB [Посетитель] Email
И постоянно во рту привкус синглтонов... ;о))
2007-02-06 @ 13:07
Нет необходимости пускать все события через Cairngorm и команды.
Для простых взаимодействий достаточно стандартных событий.
Общий принцип применения команд - использовать их для действий, меняющих модель.
Тогда возможно реализовать функциональность undo, redo. Это, конечно, не панацея, возможны исключения.

В использовании нескольких Model нет ничего страшного, если данные
разделяются. Их можно ещё разбить по функциональности. Например, информация о состояниях может отделяться
от обычных данных.

Инкапсуляция это скрытие реализации. Так и получается, что команда инкапсулирует реакцию на событие.
Ты можешь менять объекты, которые выполняют команду, но это уже внутренняя низкоуровневая реализация.
2007-02-06 @ 20:20

Оставить комментарий


Ваш email адрес. (Не будет показан на сайте.)

Ваш URL будет показан.
:!: :?: :idea: :) :D :p B) ;) :> :roll: :oops: :| :-/ :( :'( |-| :>> :yes: ;D :P :)) 88| :. :no: XX( :lalala: :crazy: >:XX
(Заменить прерывания строк на <br />)
(Имя, email и сайт)
(Разрешить пользователям посылать вам сообщения (ваш email не отображается).)
3 + 2 + 7 - 1?
antispam test

Вы можете использовать OpenID чтобы предоставить ваше имя, email и url.