2011年06月01日

MVVM:コードビハインドに記述しても良いと思う

   このエントリーをはてなブックマークに追加 Clip to Evernote
Messengerを理解するために自作してみた(1)-(3)
Messenger+Behaviorを理解するために自作してみた(1)-(3)

でとりあえず、コードビハインドにコードを記述せずに、ViewModelからViewを操作する
方法については理解したつもりだけれど、
それでも、今の僕の経験と知識では、コードビハインドに次のようなコードを書いても、
良いんじゃないかなーと思ってます。


こう主張すると、

「コードビハインドにView以外のロジックが入り込んでしまう」
「コードビハインドとViewModelとの蜜結合が起こってしまう」

という意見が出てくるのはわかっています。
しかし、Messengerを使うやり方よりも、こちらの方が、簡単だし、直観的で理解しやすいと思います。

Commandを実装する必要もないから、誰もがわかる普通のメソッドを定義すれば良いだけです。
そして、(XAMLも含めた)コード量も絶対にこちらの方が少ないと思われるます。
開発効率もそれほど変わらないように思います。

ユニットテストでは、ここでいうExecuteメソッドをテストすれば良いと考えます。
ダイアログ表示などは、UIテストでやると割り切っていいのではないでしょうか。
いままでもそうしてきたのだし、その方が自然だと思います。


ViewModelは、以下の3つをやることに専念して、ユーザとの対話は、コードビハインドで
やれば良いと考えます。

・データバインド
・データ検証
・Modelに記述したロジックの仲介

じゃあ、ダイアログを表示する必要が無い場合は、どうするのか?
これも、イベントハンドラで、ViewModelのメソッド呼べばよいと思います。
あとから、その前後でViewの処理をしたくなったら、イベントハンドラにViewのコード
を追加すればいいだけだから、簡単に対応できます。

ViewModelが起点となるView操作はどうか?
これも、ViewMdelのメソッドから戻り値をもらえばいいだけだから、なにも特別な仕組みはいりません。
場合によっては、デリゲート渡してCallbackしてもらっても良いかもしれません


Viewだけで閉じた処理を記述するのも、もちろん、コードビハインドで書けば良いと思います。
わざわざ、ViewModeを経由する必要はないと思います。 必要ならば、添付ビヘイビアを定義すれば良いです。
ただ、業務ロジックに直結するようなものは、添付ビヘイビアは向かない(と思います)。

上記のようにすれば、

・ViewModelの複雑さが軽減されます。
・XAMLも、若干すっきりします。
・XAMLとコードビハインドと、ViewModelとが、ちょうど良い按配でコードが分散してくれます。


ただ、ボタンの有効無効の制御の一貫性を保つのが面倒というのはあるかもしれませんが、
大した問題ではないと思います。
それに、常に有効にしておいて、ボタンを押したときにチェックしても良いんじゃないかと 思います。
無効にしてしまうと、なぜ無効なのかがユーザに理解されないこともありますし...

異論があるのは十分理解しているけど、これが現時点の僕の考えです。
将来この考えが変わる可能性は大いにあります。
それには、

・MVVMフレームワークがVisula Studioに標準として組み込まれる。
・フレームワークが複雑さが隠ぺいしてくれる。
・MVVMデザイナーがVisual Studioに搭載され、XAMLを直接編集しなくてもよくなる。
・これらにより、そのメリットを実感できる。

といったことが実現した時だと思っています。

もちろん、ViewModelを経由した書き方を否定するものではありませんし、
スキルのある開発グループでは、Command + Messenger + Behavior での
開発を採用すればよいと思います。


この記事へのコメント
私も同じ意見ですね。

View にコードビハインドを記述する点については、以下で軽くふれましたが、Gushwell さんとほぼ同じ見解です。

http://blogs.bitlan.net/ito/?p=1721

また、小規模で短期間しか使用しないようなアプリケーションでは、WPF アプリケーションでも MVVM ではなくイベントドリブンで作って良い場合もあると思っています。
Posted by 伊藤達也 at 2011年06月03日 13:54
伊藤さんの記事読みました。

>現時点では View と ViewModel の役割を把握した上で、これに基づいた分類をすることを優先し、必要に応じては View にコードを書いても良いと思います。

という意見は、ほぼ僕と同じですね。
Posted by Gushwell at 2011年06月03日 21:57
今でも考え方は変わりませんか?
最近MVVMを利用したプログラミングをしているのですが、
検索しているうちにこちらのページにたどり着きました。

記事が記入された時期がだいぶ前なので、
現在でも考え方が変わっていないか気になりました。
Posted by yoshi at 2015年03月17日 17:08
yoshi さん

最近は、Webアプリ、サーバーアプリが主になっていて、デスクトップアプリから離れてしまっていますが、もし、これからWPFなりのクライアントアプリ開発を行うとしたら、やはり当時の考えのまま、コードビハインドは使うと思います。それでも、Windows Formsに比べれば、その割合はかなり小さいと思いますが。
Posted by Gushwell at 2015年03月17日 20:41
Gushwellさん

回答ありがとうございます。
最初はあまり潔癖になり過ぎないようにして、ある程度慣れたらコードビハインドを整理したほうがいいのかもしれませんね。
MVVMでググって引っかかる有識者の方たちの多くが「コードビハインドに記述なんてナンセンス」という意見が多かったので、
何が何でもコードビハインドには記述しないようにしなくてはいけないんだと思っていたので、Gushwellさんの考え方に救われました!
Posted by yoshi at 2015年03月18日 14:30
yoshiさん

Model, ViewModel と コードビハインドの役割を正しく認識して、その指針に従って実装すれば良いと思います。手段が目的化しても何も良い事は無いと思います。
開発頑張ってください。
Posted by Gushwell at 2015年03月18日 20:56
Gushwellさん

>手段が目的化しても何も良い事は無いと思います。

そうですね!まさにそうなりそうでした!
ありがとうございます!!
Posted by yoshi at 2015年03月20日 12:23
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52147035