Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Еще один вопрос по архитектуре (http://www.flasher.ru/forum/showthread.php?t=145629)

Vier 14.10.2010 17:25

Еще один вопрос по архитектуре
 
Архитектура - это громко сказано, но все-таки.
Я не часто программирую на as, но каждый раз меня очень смущает получающаяся цепочка событий.
То есть, загружаем какой-то мувик. Он подгружает xml, конец загрузки xml стартует загрузку, например картинок, загрузка картинок стартует какие-то эффекты итд итп. То есть цепочка бывает довольно большая? и когда я спустя неделю возвращаюсь к проекту, довольно тяжело распутывать все эти зависимости кто кого стартует.

Я подозреваю, что есть способ как-то аккуратнее все это организовать. Интересно было бы узнать.

random13 14.10.2010 17:52

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

incvizitor 14.10.2010 17:59

Vier, вот и я, когда только начинал немного разбираться в AS3, хотел составить нейкие шаблоны для загрузки xml + картинки и т.д. Но, поверьте мне, всё уже проще простого, вот увидите через 2 месяца будете на автомате писать эти 2-3 метода за 2 минуты))

Добавлено через 1 минуту
Киньте может код для примера? Подскажем что где заоптимизировать или упростить (если есть что :) ).

Division 14.10.2010 18:33

Я решал такое создав набор классов, реализующий очередь действий.
Есть класс, реализующий загрузку XML и класс, загружающий картинки.
Код AS3:

Actions.instance.addAction(new GetXmlAction(XML_URL));
Actions.instance.addAction(new LoadImagesAction(), true);
Actions.instance.start();

Таким образом LoadImagesAction может принимать в качестве параметров загруженный XML.
Все действия выполняются последовательно, в порядке добавления.

Не сказал бы что при таком решении становится намного проще (:

random13 14.10.2010 18:40

Цитата:

Сообщение от Division (Сообщение 942729)
Я решал такое создав набор классов, реализующий очередь действий.
Есть класс, реализующий загрузку XML и класс, загружающий картинки.
Код AS3:

Actions.instance.addAction(new GetXmlAction(XML_URL));
Actions.instance.addAction(new LoadImagesAction(), true);

Таким образом LoadImagesAction может принимать в качестве параметров загруженный XML.

Не сказал бы что при таком решении становится намного проще (:

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

хотя это плодит в данном случае новые сущности

Division 14.10.2010 18:44

Не совсем рефакторинг, скорее подход такой к созданию логики приложений (: Не всегда оправдано, но местами удобно.

Vier 14.10.2010 19:09

Спасибо всем, да придется тогда лучше структурировать самому )

Пример кода вечером скину. Я уверен, что где-то я неправильно пишу.

Life_Master 14.10.2010 20:33

Division, хм... интересно, а по-подробнее о таких классах можно...

inozemcev 14.10.2010 21:43

можно класс написать который принимает ссылку на xml и диспечеризирует событие с массивом уже загруженных файлов.

expl 14.10.2010 21:48

Цитата:

Actions.instance.addAction(new GetXmlAction(XML_URL));
Надо же, у нас тоже асинхронные команды Action-нами называются
Только синглтон здесь нафиг не нужен - делаем асинхрнонную команду MacroAction,
принимающую список асинхрнонных команд - и запускаем ее, можно делать вложенные списки комманд

Там где логика ветвится - например в одном случае надо запускать одну цепочку - в другом другую - в акшене просто запускаем либо однин MacroAction, либо другой

Где цепочка строго определена (у нас только в лоадере основной swf-ки используется) - можно подобием конвеера Потапенко воспользоваться, в других случаях он слишком НЕгибок.

Но интуиция подсказывает, что обилие цепочек свидетельствует о хреново продуманной архитектуре - надо разруливать как-то по другому.
(комманда - это всетки не эквивалент реального объекта)

Psycho Tiger 14.10.2010 21:59

Division, у Вас addAction принимает экземпляр какого-то объекта. Как Вы узнаете, что делать - грузить из хмл, грузить картинку, грузить и парсить хмл? Информация о поведении хранится в передаваемых экземплярах классов?

dimarik 14.10.2010 22:47

Воспользуйтесь классом Conveyor Евгения Потапенко.

Vier 15.10.2010 01:11

Знаете чего мне не хватает.
Допустим, мне нужно скачать xml, вытащить url картинки, скачать картинку, положить ее в мувик.
Сейчас я делаю это так: создаю какой-нибудь метод типа init(), он запускает загрузку, создаю метод, который должен стартовать, когда загрузится xml, в нем я разбираю xml. После чего начинаю грузить фотку. Опять же, создаю метод который, ловит окончание загрузки. В котором, наконец, получаю картинку.
В итоге, получаю 3 последовательно стартующих функции. Не знаю почему, но мне неудобно от такой асинхронности.
Я хочу так: init() в нем сделали лоад, в следующей строчке работаем с уже готовым лоадером, то есть основной поток ждет пока лоадер загрузится, потом грузим картинку и вставляем ее в спрайт. Получается один метод, который вызывает последовательно три других. Так мне было бы удобнее.

TanaTiX 15.10.2010 02:23

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

expl 15.10.2010 02:36

Цитата:

Division, у Вас addAction принимает экземпляр какого-то объекта. Как Вы узнаете, что делать - грузить из хмл, грузить картинку, грузить и парсить хмл? Информация о поведении хранится в передаваемых экземплярах классов?
Дык класс, передаваемый в addAction - это комманда по сути, только асинхронная, у нее в методе execute() прописано что делать, ну еще она должна колбек вызывать или событие посылать по завершению.

Vier 15.10.2010 02:48

Цитата:

Сообщение от TanaTiX (Сообщение 942819)
Ну так создайте лоадер, добавьте его в заранее приготовленный спрайт (если его наличие принципиально) и далее в эту конструкцию грузите что хотите. Наверное правильнее это было бы все в отдельном классе организовать. При этом лоадер у нас на сцене, он DisplayObject, отображается, может менять свои координаты и пр.

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

Котяра 15.10.2010 03:10

Тоже пользуюсь addAction/ execute для отложенных действий.
Следующее действие начинаю по событию ACTION_END.
Cами Action являются частью контроллера, т.е. в execute могут менять модель, либо напрямую менять вьюшки. Нечто вроде Command в pureMVC.

Conveyor всё же немного не то..

Division 15.10.2010 11:51

Цитата:

Division, у Вас addAction принимает экземпляр какого-то объекта. Как Вы узнаете, что делать - грузить из хмл, грузить картинку, грузить и парсить хмл? Информация о поведении хранится в передаваемых экземплярах классов?.
expl верно подметил, все так и есть. Только у меня еще команда может записывать какие-то данные в Object-результат (Полученный XML, к примеру). Этот Object может передаваться параметром в метод execute следующего action.

PS насчет синглтона - да, наверно вариант expl с MacroAction более удобный. Я таким способом команды не юзал, поэтому сделал синглтоном.


Часовой пояс GMT +4, время: 00:15.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.