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
DAloG
June 27, 2014
Programming
3
450
M-V-VM. Basics.
In this slides (EN, and RU texts) i will try to explain basics of MVVM pattern.
DAloG
June 27, 2014
Tweet
Share
More Decks by DAloG
See All by DAloG
State normalization (RU)
dalog
0
160
Redux + MQTT
dalog
1
760
От задач к проблемам
dalog
1
230
Unlimited power of Data-Driven UI
dalog
4
610
Data-Driven View Controllers. Tips and Tricks
dalog
5
1.8k
2 years of Redux in iOS. Lessons learned
dalog
0
340
Why unidirectional architecture matter for iOS.
dalog
1
270
Mobile backend without REST
dalog
2
88
Self managed teams 101
dalog
0
130
Other Decks in Programming
See All in Programming
Amazon Bedrock Multi Agentsを試してきた
tm2
1
280
SRE、開発、QAが協業して挑んだリリースプロセス改革@SRE Kaigi 2025
nealle
3
4.1k
Lottieアニメーションをカスタマイズしてみた
tahia910
0
120
最近のVS Codeで気になるニュース 2025/01
74th
1
250
Djangoアプリケーション 運用のリアル 〜問題発生から可視化、最適化への道〜 #pyconshizu
kashewnuts
1
230
AWSマネコンに複数のアカウントで入れるようになりました
yuhta28
2
160
お前もAI鬼にならないか?👹Bolt & Cursor & Supabase & Vercelで人間をやめるぞ、ジョジョー!👺
taishiyade
5
3.8k
SwiftUIで単方向アーキテクチャを導入して得られた成果
takuyaosawa
0
260
ISUCON14公式反省会LT: 社内ISUCONの話
astj
PRO
0
180
Honoとフロントエンドの 型安全性について
yodaka
4
250
chibiccをCILに移植した結果 (NGK2025S版)
kekyo
PRO
0
210
Honoをフロントエンドで使う 3つのやり方
yusukebe
5
2.2k
Featured
See All Featured
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Faster Mobile Websites
deanohume
306
31k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.7k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2.1k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
A Tale of Four Properties
chriscoyier
158
23k
Raft: Consensus for Rubyists
vanstee
137
6.8k
A Philosophy of Restraint
colly
203
16k
How to train your dragon (web standard)
notwaldorf
90
5.8k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Statistics for Hackers
jakevdp
797
220k
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