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
ViewModelって200種類あんねん
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
野瀬田 裕樹
August 09, 2026
Programming
62
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ViewModelって200種類あんねん
集まれSwift好き!Swift愛好会 vol.98
野瀬田 裕樹
August 09, 2026
More Decks by 野瀬田 裕樹
See All by 野瀬田 裕樹
速習iPhone Duo対応
yuukiw00w
2
960
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
320
ネイティブiOSアプリだからできること
yuukiw00w
0
47
野瀬田とSwift愛好会
yuukiw00w
0
39
uhooiさん発ランダムタスクにチャレンジしよう!
yuukiw00w
1
83
Validate your App Intents adoption with AppIntentsTesting
yuukiw00w
0
58
App Intentsを実装しよう
yuukiw00w
0
60
iOS26時代の新規アプリ開発
yuukiw00w
0
280
Swift ConcurrencyでよりSwiftyに
yuukiw00w
0
410
Other Decks in Programming
See All in Programming
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
34
15k
mrbgem 三角測量 開発
ogom
0
210
Domain-Driven Transformation
hschwentner
2
2.3k
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
260
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
550
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
230
setup-vp GitLab対応の裏側
naokihaba
0
150
Workers Cache を知る
syumai
0
340
ジョジョの世界をXRで再現する
mofurune
0
130
Vue Fes Japan の “作る側”に関わってみて
naokihaba
0
110
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.5k
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
160
Featured
See All Featured
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
450
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
4k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
790
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
270
The Invisible Side of Design
smashingmag
301
52k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
260
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Ruling the World: When Life Gets Gamed
codingconduct
0
390
Navigating Team Friction
lara
192
16k
WCS-LA-2024
lcolladotor
0
850
Transcript
ViewModelって 200種類あんねん 合同会社DMM.com アプリ開発室 野瀬田 裕樹(@ynoseda)
あなたは ViewModelとは何か 答えられますか?
最初のViewModel
最初のViewModel • 2005年にJohn Gossman氏がMVVMを発表 • その中でViewModelについて語られている
最初のViewModel モデルに直接データバインドできるのはアプリケーションUIのごく一部に限られます。 特に、モデルが既存のクラスまたはデータスキーマであり、アプリケーション開発者が制御できな い場合はなおさらです。 モデルには、コントロールに直接マッピングできないデータ型が含まれている可能性が非常に高い です。UIは、ビューの厳密な定義では意味をなさないものの、モデルに含めるには特殊すぎる(あ るいは既存のモデルに含まれていない)コードで実装する必要がある複雑な操作を実行したい場合 もあります。 最後に、選択やモードなどのビューステートを配置する場所も必要です。 ViewModelはこれらのタスクを担います。
ViewModelとは「ビューのモデル」を意味し、ビューの抽象化と考えることができますが、View がデータバインディングに使用できるモデルの特殊化も提供します。 この後者の役割において、ViewModelには、モデル型をView型に変換するデータトランスフォー マーと、Viewがモデルと対話するために使用できるコマンドが含まれています。
ViewModelという名前の意味 • Viewを抽象化したもの • Viewがデータバインディングで利用できるように、 Modelを特化させたもの
最初のViewModelの役割 • ModelをそのままUIにバインドできない問題を解決する • UIロジックを配置する場所を提供する • Viewの状態を保持する • ViewがModelを操作するためのインターフェースを提供する
MVVMといえば • Androidでは標準でViewModelというclassが存在します • 比較のため、AndroidでのVMの役割を確認してみましょう
Android ViewModel ViewModel クラスは、ビジネス ロジックまたは画面レベルの状態ホ ルダーです。 状態を UI に公開し、関連するビジネス ロジックをカプセル化しま
す。 状態がキャッシュに保存され、構成が変更されてもそれが維持される ことが主なメリットです。 つまり、アクティビティ間を移動するときや、画面の回転などの構成 の変更に従うときに、UI でデータを再度取得する必要がありません。
Android ViewModelの役割 • ModelをそのままUIにバインドできない問題を解決する • UIロジックを配置する場所を提供する • Viewの状態を保持する(+それをキャッシュする) • ViewがModelを操作するためのインターフェースを提供する
Android ViewModelの役割 • ModelをそのままUIにバインドできない問題を解決する → 通常RepositoryでUIが扱えるデータ型にする • UIロジックを配置する場所を提供する • Viewの状態を保持する(+それをキャッシュする)
• ViewがModelを操作するためのインターフェースを提供する → ビジネスロジックはUseCaseで提供し、VMがそれを叩く
補足 Android公式のアプリアーキテクチャーガイドでは MVVMとは書いてません あくまでVMはUIレイヤーのState holdersの一例となっている
iOSにおけるMVVM • 正式なものはない • アプリごとによってViewModelの役割は異なる • VMについて見る前にMVVM以外のアーキテクチャーを確認しよう
Cocoa MVC • 伝統的なAppleのMVCアーキテクチャー https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html • UIロジック、データ取得、状態管理、画面遷移、ログ送信など多くの実装がVCに含まれてし まい、FatViewController問題を引き起こしがちだった User操作 描画更新
View View Controller データ更新 通知 Model
MVP • 特にApple公式でMVPに触れたことはないはずだが、 一部アプリでPresenterを採用している • MVPにはPassive View / Supervising Controllerの2種類がある
• 今回の本題はMVVMなので詳細は割愛するが、 ViewにVCを含めて考え、UIロジック等をPresenterに実装する設計などが考 えられる View Presenter Model
VIPER • View + Interactor + Presenter + Entity +
Routerの頭文字 • ビジネスロジックをInteractorに置き、画面遷移をRouterが担う • MVPにおけるPresenterの責務の一部が分割されていることが特徴
その他のアーキテクチャー • Flux/Redux系 FluxやReduxを参考に独自設計を採用しているケースがある • TCA(The Composable Architecture) 有名なので採用しているアプリも多いと思われる •
MV(Model - View) AppleのサンプルリポジトリではViewとModelしかないことも多い
その他のアーキテクチャー • 最近は Presenter, ViewModel, ViewController のようなものを 持たない設計も多い • ViewModelが従来担おうとしていた責務が分割、整理されて
命名されている
iOSにおけるMVVM • MVVMもApple公式の定義はないため、 ViewModelの役割はプロジェクトごとに変わる
例1:UIKit時代のVM • UIViewController + UIView + ViewModel + Model構成 •
UIロジック、Viewの状態保持、Modelの操作IFの提供、 バインドできる形でのModelの提供などをVMに持たせられる • 最初のViewModelと近い役割での導入が期待できる
例2:UIKit時代のVM • VC + View + VM + Repository +
Model構成 • ModelをそのままUIにバインドできない問題はRepositoryが Publisherを公開するなどの形で委譲し、 ViewModelはその他の役割に専念する • ViewModelの肥大化に対応するため一部責務を切り出した状態
例3:UIKit時代のVM • VC + View + VM + UseCase +
Repository + Model構成 • VMはUIロジックを配置する場所を提供したり、 Viewの状態を保持したりするのに専念し、 その他をUseCaseやRepositoryなどに切り出した構成 • Androidにおける設計と近い構成になる
UIKit時代のMVVM • 同じ ViewModel という名前でもプロジェクトによって役割は様々 • UIロジック、状態管理、副作用管理、データ変換、画面遷移、etc • 全部盛りのVMもあれば、状態の保持に徹するVMもある •
ViewModel は複数の責務の組み合わせで成り立つ
SwiftUI.View • SwiftUI.ViewはUIを実際に描画するわけではなく、 どのようにUIが構成されるべきかを記述したもの • Viewを抽象化したものであり、 状態を@Stateで保持してModelをバインドできるようになっている
SwiftUI.Viewは 状態を保持して Viewがbindできるようにする
最初のViewModelのコンセプトと かなり近い存在では?
SwiftUI.ViewとViewModel • SwiftUI.Viewはほとんど最初のViewModelのコンセプトと同等 • ただ、 View に VM の責務を全部任せると辛いという気持ちもある •
例えば 「UIロジックを配置する場所を提供する」 「ViewがModelを操作するためのインターフェース」 ここら辺は切り出してView以外で実装しても良さそう
SwiftUI.ViewとViewModel • そうしてViewから切り出したものをViewModelと呼んでもいい
SwiftUI.ViewとViewModel • そうしてViewから切り出したものをViewModelと呼んでもいい (し、UseCaseとか別の名前で切り出してもいいし、
SwiftUI.ViewとViewModel • そうしてViewから切り出したものをViewModelと呼んでもいい (し、UseCaseとか別の名前で切り出してもいいし、 あとは全部Modelですって言ってもいいし、)
SwiftUI.ViewとViewModel • そうしてViewから切り出したものをViewModelと呼んでもいい (し、UseCaseとか別の名前で切り出してもいいし、 あとは全部Modelですって言ってもいいし、 表示ロジックだからPresenterですって言ってもいいかも)
まとめ • 元々のViewModelには色々な責務があった • iOSは公式のMVVMガイドなどはないので、 チームごとにViewModelが担う責務は違う • SwiftUIの登場でViewModelの責務の一部がViewに任せられるよう になり、チーム内でViewModelの責務を明確にする必要性が増した
言葉遊びにならないように チームでViewModelの役割を 明確にしよう
ViewModelは1つではない 責務の組み合わせ次第で いくらでも形が変わる
だから ViewModelって 200種類あんねん
おわり