Ivan Shaban - Robotlegs 2+
-
Upload
flash-conference -
Category
Engineering
-
view
1.077 -
download
0
Transcript of Ivan Shaban - Robotlegs 2+
![Page 1: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/1.jpg)
Построение гибкой архитектуры приложения с использованием
фреймворка
Robotlegs 2
![Page 2: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/2.jpg)
Чего мы хотим?
Фреймворк или библиотека это всего лишь инструмент...
![Page 3: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/3.jpg)
override public function prepare() : void {registerCompleteCallback(onComplete);
add(InitSocialConnectionCommand);add(InitServerConnectionCommand);add(GetOwnProfileCommand);
add(GetFriendsProfilesCommand).withPayloads(userModel.gpUserID);add(GetBalanceCommand);
add(LoadAssetsCommand); ...}
private function onComplete(success : Boolean) : void {…
}
...Простое оформление сложной логики
![Page 4: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/4.jpg)
...Простое и понятное API[Inject]public var сommandMap : IEventCommandMap;[Inject]public var mediatorMap : IMediatorMap;[Inject(name=”privateInjector”)]public var injector : IInjector;…commandMap.map(CoreEvent.BUY_ITEM).toCommand(BuyItemCommand).withGuards(EnoghMoneyGuard);commandMap.map(CoreEvent.BUY_ITEM).toCommand(ShowBuyCoinsPopupCommand).withGuards(NotEnoghMoneyGuard);...injector.map(Model).asSingleton();injector.map(Model).toSingleton(ConcreteModel);injector.map(Model).toValue(new Model());injector.map(IModel).toType(ConcreteModel).seal();…mediatorMap.map(IBottomBar).toMediator(BottomBarMediator);mediatorMap.map(SettingsView).toMediator(SettingsMediator).autoRemove(false);
![Page 5: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/5.jpg)
...Легкое расширение функционала
● модульность
● внедрение зависимостей
● низкая связанность компонентов
● переиспользование кода
![Page 6: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/6.jpg)
Основные плюсы и возможности:
● модульность
● гибкий и понятный синтаксис
● удобная и простая система внедрения зависимостей
● удобная система расширений
● нет привязки к конкретной реализации сущностей
● унифицирующий стиль разработкиНебольшой минус:
● фреймворк не быстрый
![Page 7: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/7.jpg)
![Page 8: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/8.jpg)
[Inject(name=”...”, optional=”true”)]public var myInstance:MyInstanceClass
илиIInjector#getInstance(class, name=””);
![Page 9: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/9.jpg)
Когда доступно:
public class MyInstanceClass { [Inject] public var variable:Number;
public function MyInstanceClass() { // not ready }
[PostConstruct] public function initialize():void { // ready }}
![Page 10: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/10.jpg)
[PreDestroy]при анмаппинге или же при вызове
IInjector#destroyInstance()
![Page 11: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/11.jpg)
Создание правил внедрения зависимостей (Mapping)
![Page 12: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/12.jpg)
...Примеры маппинга
commandMap.map(CoreEvent.BUY_ITEM).toCommand(BuyItemCommand).withGuards(EnoghMoneyGuard).once();commandMap.map(CoreEvent.BUY_ITEM).toCommand(ShowBuyCoinsPopupCommand).withGuards(NotEnoghMoneyGuard);...injector.map(Model).asSingleton();injector.map(Model).toSingleton(ConcreteModel);injector.map(Model).toValue(new Model());injector.map(IModel).toType(ConcreteModel).seal();…mediatorMap.map(IBottomBar).toMediator(BottomBarMediator);mediatorMap.map(SettingsView).toMediator(SettingsMediator).autoRemove(false);
![Page 13: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/13.jpg)
...Список основных сущностей
● context● config / extension / bundle● view● mediator● command● model● service● guard
![Page 14: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/14.jpg)
Context
● инициализация фреймворка
● удаление фреймворка
● предоставление общей шины
_context = new Context().install(MVCSBundle).configure(MainConfig, NativeConfig, StarlingConfig).configure(
new robotlegs.starling.extensions.contextView.ContextView(Starling.current),new robotlegs.bender.extensions.contextView.ContextView(this))
![Page 15: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/15.jpg)
Configs
● место для маппинга
![Page 16: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/16.jpg)
Extensions
● предоставляет расширение функционала фреймворка
- поддержка старлинга, сигналов, модульности и т.д.
![Page 17: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/17.jpg)
Bundles● Набор расширений, описанных в одном файле.
public class MVCSBundle implements IBundle{ public function extend(context:IContext):void { context.logLevel = LogLevel.DEBUG;
context.install( ContextViewExtension, EventDispatcherExtension, ModularityExtension, DirectCommandMapExtension, EventCommandMapExtension, LocalEventMapExtension, ViewManagerExtension, StageCrawlerExtension, StageSyncExtension);
context.configure(ContextViewListenerConfig); }}
![Page 18: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/18.jpg)
Views
● нет конкретной реализации
● рендеринг на основе входящих данных
● предоставляет API
● ничего не знает об устройстве приложения, все данные получает из медиатора
● может только отправлять события-оповещения для медиатора
● ссылки на вью имеют только другие вью или медиатор
● может иметь несколько медиаторов за раз
![Page 19: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/19.jpg)
Mediators
● работает только с одним экземпляром вью за раз
● можно мапить на интерфейс или на несколько классов вью
● создается автоматически при добавлении вью в дисплей лист
● удаляется при удалении вью из дисплей листа (можно отключить)
● служит для связи вью и остальных компонентов приложения
● не имееет никакой постронней логики
● может дергать модели и сервисы напрямую
● может слушать и посылать события от\в приложение
● нельзя получить прямую ссылку на медиатор
![Page 20: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/20.jpg)
Commands
● нет привязки к конкретной реализации
● запускаются в ответ на события из общей шины
● предназначены для выполнения какого то одного действия
● создаются, выполняют действие, удаляются
● нельзя получить ссылку на команду
● содержат бизнес логику
● могут дергать модели и сервисы, запускать другие событие
● не могут слушать события приложения
![Page 21: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/21.jpg)
Models
● инкапсуляция данных и предоставление API для доступа к ним
● могут диспатчить события в приложение
● не могут слушать события от приложения
● не должны содержать лишней логики
![Page 22: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/22.jpg)
Services
● сущности для работы с внешними сервисами
● не хранят данные
● могут парсить данные
● могут диспатчить события в приложение
● не могут слушать события от приложения
![Page 23: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/23.jpg)
Guards
● используются для предотвращения создания или выполнения чего либо
● нет привязки к конкретной реализации
● нельзя получить ссылку на гуард
● применяются те же инджекты что и для основной цели
● выполняется непосредственно перед созданием основной цели
● если гаурд не одобряет то основная цель не создается
● мгновенны, асинхронных гуардов пока что нет
● на момент запуска гуарда, все данные должны быть доступны в приложении
![Page 24: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/24.jpg)
А теперь все вместе!
делите свой код на более мелкие части по зонам ответственности
![Page 25: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/25.jpg)
Что почитать:
● http://knowledge.robotlegs.org/
● https://github.com/robotlegs/robotlegs-framework
● https://github.com/robotlegs/swiftsuspenders
● https://github.com/alebianco/robotlegs-utilities-macrobot
● https://github.com/robotlegs
● ActionScript Developer's Guide to Robotlegs
![Page 26: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/26.jpg)
Спасибо!
![Page 27: Ivan Shaban - Robotlegs 2+](https://reader030.fdocument.pub/reader030/viewer/2022033105/5882069d1a28abf05e8b5b85/html5/thumbnails/27.jpg)
Вопросы?