Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
M-V-VM. Basics.
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
DAloG
June 27, 2014
Programming
510
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
260
Redux + MQTT
dalog
1
840
От задач к проблемам
dalog
1
290
Unlimited power of Data-Driven UI
dalog
4
720
Data-Driven View Controllers. Tips and Tricks
dalog
5
2k
2 years of Redux in iOS. Lessons learned
dalog
0
430
Why unidirectional architecture matter for iOS.
dalog
1
340
Mobile backend without REST
dalog
2
160
Self managed teams 101
dalog
0
210
Other Decks in Programming
See All in Programming
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
300
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
220
最近”作らせてる” ローカルAIアプリの話
akit37
0
470
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
150
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
270
Compiling a real-world CLI tool to native with Static Hermes
tmikov2023
0
120
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
35
17k
AIに “答え“を書かせるのを やめてみた
___akari11
0
120
[ハンズオン]AIへの指示だけで「五目並べ」を作ってみよう
satoshi256kbyte
1
380
残高管理から台帳サービスへの進化
artoy
1
200
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
220
TechTown - Creating Composable Callables in Contemporary C++
rollbear
0
130
Featured
See All Featured
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
940
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.7k
Code Reviewing Like a Champion
maltzj
529
40k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
540
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
530
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
4
4.4k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
58k
How to train your dragon (web standard)
notwaldorf
96
6.9k
Mobile First: as difficult as doing things right
swwweet
225
10k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
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