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

Mais conteúdo relacionado

Mais procurados

iOS/Androidアプリエンジニアが理解すべき「Model」の振る舞い
iOS/Androidアプリエンジニアが理解すべき「Model」の振る舞いiOS/Androidアプリエンジニアが理解すべき「Model」の振る舞い
iOS/Androidアプリエンジニアが理解すべき「Model」の振る舞いKen Morishita
 
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発慎一 古賀
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring増田 亨
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう増田 亨
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
WPF開発での陥りやすい罠
WPF開発での陥りやすい罠WPF開発での陥りやすい罠
WPF開発での陥りやすい罠Sho Okada
 
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめpospome
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ増田 亨
 
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようCognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようShuto Suzuki
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)Yoshitaka Kawashima
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
 
ゲームエンジンとMVC
ゲームエンジンとMVCゲームエンジンとMVC
ゲームエンジンとMVCAimingStudy
 
データベース設計徹底指南
データベース設計徹底指南データベース設計徹底指南
データベース設計徹底指南Mikiya Okuno
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかKoichiro Matsuoka
 
3層アーキテクチャとMVCモデル -LaravelにおけるMVCモデルの流れ-
 3層アーキテクチャとMVCモデル -LaravelにおけるMVCモデルの流れ- 3層アーキテクチャとMVCモデル -LaravelにおけるMVCモデルの流れ-
3層アーキテクチャとMVCモデル -LaravelにおけるMVCモデルの流れ-yoshitaro yoyo
 
オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門増田 亨
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
 
ドメイン駆動設計入門
ドメイン駆動設計入門ドメイン駆動設計入門
ドメイン駆動設計入門増田 亨
 

Mais procurados (20)

iOS/Androidアプリエンジニアが理解すべき「Model」の振る舞い
iOS/Androidアプリエンジニアが理解すべき「Model」の振る舞いiOS/Androidアプリエンジニアが理解すべき「Model」の振る舞い
iOS/Androidアプリエンジニアが理解すべき「Model」の振る舞い
 
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
WPF開発での陥りやすい罠
WPF開発での陥りやすい罠WPF開発での陥りやすい罠
WPF開発での陥りやすい罠
 
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようCognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しよう
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
ゲームエンジンとMVC
ゲームエンジンとMVCゲームエンジンとMVC
ゲームエンジンとMVC
 
データベース設計徹底指南
データベース設計徹底指南データベース設計徹底指南
データベース設計徹底指南
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
 
3層アーキテクチャとMVCモデル -LaravelにおけるMVCモデルの流れ-
 3層アーキテクチャとMVCモデル -LaravelにおけるMVCモデルの流れ- 3層アーキテクチャとMVCモデル -LaravelにおけるMVCモデルの流れ-
3層アーキテクチャとMVCモデル -LaravelにおけるMVCモデルの流れ-
 
オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
ドメイン駆動設計入門
ドメイン駆動設計入門ドメイン駆動設計入門
ドメイン駆動設計入門
 

Semelhante a MVC の Model を考える

T35 ASP.NET MVCを使ったTDD入門
T35 ASP.NET MVCを使ったTDD入門T35 ASP.NET MVCを使ったTDD入門
T35 ASP.NET MVCを使ったTDD入門normalian
 
MVCのつぎは・・・
MVCのつぎは・・・MVCのつぎは・・・
MVCのつぎは・・・Net Penguin
 
MVCになぞらえて理解するReact
MVCになぞらえて理解するReactMVCになぞらえて理解するReact
MVCになぞらえて理解するReactiPride Co., Ltd.
 
Asp Net Mvc 基礎のキソ
Asp Net Mvc 基礎のキソAsp Net Mvc 基礎のキソ
Asp Net Mvc 基礎のキソYoshitaka Seo
 
20130316 mix cpp-yuo
20130316 mix cpp-yuo20130316 mix cpp-yuo
20130316 mix cpp-yuoOKUBO_Yusuke
 
MVCフレームワークとの付き合い方
MVCフレームワークとの付き合い方MVCフレームワークとの付き合い方
MVCフレームワークとの付き合い方Kazuki Shibata
 
ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~Yoshitaka Seo
 
090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby CocoaTomoki Maeda
 
はじめての ASP.NET MVC
はじめての ASP.NET MVCはじめての ASP.NET MVC
はじめての ASP.NET MVCjz5 MATSUE
 
Separate Model from Catalyst
Separate Model from CatalystSeparate Model from Catalyst
Separate Model from Catalysttechmemo
 
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介david9142
 
ASP.NET MVC プログラミング入門の入門
ASP.NET MVC プログラミング入門の入門ASP.NET MVC プログラミング入門の入門
ASP.NET MVC プログラミング入門の入門Masuda Tomoaki
 
ASP.NET MVC と jQuery で実践する標準志向 Web 開発
ASP.NET MVC と jQuery で実践する標準志向 Web 開発ASP.NET MVC と jQuery で実践する標準志向 Web 開発
ASP.NET MVC と jQuery で実践する標準志向 Web 開発Akira Inoue
 
TableViewAgent
TableViewAgentTableViewAgent
TableViewAgentAkura Pi
 
Fuel php勉強会 1
Fuel php勉強会 1Fuel php勉強会 1
Fuel php勉強会 1Kazuya Igari
 
理論から学ぶデータベース実践入門Night(mvccでちょっとハマった話)
理論から学ぶデータベース実践入門Night(mvccでちょっとハマった話)理論から学ぶデータベース実践入門Night(mvccでちょっとハマった話)
理論から学ぶデータベース実践入門Night(mvccでちょっとハマった話)Hironori Miura
 
Xamarin.formsでのmvvm利用のコツ
Xamarin.formsでのmvvm利用のコツXamarin.formsでのmvvm利用のコツ
Xamarin.formsでのmvvm利用のコツMasuda Tomoaki
 

Semelhante a MVC の Model を考える (20)

T35 ASP.NET MVCを使ったTDD入門
T35 ASP.NET MVCを使ったTDD入門T35 ASP.NET MVCを使ったTDD入門
T35 ASP.NET MVCを使ったTDD入門
 
MVCのつぎは・・・
MVCのつぎは・・・MVCのつぎは・・・
MVCのつぎは・・・
 
MVCになぞらえて理解するReact
MVCになぞらえて理解するReactMVCになぞらえて理解するReact
MVCになぞらえて理解するReact
 
Asp Net Mvc 基礎のキソ
Asp Net Mvc 基礎のキソAsp Net Mvc 基礎のキソ
Asp Net Mvc 基礎のキソ
 
20130316 mix cpp-yuo
20130316 mix cpp-yuo20130316 mix cpp-yuo
20130316 mix cpp-yuo
 
MVCフレームワークとの付き合い方
MVCフレームワークとの付き合い方MVCフレームワークとの付き合い方
MVCフレームワークとの付き合い方
 
ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~
 
090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa
 
SpringBoot開発の基本
SpringBoot開発の基本SpringBoot開発の基本
SpringBoot開発の基本
 
はじめての ASP.NET MVC
はじめての ASP.NET MVCはじめての ASP.NET MVC
はじめての ASP.NET MVC
 
Separate Model from Catalyst
Separate Model from CatalystSeparate Model from Catalyst
Separate Model from Catalyst
 
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
 
ASP.NET MVC プログラミング入門の入門
ASP.NET MVC プログラミング入門の入門ASP.NET MVC プログラミング入門の入門
ASP.NET MVC プログラミング入門の入門
 
Slide
SlideSlide
Slide
 
ASP.NET MVC と jQuery で実践する標準志向 Web 開発
ASP.NET MVC と jQuery で実践する標準志向 Web 開発ASP.NET MVC と jQuery で実践する標準志向 Web 開発
ASP.NET MVC と jQuery で実践する標準志向 Web 開発
 
TableViewAgent
TableViewAgentTableViewAgent
TableViewAgent
 
Fuel php勉強会 1
Fuel php勉強会 1Fuel php勉強会 1
Fuel php勉強会 1
 
理論から学ぶデータベース実践入門Night(mvccでちょっとハマった話)
理論から学ぶデータベース実践入門Night(mvccでちょっとハマった話)理論から学ぶデータベース実践入門Night(mvccでちょっとハマった話)
理論から学ぶデータベース実践入門Night(mvccでちょっとハマった話)
 
Xamarin.formsでのmvvm利用のコツ
Xamarin.formsでのmvvm利用のコツXamarin.formsでのmvvm利用のコツ
Xamarin.formsでのmvvm利用のコツ
 
MVVM入門
MVVM入門MVVM入門
MVVM入門
 

Mais de tomo_masakura

アダプターパターンを使って リリースブランチを排除
アダプターパターンを使って リリースブランチを排除アダプターパターンを使って リリースブランチを排除
アダプターパターンを使って リリースブランチを排除tomo_masakura
 
Strategy パターンと開放/閉鎖原則に見るデザインパターンの有用性
Strategy パターンと開放/閉鎖原則に見るデザインパターンの有用性Strategy パターンと開放/閉鎖原則に見るデザインパターンの有用性
Strategy パターンと開放/閉鎖原則に見るデザインパターンの有用性tomo_masakura
 
HTML5 開発環境の紹介
HTML5 開発環境の紹介HTML5 開発環境の紹介
HTML5 開発環境の紹介tomo_masakura
 
HTML5 アプリ開発
HTML5 アプリ開発HTML5 アプリ開発
HTML5 アプリ開発tomo_masakura
 
Git トピックブランチと歴史の改ざん
Git トピックブランチと歴史の改ざんGit トピックブランチと歴史の改ざん
Git トピックブランチと歴史の改ざんtomo_masakura
 
今流行りのウェブアプリ開発環境Yeoman
今流行りのウェブアプリ開発環境Yeoman今流行りのウェブアプリ開発環境Yeoman
今流行りのウェブアプリ開発環境Yeomantomo_masakura
 

Mais de tomo_masakura (7)

アダプターパターンを使って リリースブランチを排除
アダプターパターンを使って リリースブランチを排除アダプターパターンを使って リリースブランチを排除
アダプターパターンを使って リリースブランチを排除
 
Strategy パターンと開放/閉鎖原則に見るデザインパターンの有用性
Strategy パターンと開放/閉鎖原則に見るデザインパターンの有用性Strategy パターンと開放/閉鎖原則に見るデザインパターンの有用性
Strategy パターンと開放/閉鎖原則に見るデザインパターンの有用性
 
HTML5 開発環境の紹介
HTML5 開発環境の紹介HTML5 開発環境の紹介
HTML5 開発環境の紹介
 
HTML5 アプリ開発
HTML5 アプリ開発HTML5 アプリ開発
HTML5 アプリ開発
 
HTML5 のお話
HTML5 のお話HTML5 のお話
HTML5 のお話
 
Git トピックブランチと歴史の改ざん
Git トピックブランチと歴史の改ざんGit トピックブランチと歴史の改ざん
Git トピックブランチと歴史の改ざん
 
今流行りのウェブアプリ開発環境Yeoman
今流行りのウェブアプリ開発環境Yeoman今流行りのウェブアプリ開発環境Yeoman
今流行りのウェブアプリ開発環境Yeoman
 

MVC の Model を考える