読者です 読者をやめる 読者になる 読者になる

アナログ金木犀

つれづれなるまままにつれづれする

プレゼンテーション層とモデルにおける自分の考え方

いつも設計するときは3層なり4層なりのレイヤーを意識して書いてるのですが、今日はプレゼンテーション層とそれより下の層(まとめてモデル)を分けるときの自分なりの考え方について。

ちょっと言い切っちゃってるところあります。

プレゼンテーション層っていわゆるMVCでいうところのVCがある場所です。表面に見えてる部分です。

そもそもMVCの目的って記憶ではMVC作ったレインスカウさんが言ってたと思んですが、「プレゼンテーション層とモデルを分けること」なんですよね。

で他のMVVMとかも最近また復活してきたMVPのMVC派生達ももちろんその思想は一緒なんです。

ちょっと余談のような余談じゃないような話をはさんでおくと、レインスカウさんはMVCのVCをもうToolって呼んじゃおうぜ!とも言ってたみたいですが、こっちはあまり広がらなかったみたいです。

レインスカウさんは人の考えているメンタルモデルをいかにプログラムに落としこむかを考えていたと思っていて、で、そのメンタルモデルをプログラムに落とし込んだものをMVCのMと考えていたわけです。

で、そのメンタルモデルではないところ、人とモデルをつなぐものをToolって呼ぼうって感じだと思います。

ただ、「なるほどプレゼンテーション層とモデルを綺麗に分ければいいのね!」とは言ってもモデルの境界線ってのが始めの方が難しかったりして、いつの間にかモデルの領域にプレゼンテーション層が侵食していってウォールマリアが破壊したりするわけです。

そうならないためにはどうするか?

僕の場合は、ある程度設計が決まった時に一度「プレゼンテーション層ごっそり変えたとしても大丈夫だよね?」って考えるようにしています。(最近は割と無意識だけど)

「プレゼンテーション層ごっそり変える」ってのがピンとこない人は例えば「今作ってるやつ、コマンドラインにしても動くよね?」とか極論「音声だけで操作するようになっても動くよね?」って考えてみるといいんじゃないかなと思います。

そうすることで、結構作るべきモデルってのが見えてきます。

例を出すと、「学校のクラスのみんなの数学の点数を表示する」アプリを作るとします。その場合のモデルはどこかっていうと「学校のクラスのみんなの点数を取りだす」ってところで、プレゼンテーション層は「取り出したものを表示する」ってことになります。

でさらに「40点より下は赤色で表示する」という仕様があったりします。

このロジックはどこに入れるべきか。

ここで一度「これ、音声だけでも動くよね?」と考えてみます。

音声でコントロールして、音声が返ってくるアプリの場合、(音声に色なんて普通の人は感じれないので)そもそも「40点より下は赤色で表示する」ってのは無理な仕様なわけです。

よってこのロジックはプレゼンテーション層が何であるか?に依存しているってことがわかって、つまるところ今回は目に見えるアプリのプレゼンテーション層の持ち物であることがわかります。

ちなみにあのMartin Fowlerさん的にはこういうプレゼンテーション層に依存するロジックはただのMVCでは置く場所がない。だから「プレゼンテーションモデル」ってのを作ってそこに書こうぜと言ってたりします。

あと勘違いしそうなんですけど、メンタルモデルと仕様は別物です。仕様はプレゼンテーション層も含んでます。

とまぁ、こういう感じで設計するときに一度立ち止まって「これ、VCごっそり変えても動くよね?」ってなってるか考えることをお勧めします!

(もしかしたら例が悪かったかも。。。)