【エムブイブイエム】

MVVM(エムブイブイエム) とは?

💡 画面と裏方を「双方向の糸電話」でつなぐ設計パターン
📌 このページのポイント
MVVM パターンの構造 View (画面・UI) テキストボックス ボタン リスト表示 ViewModel (状態管理・変換) name プロパティ saveCommand items リスト Model (データ・ロジック) User エンティティ Repository ビジネスルール データバインディング (双方向) データ取得・更新 表示のみ担当 橋渡し役 データ&ロジック ViewはViewModelだけを知り、Modelの存在を知らない
MVVMの3層構造とデータバインディングの流れ
ひよこ ひよこ

MVCは聞いたことあるけど、MVVMって何が違うの?

ペンギン先生 ペンギン先生

MVCのController(操作の受付係)の代わりにViewModel(画面の状態管理係)がいるんだ。MVVMの特徴はデータバインディングで、ViewModelの値を変えると自動的に画面が更新されるよ

ひよこ ひよこ

データバインディングってどういうこと?

ペンギン先生 ペンギン先生

「画面の入力欄」と「ViewModelのプロパティ」を紐づけておくと、片方を変えるともう片方も自動で変わる仕組みだよ。たとえばテキストボックスに名前を入力すると、ViewModelのnameプロパティが自動更新されるイメージだね

ひよこ ひよこ

ViewModelって結局何をするの?

ペンギン先生 ペンギン先生

Viewに表示するためのデータを整形して保持する係だよ。たとえばModelが「price→ 1000」を持っていたら、ViewModelが「displayPrice→ ¥1,000」に変換してViewに渡すんだ。Viewはただ表示するだけでいい

ひよこ ひよこ

テストしやすいって本当?

ペンギン先生 ペンギン先生

ViewModelは普通のクラスだから、UIを起動しなくてもユニットテストできるんだ。「この値を変えたらこのプロパティがこう変わるはず」というテストを画面なしで書けるのが大きなメリットだよ

ひよこ ひよこ

どのフレームワークで使われてるの?

ペンギン先生 ペンギン先生

元祖はMicrosoftのWPFだけど、今はSwiftUI、Jetpack Compose、Vue.jsのComposition APIなど、リアクティブなUIフレームワークの多くがMVVM的な考え方を採用しているよ。フロントエンド開発では避けて通れないパターンだね

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「MVVM」って出てきたら「画面とロジックをデータバインディングでつなぐ設計パターン」と思えればだいたいOK!
📖 おまけ:英語の意味
「Model-View-ViewModel」 = モデル・ビュー・ビューモデル
💬 2005年にMicrosoftのJohn Gossmanが提唱したパターンで、WPF(Windows Presentation Foundation)のデータバインディング機能を活かすために生まれたんだよ
← 用語集にもどる