Download - MVC の Model を考える
![Page 1: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/1.jpg)
MVC のModel について
考える
codeArts (株) 政倉 智
![Page 2: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/2.jpg)
MVC ってこんなの
ModelModel
ControllerController
ViewView
![Page 3: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/3.jpg)
でも、こんなんなってません?
ModelModel
ControllerController
ViewView
![Page 4: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/4.jpg)
Controller が太るんです
● MVC って変更に強いはずなのに、なんかうまくいかない! ちょこっとしたことですぐ動かなくなる!
● こういう時はだいたい Controller にコードが集中していて太っている時
![Page 5: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/5.jpg)
MVC と三層アーキテクチャの対比
ModelModel
ControllerController
ViewView
データ層
ドメイン層
プレゼンテーション層
![Page 6: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/6.jpg)
Model はドメイン層
● MVC の Model はドメイン層 (ビジネスロジック) にあたる● Controller が太るのは、このドメイン層のコードを
Controller に書いているから!
![Page 7: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/7.jpg)
なんでそうなるのか?
● だって MVC のチュートリアルがそうだもの!
● Model をデータストアにして処理は Controller に書かれてる
![Page 8: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/8.jpg)
なぜ Controller に書くとダメなの?
● そもそもなぜ Controller に書いてはいけないのか
![Page 9: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/9.jpg)
MVC はだいたいこんな感じ
● 基本的に Controller は View の設計に引きずられる● Model はアプリの機能に引きずられる
View A
View B
Controller A
Controller B
Model
![Page 10: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/10.jpg)
Controller にビジネスロジックを書く● ドメイン層 (ビジネスロジック) を Controller に書くとこんな感じになる
View A
View B
Controller A
Controller B
Model
ビジネスロジック
![Page 11: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/11.jpg)
View A が必要なくなった!
● View A が必要なくなったとする
View A
View B
Controller A
Controller B
Model
ビジネスロジック
![Page 12: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/12.jpg)
あっ!
● 連鎖的に Controller A が要らなくなるけど、ビジネスロジックまで消えちゃう!
View A
View B
Controller A
Controller B
Model
ビジネスロジック
![Page 13: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/13.jpg)
しくしく...
● ビジネスロジックを Controller B に移動するはめに...
● ちなみにこれ、テストコードも同時なので最悪のパターン!
View A
View B
Controller A
Controller B
Model
ビジネスロジック
ビジネスロジック
![Page 14: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/14.jpg)
Model に書いておけば
● Model にビジネスロジックを書くと良いよ
View A
View B
Controller A
Controller B
Model
ビジネスロジック
![Page 15: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/15.jpg)
View A を消しても大丈夫
● View A を消しても大して影響がない● 少なくとも View B には一切影響がないね!
View A
View B
Controller A
Controller B
Model
ビジネスロジック
![Page 16: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/16.jpg)
ビジネスロジックは Model に!
● というわけでビジネスロジックは Model に書きましょう● AngularJS の場合は Factory という便利なものがあって、それを使いましょう
![Page 17: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/17.jpg)
Model がでかくなるだけじゃ?
ModelModel
ControllerController
ViewView
![Page 18: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/18.jpg)
実際そうなんです
● 今度は Model がでかくなってひーひー言います● でも、Controller が太るよりマシです● なぜマシかというと、Model は Controller と違って View の変更の余波を受けにくいからです
![Page 19: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/19.jpg)
小さく分割しましょう
● Model という一つのオブジェクトに色々させるのではなく、役割ごとに分割しましょう
● Controller から見て Model が一つのオブジェクトに見えれ ば OK! その向こうにたくさんのオブジェクトがあっても
問題ない
![Page 20: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/20.jpg)
例) キャッシュ
● サーバーから JSON データをもらって表示するだけの簡単なアプリ
● まずはキャッシュしないのをサッと作る
● View は割愛
Controller
Model
BaaS
![Page 21: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/21.jpg)
例) キャッシュ
● キャッシュ機能をつけてみる● 肝はもともとある Model にキャッシュ機能をつけようとしないこと
● まずは Model を BaaS に接続するものと、それを呼び出す二つに分ける
Controller
Model
BaaS
BaaS Client
![Page 22: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/22.jpg)
例) キャッシュ
● BaaS Client と同じ API を持つCache System を作る
● BaaS Client と Model の間にCache System を挿入する
● Controller から直接見えるModel が変わっていないのがミソ
● ほとんどのコードは追加なので、とても楽
Controller
Model
BaaS
BaaS Client(Model)
Cache
![Page 23: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/23.jpg)
例) 新着通知
● Facebook とかの新着通知です● 投稿だったり、チャットだったり、いろいろあります
投稿(Model)
チャット(Model)
新着(Controllerl)
チャット(Controllerl)
![Page 24: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/24.jpg)
例) 新着通知
● よく考えたら新着通知って何箇所かあったりするよね!
● 数付き数値アイコンと新着リストみたいな感じの
投稿(Model)
チャット(Model)
新着数表示(Controllerl)
新着リスト表示(Controllerl)
チャット(Controllerl)
![Page 25: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/25.jpg)
例) 新着通知
● 見ての通り似たような処理が Controller に書かれている● これがまた変更に弱くする
投稿(Model)
チャット(Model)
新着数表示(Controllerl)
新着リスト表示(Controllerl)
新着を抽出する
新着を抽出する
チャット(Controllerl)
![Page 26: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/26.jpg)
例) 新着通知
● こんな感じに新着情報を扱う Model を作ると楽になる
投稿(Model)
チャット(Model)
新着数表示(Controllerl)
新着リスト表示(Controllerl)
新着(Model)
チャット(Controllerl)
![Page 27: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/27.jpg)
MVC の役割
● Model/View/Controller という役割のクラスがあるのではない● クラスが Model/View/Controller のいずれかに分類される● Controller がたくさんの Model を扱うとかはあんまよくない● Model や Controller が複数のクラスから構成されていても全く問題ない
● AngularJS で .controller で宣言したものだけが Controller っていうわけじゃないよ!
● Backbone.js で Backbone.Model を継承した型だけが Model っていうわけじゃないよ!
![Page 28: MVC の Model を考える](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55af7bf21a28ab42568b4788/html5/thumbnails/28.jpg)
まとめ
● MVC のチュートリアルに惑わされないようにしよう!
● MVC Framework の使い方よりも MVC の利点を理解しよう!
● MVC Framework は大枠を提供するためのもの、その大枠の中でさらにクラスを分割していくのはプログラマーのお仕事
● 余談だけど、似非 MVC で書くと、最悪は MVC Framework なんてない方が良かったんだ! ってなることもあるよ!