誤解されているViewModel
・ViewModelはViewの抽象化である
wikiにも記載されている言葉であるが、
抽象化は何のためにあるか。誰のための抽象化なのかの観点から考えると
抽象化する意味とは具象に直接さわらないで抽象化してアクセスする。
Viewを抽象化してアクセスするのは誰か?
ここで間違えやすいのはModelがViewをViewModelで抽象化してアクセスするという方式。この方式もありだが、直接的ではないが間接的にViewを制御していることになるので、UIとUI以外を分離した意味がなくなる。
Viewを抽象化してアクセスするのはViewModel自身
ViewModelの中から見て、Viewの抽象化が見えている。
ViewModel = View抽象化層 + ViewModelロジック
ViewModelはViewの抽象化を含んでいるが正しいと思われる。
抽象化という言葉自体が誤解を与える表現と思われる。
・ViewModelはViewをモデリングしたものである。
Viewの抽象化ということでViewをモデリングしたものがViewModelであるという
のと、View”Model”という言葉からモデリングしたものという考えだと思わるが、
Modelにはソフトウェアの中核のデータとロジックという意味もある。
Viewのためのデータとロジックという理解が正しいと思われる。
・ViewModelはUIの都合を隠すためにいる
ViewModelの役割がこれしかないと考えている人がViewModelを不要と判断する場合がある。
WPFの場合、UIスレッド以外のスレッドからコントロールに直接アクセスすると例外がおこる。
このUIの都合はバインド機構が肩代わりしてくれている。
バインドするプロパティを用意すれば自動的に表示更新を行ってくれる。
プロパティはただの変数なのでUIスレッド以外からもアクセスできる。
ViewModelはバインドするプロパティを用意しているだけであり、UIの都合を隠すためにViewModelが何かをやっているわけではない。
Modelにバインドするプロパティを置けば動くものはできるがMVVMではない。
MVになるだけである。Model内にViewの抽象化を抱え込む形になる。
UIとModelの分離するのがViewModelの仕事である。ViewModelにはViewModelの仕事がある。
・ViewModelがバインドしている
他でバインドしているからViewModelはいらない。
ViewModelがバインドしているわけではない。
ViewModelはバインドするプロパティを用意しているだけ。
他でバインド機構が動いていたとしてもViewModelの役割はある。
・ViewModelにはロジックを書かない
ViewModelにビジネスロジックは置かない。という言葉が誤解されて広まったものと
考えられるが。UIロジックは置かなければいけない。
ViewにはUIロジックは置かない。
ModelはUIを知らない。
UIロジックの置き場はViewModelしかない。
・ViewModelはViewとModelの橋渡し
橋渡しだけなら、無くてもいいだろうという考えもあるが
ViewModelの役割
・VIewへバインドするプロパティ、コマンドを用意する。
・Modelのデータを変換してView用のデータにする。
・Viewのロジック
橋渡しだけが仕事ではない。