はじめに
タイトルはナウでヤングなネットサーファーにバカウケする感じにしてみた。
一応先に言い訳すると、デザインパターンなどのソフトウェア概念については自分の知識がまだまだ乏しくて学習段階なので、間違ってることがあります。そのときはご助言お願いします><;
MVC, MVVM, MVW, …..
世の中にはMVC(モデル,ビュー,コントローラー)と呼ばれる設計・実装するための技法が存在する。小規模なアプリであればいざ知らず、大規模なアプリであるとコードの複雑性が上がるので、それをちゃんと体系づくって見通しよくしたい。それらを開発者共通の認識としておけば色々都合が良いのですね。
ただ、MVCそのものの説明については何回読んでも難解でございます(ぬまさんリスペクト)
- ModelなるものとViewなるものとControllerなるものがある・・・?
- Viewはなんだか描画するものっぽい・・・?
- Modelはなんだか描画したりするのに使うデータっぽい・・・?
- じゃあデータベースにあるデータはModelだよね・・・?
- ControllerはModelとViewを橋渡しする・・・?
だいたいこの程度はわかる気がしますが、上記の認識のままだと、実際に開発すると綺麗に3分割できない事象がたくさん出てきます(主に悩むのはModelかControllerなので2分割かな?)。というか僕がそうでした。
例えば、データをフィルタリング(条件にマッチしたデータだけ返す)するロジックはどこに書く?Viewではないことは確かですが、ControllerかModelか・・・?ModelはしかしながらデータなんだからControllerかな?
_人人人人人人人人人_
> Fat Controller <
 ̄Y^Y^Y^Y^Y^Y^Y^Y ̄
世知辛い世の中です。良かれと思って考えて挿入したコードが、「これじゃコントローラーが肥大化するよー」と言われるのですから。つらい。しかしそう云う人も悪意があるわけではなくて、押し込められたコードは可読性を下げます。なのでちゃんとしたいということです。
ところでこの例(データをフィルタリングするロジック)だと、どこに何をすればいいのか?ということですが。。。言語やフレームワークの事情が色々あるので一概には言えないですが、Javaだったらモデル層に DataAdapter クラスを作って List を返すようにするのがいいのかな、とふと思いました。が、いやしかし List を継承したクラスを書いてそこにロジックを書くほうが良いのだろうか、とか色々思うところはあります。あと「データ」がSQLiteにあるなら直接クエリ叩いて得たものを返せばいいわけで、結局やはり一概には言えないのかも。助けて!
まぁそれはそれとして。
MV○についての長年のモヤが晴れるたった1つのスライド
最近はそういうもやもやをずっと抱えていたのですが、Twitterで流れてきた以下のスライドを見てすごく腑に落ちました。
このスライドは(Windowsのソフトウェア開発で提唱されている)MVVMパターンについて書かれていますが、MVVMについての説明がこのスライドの本旨ではなくて、
MVVMのよく云われる説明だけだとMVCとの違いがわからないし何も説明できてない、ちゃんと理解しないとMVVMの旨味を享受できないからちゃんと基礎部分から説明するね(そもそもなんでMVCに代表されるパターンが必要なのかも)
という感じだと僕は理解しました。
これを読んでからさっきのWikipediaを読んでみると、あんま大したこと書いてないという印象です。だってMVCパターンは各アーキテクチャの都合を叶えるためにあるのだから、MVCそのものの説明はかなり抽象的にならざるを得ない。
また、このスライドは結局MVVMを強制しているわけでもない感じです(わかったうえで型を崩すことについても言及している)。「MV○使え!」と強制されるより、「MV○使わなくてもいいけど使ったらこういう利点あるよ〜」のほうが心理的に受け入れやすい感じがするのは僕だけではないはず・・・。たぶん。
まとめ
どこかしらから怒られそうな感じもしないでもないですが、特定の事情を考慮しないMVCパターンのあるべき論というのは不毛な感じがしました。モデルとコントローラが言語やフレームワークのわがままをうまくやるためのアイデアであるなら、その言語やフレームワークでのあるべき論を追求することは出来ても、抽象概念のMVCパターンには関係のない感じがします。(だからAngularJSのMVWパターンがこうあるべきだ、は成立しえても、MVCとはこうあるべきだ、についてはフレームワークや言語の事情があるので話がオチない)
まぁそんなわけで、まだまだ勉強せねばならないですね。