SlideShare a Scribd company logo
1 of 27
Построение гибкой архитектуры
приложения с использованием
фреймворка
Robotlegs 2
Чего мы хотим?
Фреймворк или библиотека это всего лишь инструмент...
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 {
…
}
...Простое оформление сложной логики
...Простое и понятное 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(NotEnoghMoneyGu
ard);
...
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);
...Легкое расширение функционала
● модульность
● внедрение зависимостей
● низкая связанность компонентов
● переиспользование кода
Основные плюсы и возможности:
● модульность
● гибкий и понятный синтаксис
● удобная и простая система внедрения зависимостей
● удобная система расширений
● нет привязки к конкретной реализации сущностей
● унифицирующий стиль разработки
Небольшой минус:
● фреймворк не быстрый
[Inject(name=”...”, optional=”true”)]
public var myInstance:MyInstanceClass
или
IInjector#getInstance(class, name=””);
Когда доступно:
public class MyInstanceClass {
[Inject]
public var variable:Number;
public function MyInstanceClass() {
// not ready
}
[PostConstruct]
public function initialize():void {
// ready
}
}
[PreDestroy]
при анмаппинге или же при вызове
IInjector#destroyInstance()
Создание правил внедрения
зависимостей (Mapping)
...Примеры маппинга
commandMap.map(CoreEvent.BUY_ITEM).toCommand(BuyItemCommand).withGuards(EnoghMoneyGuard).once();
commandMap.map(CoreEvent.BUY_ITEM).toCommand(ShowBuyCoinsPopupCommand).withGuards(NotEnoghMoneyGu
ard);
...
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);
...Список основных сущностей
● context
● config / extension / bundle
● view
● mediator
● command
● model
● service
● guard
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))
Configs
● место для маппинга
Extensions
● предоставляет расширение функционала фреймворка
- поддержка старлинга, сигналов, модульности и т.д.
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);
}
}
Views
● нет конкретной реализации
● рендеринг на основе входящих данных
● предоставляет API
● ничего не знает об устройстве приложения, все данные получает из
медиатора
● может только отправлять события-оповещения для медиатора
● ссылки на вью имеют только другие вью или медиатор
● может иметь несколько медиаторов за раз
Mediators
● работает только с одним экземпляром вью за раз
● можно мапить на интерфейс или на несколько классов вью
● создается автоматически при добавлении вью в дисплей лист
● удаляется при удалении вью из дисплей листа (можно отключить)
● служит для связи вью и остальных компонентов приложения
● не имееет никакой постронней логики
● может дергать модели и сервисы напрямую
● может слушать и посылать события отв приложение
Commands
● нет привязки к конкретной реализации
● запускаются в ответ на события из общей шины
● предназначены для выполнения какого то одного действия
● создаются, выполняют действие, удаляются
● нельзя получить ссылку на команду
● содержат бизнес логику
● могут дергать модели и сервисы, запускать другие событие
● не могут слушать события приложения
Models
● инкапсуляция данных и предоставление API для доступа к ним
● могут диспатчить события в приложение
● не могут слушать события от приложения
● не должны содержать лишней логики
Services
● сущности для работы с внешними сервисами
● не хранят данные
● могут парсить данные
● могут диспатчить события в приложение
● не могут слушать события от приложения
Guards
● используются для предотвращения создания или выполнения чего либо
● нет привязки к конкретной реализации
● нельзя получить ссылку на гуард
● применяются те же инджекты что и для основной цели
● выполняется непосредственно перед созданием основной цели
● если гаурд не одобряет то основная цель не создается
● мгновенны, асинхронных гуардов пока что нет
● на момент запуска гуарда, все данные должны быть доступны в
А теперь все вместе!
делите свой код на более мелкие части по зонам ответственности
Что почитать:
● 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
Спасибо!
Вопросы?

More Related Content

Similar to Ivan Shaban - Robotlegs 2+

Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobileUA Mobile
 
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеШкола-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеГлеб Тарасов
 
Plugin development for intelli j platform
Plugin development for intelli j platformPlugin development for intelli j platform
Plugin development for intelli j platformchashnikov
 
Антон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в androidАнтон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в androidDataArt
 
Online TechTalk “Flutter Mobile Development”
Online TechTalk “Flutter Mobile Development”Online TechTalk “Flutter Mobile Development”
Online TechTalk “Flutter Mobile Development”GlobalLogic Ukraine
 
End-2-End UI автоматизация в мобильном приложении. Наша реализация
End-2-End UI автоматизация в мобильном приложении. Наша реализацияEnd-2-End UI автоматизация в мобильном приложении. Наша реализация
End-2-End UI автоматизация в мобильном приложении. Наша реализацияSQALab
 
Enterprise flex pure mvc, slides, russian
Enterprise flex pure mvc, slides, russianEnterprise flex pure mvc, slides, russian
Enterprise flex pure mvc, slides, russianSergiy Shychynov
 
Java осень 2012 лекция 9
Java осень 2012 лекция 9Java осень 2012 лекция 9
Java осень 2012 лекция 9Technopark
 
CodeFest 2011. Бусыгин Р. — Создание кастомных интерфейсов для iOS
CodeFest 2011. Бусыгин Р. — Создание кастомных интерфейсов для iOSCodeFest 2011. Бусыгин Р. — Создание кастомных интерфейсов для iOS
CodeFest 2011. Бусыгин Р. — Создание кастомных интерфейсов для iOSCodeFest
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
Silverlight 4, есть ли жизнь на десктопе?
Silverlight 4, есть ли жизнь на десктопе?Silverlight 4, есть ли жизнь на десктопе?
Silverlight 4, есть ли жизнь на десктопе?Eugene Zharkov
 
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...Denis Tsvettsih
 
AndroidMVPHelper
AndroidMVPHelperAndroidMVPHelper
AndroidMVPHelperDataArt
 
Автоматизация тестирования iOS и Android приложений
Автоматизация тестирования iOS и Android приложенийАвтоматизация тестирования iOS и Android приложений
Автоматизация тестирования iOS и Android приложенийAndrei Pugachev
 
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020OdessaJS Conf
 
AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)Andrey Gordienkov
 
Aspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAndrey Gordienkov
 
CodeFest 2010. Высоцкий С. — Автоматизация тестирования Flex/Flash GUI
CodeFest 2010. Высоцкий С. — Автоматизация тестирования Flex/Flash GUICodeFest 2010. Высоцкий С. — Автоматизация тестирования Flex/Flash GUI
CodeFest 2010. Высоцкий С. — Автоматизация тестирования Flex/Flash GUICodeFest
 
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...Yauheni Akhotnikau
 

Similar to Ivan Shaban - Robotlegs 2+ (20)

Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
Aspect Oriented Approach
Aspect Oriented ApproachAspect Oriented Approach
Aspect Oriented Approach
 
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеШкола-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
 
Plugin development for intelli j platform
Plugin development for intelli j platformPlugin development for intelli j platform
Plugin development for intelli j platform
 
Антон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в androidАнтон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в android
 
Online TechTalk “Flutter Mobile Development”
Online TechTalk “Flutter Mobile Development”Online TechTalk “Flutter Mobile Development”
Online TechTalk “Flutter Mobile Development”
 
End-2-End UI автоматизация в мобильном приложении. Наша реализация
End-2-End UI автоматизация в мобильном приложении. Наша реализацияEnd-2-End UI автоматизация в мобильном приложении. Наша реализация
End-2-End UI автоматизация в мобильном приложении. Наша реализация
 
Enterprise flex pure mvc, slides, russian
Enterprise flex pure mvc, slides, russianEnterprise flex pure mvc, slides, russian
Enterprise flex pure mvc, slides, russian
 
Java осень 2012 лекция 9
Java осень 2012 лекция 9Java осень 2012 лекция 9
Java осень 2012 лекция 9
 
CodeFest 2011. Бусыгин Р. — Создание кастомных интерфейсов для iOS
CodeFest 2011. Бусыгин Р. — Создание кастомных интерфейсов для iOSCodeFest 2011. Бусыгин Р. — Создание кастомных интерфейсов для iOS
CodeFest 2011. Бусыгин Р. — Создание кастомных интерфейсов для iOS
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Silverlight 4, есть ли жизнь на десктопе?
Silverlight 4, есть ли жизнь на десктопе?Silverlight 4, есть ли жизнь на десктопе?
Silverlight 4, есть ли жизнь на десктопе?
 
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...
 
AndroidMVPHelper
AndroidMVPHelperAndroidMVPHelper
AndroidMVPHelper
 
Автоматизация тестирования iOS и Android приложений
Автоматизация тестирования iOS и Android приложенийАвтоматизация тестирования iOS и Android приложений
Автоматизация тестирования iOS и Android приложений
 
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
 
AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)
 
Aspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design Patterns
 
CodeFest 2010. Высоцкий С. — Автоматизация тестирования Flex/Flash GUI
CodeFest 2010. Высоцкий С. — Автоматизация тестирования Flex/Flash GUICodeFest 2010. Высоцкий С. — Автоматизация тестирования Flex/Flash GUI
CodeFest 2010. Высоцкий С. — Автоматизация тестирования Flex/Flash GUI
 
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
 

Ivan Shaban - Robotlegs 2+

  • 1. Построение гибкой архитектуры приложения с использованием фреймворка Robotlegs 2
  • 2. Чего мы хотим? Фреймворк или библиотека это всего лишь инструмент...
  • 3. 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 { … } ...Простое оформление сложной логики
  • 4. ...Простое и понятное 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(NotEnoghMoneyGu ard); ... 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);
  • 5. ...Легкое расширение функционала ● модульность ● внедрение зависимостей ● низкая связанность компонентов ● переиспользование кода
  • 6. Основные плюсы и возможности: ● модульность ● гибкий и понятный синтаксис ● удобная и простая система внедрения зависимостей ● удобная система расширений ● нет привязки к конкретной реализации сущностей ● унифицирующий стиль разработки Небольшой минус: ● фреймворк не быстрый
  • 7.
  • 8. [Inject(name=”...”, optional=”true”)] public var myInstance:MyInstanceClass или IInjector#getInstance(class, name=””);
  • 9. Когда доступно: public class MyInstanceClass { [Inject] public var variable:Number; public function MyInstanceClass() { // not ready } [PostConstruct] public function initialize():void { // ready } }
  • 10. [PreDestroy] при анмаппинге или же при вызове IInjector#destroyInstance()
  • 13. ...Список основных сущностей ● context ● config / extension / bundle ● view ● mediator ● command ● model ● service ● guard
  • 14. 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))
  • 15. Configs ● место для маппинга
  • 16. Extensions ● предоставляет расширение функционала фреймворка - поддержка старлинга, сигналов, модульности и т.д.
  • 17. 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); } }
  • 18. Views ● нет конкретной реализации ● рендеринг на основе входящих данных ● предоставляет API ● ничего не знает об устройстве приложения, все данные получает из медиатора ● может только отправлять события-оповещения для медиатора ● ссылки на вью имеют только другие вью или медиатор ● может иметь несколько медиаторов за раз
  • 19. Mediators ● работает только с одним экземпляром вью за раз ● можно мапить на интерфейс или на несколько классов вью ● создается автоматически при добавлении вью в дисплей лист ● удаляется при удалении вью из дисплей листа (можно отключить) ● служит для связи вью и остальных компонентов приложения ● не имееет никакой постронней логики ● может дергать модели и сервисы напрямую ● может слушать и посылать события отв приложение
  • 20. Commands ● нет привязки к конкретной реализации ● запускаются в ответ на события из общей шины ● предназначены для выполнения какого то одного действия ● создаются, выполняют действие, удаляются ● нельзя получить ссылку на команду ● содержат бизнес логику ● могут дергать модели и сервисы, запускать другие событие ● не могут слушать события приложения
  • 21. Models ● инкапсуляция данных и предоставление API для доступа к ним ● могут диспатчить события в приложение ● не могут слушать события от приложения ● не должны содержать лишней логики
  • 22. Services ● сущности для работы с внешними сервисами ● не хранят данные ● могут парсить данные ● могут диспатчить события в приложение ● не могут слушать события от приложения
  • 23. Guards ● используются для предотвращения создания или выполнения чего либо ● нет привязки к конкретной реализации ● нельзя получить ссылку на гуард ● применяются те же инджекты что и для основной цели ● выполняется непосредственно перед созданием основной цели ● если гаурд не одобряет то основная цель не создается ● мгновенны, асинхронных гуардов пока что нет ● на момент запуска гуарда, все данные должны быть доступны в
  • 24. А теперь все вместе! делите свой код на более мелкие части по зонам ответственности
  • 25. Что почитать: ● 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