Встреча №9. Будущее паттерна mvvm в ios приложениях, Денис...

46
MVVM pattern in iOS development Denis Lebedev, iOS Hipster @ Wargaming mailto: [email protected] linkedin: http://linkedin.com/in/dlebedev

Upload: cocoaheads-moscow

Post on 07-Jul-2015

300 views

Category:

Software


1 download

DESCRIPTION

Доклад Дениса Лебедева на CocoaHeads Moscow

TRANSCRIPT

Page 1: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

MVVM pattern in iOS development

Denis Lebedev, iOS Hipster @ Wargaming !mailto: [email protected] linkedin: http://linkedin.com/in/dlebedev

Page 2: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев
Page 3: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

Agenda

Wargaming Service Mobile Apps dept. MVC MVVM Development hints Reference

Page 4: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

WARGAMING SERVICE MOBILE APPS

Page 5: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

SMA department

We make apps for user engagement Quality really matters We experiment a lot with new tools & technologies

Page 6: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

Apps

Page 7: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

MODEL-VIEW-CONTROLLER

Page 8: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

MVC Diagram

View

Model

Controller

Page 9: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

Classical principles

Loose coupling Model is decoupled; view/controller can listen to it’s changes View knows about model, can manipulate controller Controller knows everything and “does all the things” ©

Page 10: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

View Controller responsibilities

Owns & manages view’s state Acts as the datasource for tableviews Maps model’s properties to view values …

Page 11: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

MASSIVE VIEW CONTROLLER

Page 12: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

Real world MVC

Controllers are ‘almost’ not reusable Controllers are large View is very tight to it’s controller Controllers are hard to unit test

Page 13: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

Solving Massive Controller problems

Separate object acting as tableview dataSource ConverterHelper, ‘MyFancyAttributeToStringHelper’, etc..

Page 14: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

Testing

Unit tests of controllers code is pain Sort of UI tests (Calabash, KIF) is required

Page 15: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

Wrapping up

MVC is not bad at all.

Page 16: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

Wrapping up

What can we do for better world?

Page 17: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

MODEL-VIEW-VIEWMODEL

Page 18: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

MVVM Diagram

View/ViewController ViewModel Model

Page 19: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

MVVM Diagram

Wait what? It’s the same!

Page 20: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

Key differences with MVC

ViewController owns it’s view model View model doesn’t know anything about controller

Page 21: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

Key differences with MVC

View/ViewController

ViewModel

Model

ViewController

View

Model

MVC MVVM

Page 22: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

MVVM Models

Can represent single domain entity or collection Responsible for fetching/storing data

Page 23: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

MVVM Views

Cocoa note: MVVM view = view + view controller view is stateless views/view controllers become smaller

Page 24: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

MVVM View Models

encapsulates all view data/properties and binds them to view validation logic actions

Page 25: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

ReactiveCocoa

Functional reactive paradigm in Cocoa world Fancy bindings Composes of sync/async events of any kind Mature, production-ready framework

Page 26: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

ReactiveCocoa

RAC(self, title) = RACObserve(self, viewModel.nickname);

Page 27: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

ReactiveCocoa

RAC(self, stringType) = [RACObserve(self, model.type) map:^id(NSNumber *v) { return v.intValue == 0 ? @"zero" : @"non-zero"; }];

Page 28: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

Benefits

We don’t need to to test the UI (actually we should) We can implement app logic without any UI view model is easy testable view model are (almost) platform independent

Page 29: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

Platform agnostic code

iPad / iPhone / OS X code sharing MVVM + Xamarin = shared Windows / OS X code

Page 30: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

How we came to MVVM

Already familiar with ReactiveCocoa Strong need in good internal testing Fresh project developed from scratch

Page 31: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

DEVELOPMENT HINTS

Page 32: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

What actually does view controller?

Layout Animations Device rotation View transitions !All sensible state is stored in view model

Page 33: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

Instantiation

Every controller has viewModel property Some views may have separate view models Inject view model to controller during instantiation Inject view model’s important properties during instantiation

Page 34: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

ViewModel interface

RACSignals as model properties where possible RACSignal for data requests Model property (NSArray, domain object, etc.)

Page 35: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

WPAFeaturesViewModel.h

@interface WPAPlaneFeaturesViewModel : NSObject !@property (copy, nonatomic) NSArray *planeRows; !@property (strong, nonatomic, readonly) RACCommand *forwardCommand; @property (strong, nonatomic, readonly) RACSignal *forwardHidden; !@property (strong, nonatomic) RACSignal *nextPlaneTitle; !- (instancetype)initWithReferencePlane:(WOWPPlane *)plane classMates:(NSArray *)planes; !@end

Page 36: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

ViewModel for tableviews

ViewModel has “rows” property of type NSArray Row is some NSObject subclass with data very coupled to cell Formatters, etc. are applied to row class, not cell Controller binds to “rows” and reloads data after property changes

Page 37: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

WPAPlaneRow.h

@interface WPAPlaneRow : NSObject !@property (strong, nonatomic) WPAFeature *feature; @property (copy, nonatomic) NSString *value; @property (copy, nonatomic) NSString *grade; @property (copy, nonatomic) NSString *referenceGrade; !@end

Page 38: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

Testing

State of model can be determined in any moment Property change affects view model internal state RACCommand changes view model state RACSignal pushes new state to subscribers

ViewModel tests are very obvious and atomic:

Page 39: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

Real world testing

Unit tests for view models Integration tests (for controllers) with KIF

Page 40: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

IMPERATIVE VS DECLARATIVE

Page 41: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

How to be functional and reactive

Write declarative code instead of imperative Describe how properties are related to each other

Page 42: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

Functional Reactive view model

Almost all code is in constructor Describes how the view should work in terms of commands and properties

Page 43: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

Functional Reactive view model

The login button can be pressed when username and password aren’t blank !The error should be cleared after 5 seconds it was displayed

Page 44: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

REFERENCE

Page 45: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

Functional Reactive view model

ReactiveCocoa https://github.com/ReactiveCocoa/ReactiveCocoa ReactiveViewModel https://github.com/ReactiveCocoa/ReactiveViewModel !FRP on iOS https://leanpub.com/iosfrp !FunctionalReactivePixels https://github.com/AshFurrow/FunctionalReactivePixels MVVMExample https://github.com/garnett/MVVMExample

Page 46: Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев

THANK YOU!