Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
M-V-VM. Basics.
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
DAloG
June 27, 2014
Programming
500
3
Share
M-V-VM. Basics.
In this slides (EN, and RU texts) i will try to explain basics of MVVM pattern.
DAloG
June 27, 2014
More Decks by DAloG
See All by DAloG
State normalization (RU)
dalog
0
240
Redux + MQTT
dalog
1
820
От задач к проблемам
dalog
1
290
Unlimited power of Data-Driven UI
dalog
4
690
Data-Driven View Controllers. Tips and Tricks
dalog
5
2k
2 years of Redux in iOS. Lessons learned
dalog
0
410
Why unidirectional architecture matter for iOS.
dalog
1
330
Mobile backend without REST
dalog
2
140
Self managed teams 101
dalog
0
200
Other Decks in Programming
See All in Programming
New "Type" system on PicoRuby
pocke
1
270
iOS26時代の新規アプリ開発
yuukiw00w
0
210
TypeScriptだけでAIエージェントを作る フロント・エージェント・インフラのフルスタック実践
har1101
6
1.2k
新規プロダクトを高速で生み出すハーネスエンジニアリング
seanchas116
15
6.9k
タクシーアプリ『GO』の バックエンド開発のおける AI利活用と若者のすべて
pyama86
3
1.8k
SPMマルチモジュールで テストカバレッジを取得する技法
yosshi4486
0
130
自動レビューエンジンの実装と運用 ~レビューのない世界へ~
kurukuru1999
2
280
AIエージェントの隔離技術の徹底比較
kawayu
0
440
[BalkanRuby 2026] Drop your app/services!
palkan
3
710
Moments When Things Go Wrong
aurimas
3
120
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
300
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
2.9k
Featured
See All Featured
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
55k
Utilizing Notion as your number one productivity tool
mfonobong
4
310
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
290
Why Our Code Smells
bkeepers
PRO
340
58k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Designing Powerful Visuals for Engaging Learning
tmiket
1
380
Ruling the World: When Life Gets Gamed
codingconduct
0
240
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
Documentation Writing (for coders)
carmenintech
77
5.3k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
160
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
230
The Curse of the Amulet
leimatthew05
1
12k
Transcript
M-V-VM. Обоснование. Теоретические размышления об абстракции интерфейса пользователя. DAloG @
CocoaHeads/2014(June)
История
История • Паттерн не формализован • Мартин фаулер публикует статью
• Microsoft делает WPF • ReactiveCocoa (Rx) начинает продвижение • objc.io доносит идею в массы.
Мода
Мода • Binding - это удобно • RAC - это
модно • TDD - это полезно • … • PROFIT!!!
Основы
Основы View
Основы View Layout Structure Content
Основы (pre iPad) Layout Structure Content Дизайнер Приложение
Основы (iPad) Layout Structure Content Дизайнер Приложение
Основы (iOS 7) Layout Structure Content Дизайнер Приложение
Основы (iOS 8) Layout Structure Content Дизайнер Приложение
Акцент Content
Content • Цвет • Текст • Шрифт • Состояние (активно,
пассивно) • Анимация
Content
Content Content Content Content Content Content Content Content Content Content
Content Content Content Content Content Content Content
Content
Content Статичный Динамичный
Content Статичный Динамичный
Content Статичный ViewModel
View Content ViewModel Structure Layout
ViewModel • Динамическое состояние интерфейса • Прием информации от интерфейса
• Связь с иерархией ViewModel’ей
@interface XXUserCredentialsViewModel: NSObject ! ! /// Динамическое состояние интерфейса! @property
(readonly) NSString* name;! @property (readonly) NSString* password;! @property (readonly) BOOL canLogin;! ! /// Прием информации от интерфейса! - (void) setName:(NSString*) name;! - (void) setPassword:(NSString*) password;! - (void) loginUser;! ! /// Связь с иерархией ViewModel’ей! @property (readonly) XXTimelineViewModel* timeline;! ! @end
@interface XXUserCredentialsViewModel: NSObject ! ! /// Динамическое состояние интерфейса! @property
(readonly) NSString* name;! @property (readonly) NSString* password;! @property (readonly) BOOL canLogin;! ! /// Прием информации от интерфейса! - (void) setName:(NSString*) name;! - (void) setPassword:(NSString*) password;! - (void) loginUser;! ! /// Связь с иерархией ViewModel’ей! @property (readonly) XXTimelineViewModel* timeline;! ! @end
@interface XXUserCredentialsViewModel: NSObject ! ! /// Динамическое состояние интерфейса! @property
(readonly) NSString* name;! @property (readonly) NSString* password;! @property (readonly) BOOL canLogin;! ! /// Прием информации от интерфейса! - (void) setName:(NSString*) name;! - (void) setPassword:(NSString*) password;! - (void) loginUser;! ! /// Связь с иерархией ViewModel’ей! @property (readonly) XXTimelineViewModel* timeline;! ! @end
@interface XXUserCredentialsViewModel: NSObject ! ! /// Динамическое состояние интерфейса! @property
(readonly) NSString* name;! @property (readonly) NSString* password;! @property (readonly) BOOL canLogin;! ! /// Прием информации от интерфейса! - (void) setName:(NSString*) name;! - (void) setPassword:(NSString*) password;! - (void) loginUser;! ! /// Связь с иерархией ViewModel’ей! @property (readonly) XXTimelineViewModel* timeline;! ! @end
@interface XXUserCredentialsViewModel: NSObject ! ! /// Динамическое состояние интерфейса! @property
(readonly) NSString* name;! @property (readonly) NSString* password;! @property (readonly) BOOL canLogin;! ! /// Прием информации от интерфейса! - (void) setName:(NSString*) name;! - (void) setPassword:(NSString*) password;! - (void) loginUser;! ! /// Связь с иерархией ViewModel’ей! @property (readonly) XXTimelineViewModel* timeline;! ! @end
@interface XXUserCredentialsViewModel: NSObject ! ! …! - (void) loginUser;! !
@property (readonly) XXLoginProcessViewModel* ! ! ! ! ! ! ! ! ! loginProcess;! …! ! @end
M-V-VM ViewModel View Model
M-V-VM ViewModel View Model @model; @viewModel;
Закон восходящих абстракций @model; @viewModel; • Любая абстракция не имеет
доступа к более конкретным сущностям. • IoC используется для прохождения через этот барьер, и только для этого.
M-V-VM ViewModel View Model @model; @viewModel;
M-V-VM ViewModel View Model View
M-V-VM ViewModel View Model View ViewModel View
M-V-VM ViewModel View Model View ViewModel View Model
M-V-VM ViewModel View Model View View Model
M-V-VM ViewModel View Model View View Model Storyboard
M-V-VM ViewModel View Model @model; @viewModel;
Тестирование View Mock View @viewModel; UI
Тестирование VM ViewModel XCAssert() Mock @model; @viewModel;
M-V-VM ViewModel View Model @model; @viewModel;
M-V-VM ViewModel View @model;
MVC Model UIViewController @model; UIView @view;
M-(V-C)-VM ViewModel UIViewController Model UIView
Тестирование View Mock View @viewModel; UI
M-V-VM ViewModel View Model @model; @viewModel;
Model Model @model; Adapter Service
Model Model @model; Adapter Service Network CoreData
Model • Абстракция всего проложения (use case) • Сокрытие конкретных
сервисов • Бизнес правила
Model = ! Application Model = Domain Model
M-V-VM ViewModel View Model @model; @viewModel;
Синхронизация • Динамическая (RAC, KVO) • Статическая (Time, Notification)
RAC — деталь механизма синхронизации.
Тестирование VM ViewModel XCAssert() Mock @model; @viewModel;
Итого
Итого MVVM - инструмент для обеспечения тестирования пользовательского интерфейса путем
его абстрагирования.
Итого MVVM - инструмент для обеспечения тестирования пользовательского интерфейса путем
его абстрагирования.
Минусы • Высокая неявная связность • Низкое зацепление • Сложность
в поддержке • Трудоемкость
M-V-VM ViewModel View Model View ViewModel View Model
Альтернативы • As Is • Fat Data Source - apple
way. http://oleb.net/ blog/2014/06/apples-take-on-app-architecture/ • Active Model - [self.ui …]. http://www.objc.io/ issue-13/viper.html
Дополнительные материалы • MSDN (WPF) • ReactiveViewModel - RAC connected.
• Clean architecture - http://blog.8thlight.com/ uncle-bob/2012/08/13/the-clean-architecture.html • Presentation Model - http://martinfowler.com/ eaaDev/PresentationModel.html • objc.io - http://www.objc.io/issue-13/mvvm.html
Вопросы. • Алексей Демедецкий • Twitter: @DAlooG • Skype: nobidon