![]() |
Вопрос об архитектуре приложения
Всем привет.
Например, у меня есть основной класс документа Main, где пишу весь основной скрипт. В него вложена некая панель BlackList. В панель вложено множество кнопок ItemBlackList. Вопросы такие: 1. Правильно ли, что я в классе ItemBlackList подписываюсь на события MOUSE_OVER и MOUSE_OUT, а CLICK слушаю в его родительском классе BlackList ? Как я понимаю - дочерний объект не должен влиять на родителя. Как правильно разграничить действия между родителем и дочерними объектами - что должен знать родитель, а что его ребенок? 2. По нажатию на любой из ItemBlackList, в файл blacklist.xml должны записываться некие данные. Но этот XML файл подгружен в классе Main. Как правильнее делать - передавать данные через всю цепочку ItemBlackList -> BlackList -> Main ?? Или же Main не обязан знать что нужно делать с файлом, а всю работу с файлом должен брать на себя класс BlackList ?? Не знаю - правильно ли делать так? И как в данном случае, например, узнать, какая из множества кнопок была нажата? Класс Main: Код AS3:
Код AS3:
|
Вам не обязательно думать, что должен знать родитель, а что ребёнок.
Достаточно просто представить проект как список объектов/компонентов. Вы пользуетесь ихними методами и свойствами и вас абсолютно не интересует, как они устроены внутри. Например, вы хотите добавить чекбокс. Напишите чекбокс(поле с галочкой), чтобы его можно было использовать вот так в любом проекте: Код AS3:
Да, вполне логично, что Цитата:
PHP код:
Можно в BlackList отправлять событие, что была нажата кнопка и сохранять какая именно кнопка в публичную переменную. Main пусть слушает BlackList и изменяет xml. |
Допустим есть три кнопки. По нажатию на первую рисуем квадрат, на вторую - треугольник, на третью - круг.
На Main addChild спрайт. А уже на этот спрайт addChild панель. Спрайт подписывается на события панели и рисует фигуры. PanelEvents.DRAW_SQUARE PanelEvents.DRAW_TRIANGLE PanelEvents.DRAW_CIRCLE Кнопка сама себя подписывает на CLICK. При клике диспатчит одно из событий панели. Либо панель подписывает конкретную кнопку на CLICK (но не себя). При клике диспатчит одно из событий панели. P.S. Но если вам нужно в xml гнать просто текст на кнопке. То можно и саму панель подписать на клик. Код AS3:
|
Как быть, если, например, вложенность намного больше и на самом главном уровне нужно ловить событие самого последнего вложенного объекта? На каждом уровне подписываться на событие ребенка и диспатчить его для родителя?
|
Можно ловить событие, когда оно в фазе захвата.
Третий параметр в addEventListener(). Код AS3:
Код AS3:
|
Лучше, конечно же, продумывать приложение иерархически, чтобы Императору не приходилось звонить каждому солдату в окоп и уж тем более наоборот. Разделяйте ответственность, назначайте командиров, устанавливайте порядок и направление отчетности. У каждого должна быть своя зона ответственности, и она определяется еще на уровне выделения Класса как сущности. В мире флэш это конечно немного не так абстрактно, из-за обилия визуальных объектов возникает некая растерянность, к кому/к чему "привязывать" логику. Надо всё же как-то разделить действия, ответственность, чтобы кнопка "только нажималась", панель кнопок "только сообщала о выборе", а решения принимал тот, кто эту панель кнопок и создал для интерфейса с пользователем. Если у Вас Мейн должен знать все о какой-то тридевятой кнопке в тридесятом контейнере, значит Вы не разделили ответственность по объектам и Мейн перегружен. Ему нужны министры, а министрам — менеджеры, организовывающие персонал. Создавайте цепочки иерархии, компануйте однотипные задачи, не валите все в одну кучу Мейн.
|
Цитата:
Пример: В библиотеке Starling есть хранилище ассетов. Я кладу этот объект в глобальную переменную потому что мне придется обращаться к этому хранилищу много где. new MovieClip(globalAssetStore); Можно передавать этот assetStore в конструкторы, которые передадут этот объект во вложенные конструкторы. Но код становится нечитабельным. |
Цитата:
Кнопка не знает ничего о панели, она лишь знает свою функцию. Можно вызывать callBack() внутри кнопки, на который сделать сеттер onClick = someFunc; Но колбеки делают код неоднородным, а поэтому лучше подписываться на клик в двух местах - снаружи кнопки для того, чтобы знать, когда менять xml и внутри кнопки, чтобы к примеру менять визуальное отображение и состояние. Предлагаю сделать ещё интересней, Код AS3:
Код AS3:
|
to djken, я ошибся, надо делать как SuriTheAngel говорит.
Добавлено через 1 час 30 минут SuriTheAngel Мне кажется пусть лучше панель свои кнопки создает. Какие преимущества есть у твоего подхода? |
PHP код:
Преимущества. Даже лень перечислять... 1) Можно эту же панель не переписывая использовать в любых других проектах, ведь кнопки создаются через методы addButton() и удаляются через removeButton() снаружи панели. 2) Логично, что панель выполняет лишь свои функции - является панелью, в которую можно добавить кнопки или удалить из неё кнопки. 3) Логично, что кнопки являются кнопками и выполняют лишь свою функцию, не меняют никаких xml. 4) Конечно, В КРАЙНЕМ СЛУЧАЕ, НУ ВДРУГ НУ ВООБЩЕ ППЦ КАК НАДА БУДИТ, можно создавать кнопки в панели, используя её же методы из конструктора =) Для справки) 5) Скачав классы Panel, Button не нужно лезть внутрь этих классов, чтобы знать как ими пользоваться. Достаточно написать var panel:Panel = new Panel(); напишите panel. И среда(FlashDevelop) сама подсказывает, какие есть методы у этого класса. И из их названий точно и ясно, что они делают. addButton() в переводе значит "добавить кнопку", для справки. removeButton() в переводе "убрать кнопку". набор передаваемых аргументов тоже достаточно ясно описан и подсказывается средой=) взгляните на код Код AS3:
Поэтому мы пишем набор инструментов, подобно классу Button(кнопка) или Panel(панель). При желании можно добавить классу Panel свойство orientation и 2 константы - Panel.HORIZONTAL, Panel.VERTICAL. Они будут определять, как будут располагаться кнопки - горизонтально или вертикально. Вот так вот мы и работаем) Улучшаем наши инструменты потихоньку. Потом мы можем в любой проект сунуть эти классы и они будут работать. Чтобы не копаться в их коде, мы пишем снаружи все обработчики кликов и пользуемся их свойствами и методами. P.S. Если хотите проверить, как будет работать код - могу ещё дописать класс Button :) |
| Часовой пояс GMT +4, время: 20:42. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.