MVVMについて調べたこと

# はじめに
Androidアプリを書いていた時に調べ、迷い、結局それが何たるかを理解するのは難しかったMVVMについて理解できた範囲で調べたことを書いていきます。

## MVVMとは
MVVM（Model-View-ViewModel）は、ソフトウェアアーキテクチャのパターンで、特にGUIアプリケーションの開発において使われることが多いです。MVVMはModel、ViewModel、Viewの3つの主要なコンポーネントで構成されています。
MVVMの主な目的は、ビジネスロジック（Model）とUI（View）の分離を強化し、それらをよりテスト可能で保守しやすい状態に保つことです。また、データバインディングを活用して、ViewModel と View の間でデータの同期を容易にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/518502af-1455-cb6b-8010-601bdc5fd3ce.png)

画像引用

https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel

### 原典
MVVM（Model-View-ViewModel）パターンの考案者は、マイクロソフトのジョン・ガスパー（John Gossman）です。
この方は、WPF（Windows Presentation Foundation）の開発チームの一員として、MVVMパターンを推奨しました。

https://learn.microsoft.com/en-us/archive/blogs/johngossman/introduction-to-modelviewviewmodel-pattern-for-building-wpf-apps

## Model
フィールドとそれを取得するための処理をかく。データの全量。

どちらかというと、UIの制約を意識しない処理ロジックはここに全て書く。ちなみに、UIの制約を意識しないのであってUI自体を全く意識しないわけではない。

## ViewModel
ViewModelはUIの制約を吸収するための処理ロジックや加工処理などを書く。そのためViewが決まればViewModelが決まる、というイメージが正しいらしい。

その値や処理の結果をViewModelクラスのインスタンスにセットし、DatabindingによりViewの値が自動的に変更される（DatabindingのほかにもCommandやビヘイビア等の方法もある）。

また、Modelにて永続的に管理する必要もないような一時的な値（いまViewがDrag状態であるか否かなど）はViewModelのインスタンスが持つ。

## View

画面を描画する。
ViewModelのインスタンスのフィールドとViewが参照する値がDatabinding等により同期されることにより、View-ViewModel間が疎結合になる。

## 難しいところ
ViewModelの定義が一番難しいと感じました。
原典には以下のように記載してあり、ここが参考になりそうです（太字は私がつけました）。
>
>In practice however, only a small subset of application UI can be data bound directly to the Model, especially if the Model is a pre-existing class or data schema over which the application developer has no control.  The Model is very likely to have a data types that cannot be mapped directly to controls.  **The UI may want to perform complex operations that must be implemented in code which doesn't make sense in our strict definition of the View but are too specific to be included in the Model (or didn't come with the pre-existing model).**  **Finally we need a place to put view state such as selection or modes.**

>**The ViewModel is responsible for these tasks.** The term means "Model of a View", and can be thought of as abstraction of the view, but it also provides a specialization of the Model that the View can use for data-binding.  In this latter role the ViewModel contains data-transformers that convert Model types into View types, and it contains Commands the View can use to interact with the Model. 


## 参考
原典
[Introduction to Model/View/ViewModel pattern for building WPF apps](https://learn.microsoft.com/en-us/archive/blogs/johngossman/introduction-to-modelviewviewmodel-pattern-for-building-wpf-apps)
[MVVMとは何か](https://days-of-programming.blogspot.com/2017/11/mvvm.html)
[MVVMにおけるViewModelとModelのプロパティ同期 - NotifyPropertyHelper 1.0.0-beta1](https://days-of-programming.blogspot.com/2018/02/mvvmviewmodelmodel-notifypropertyhelper.html)
[MVVMのModelにまつわる誤解 - the sea of fertility](https://ugaya40.hateblo.jp/entry/model-mistake)
[【Android】2020年からの MVVM【実践】 - Qiita](https://qiita.com/sdkei/items/a48ae24536562ed000b3)
[RxJava + MVVM パターンで作るストップウォッチアプリ - Qiita](https://qiita.com/amay077/items/8464a22e3063642112ed)
[Android Architecture Components 初級 （ MVVM + LiveData + Coroutines 編 ） - Qiita](https://qiita.com/Tsutou/items/69a28ebbd69b69e51703)
[Android ViewModel が不要である理由](https://android.benigumo.com/20220929/you-dont-need-android-viewmodel/)
[【Android】初心者が意識すべきMVVMでの開発ルール](https://blog.77jp.net/development-rules-for-mvvm-that-a-beginner-should-be-conscious-of)
[Android MVVM  + LiveData + DataBinding(初心者向け) - Qiita](https://qiita.com/zakimiiiii/items/2d0de51bc37f8e3789e0)
[【Android】MVVMについて](https://zenn.dev/dd_sho/articles/5f32ce2942cbd2)
[【Android】Android の Data Binding でできること（基本編） - Tumbling Dice](https://outofmem.hatenablog.com/entry/2016/01/30/165607)
[監視可能なデータ オブジェクトの使用  |  Android デベロッパー  |  Android Developers](https://developer.android.com/topic/libraries/data-binding/observability?hl=ja)
[DataBindingで値を自動で画面へ反映する - Qiita](https://qiita.com/furusin_oriver/items/495b081cdbc413fb1ecc)
[DataBindingチュートリアル第3回 – BindingAdapter(バインディングアダプター)｜mizutory｜note](https://note.com/mizutory/n/nd6d07e198974)
[DataBindingチュートリアル第5回 – データに表現させる｜mizutory｜note](https://note.com/mizutory/n/n3cbea70c1f41)
[GitHub - sdkei/Android_MVVM_Mediator_Login: 書籍「増補改訂版 Java言語で学ぶ デザインパターン入門」の16章 Mediator に出てくるログインダイアログを、Android の MVVM で実装する。](https://github.com/sdkei/Android_MVVM_Mediator_Login/tree/master)