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
ViewModelって200種類あんねん
Search
野瀬田 裕樹
August 09, 2026
Programming
12
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 野瀬田 裕樹
uhooiさん発ランダムタスクにチャレンジしよう!
yuukiw00w
0
13
Validate your App Intents adoption with AppIntentsTesting
yuukiw00w
0
9
App Intentsを実装しよう
yuukiw00w
0
9
iOS26時代の新規アプリ開発
yuukiw00w
0
250
Swift ConcurrencyでよりSwiftyに
yuukiw00w
0
350
Human Interface Guidelines 2
yuukiw00w
0
79
AI前提で考えるiOSアプリのモダナイズ設計
yuukiw00w
0
290
HIG学習用スライド
yuukiw00w
0
200
FlutterKaigi 2025: What is iOS Assistive Access? UI considerations for Flutter
yuukiw00w
0
64
Other Decks in Programming
See All in Programming
継続モナドとリアクティブプログラミング
yukikurage
3
690
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
150
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
190
Claude Code全社展開のためにやったことn選~プラグイン302個・コミッター271人を支えるために~
kenchan
5
1.4k
Foundation Models frameworkで画像分析
ryodeveloper
1
600
React本体のコードリーディング
high_g_engineer
1
140
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
590
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
1
490
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
670
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
330
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
160
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
210
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
400
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
66
57k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.3k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
340
HDC tutorial
michielstock
2
790
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.7k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Chasing Engaging Ingredients in Design
codingconduct
0
260
Ethics towards AI in product and experience design
skipperchong
2
340
The SEO identity crisis: Don't let AI make you average
varn
0
530
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種類あんねん
おわり