ネイチャーエンジニアのモノづくり術

プログラミング、フリーランス、コンテンツ制作に関する情報を発信します。

MVCモデルとは?プログラム設計におけるメリットやMVVMも解説

MVCモデルって何?

どんなメリットがあるの?

こんな疑問にお答えします。


ネイチャーエンジニアの亀田です。


MVCモデルは、プログラミングにおける設計概念です。


最も基本的なMVCを元に、MVC2やMVVMなどの派生型も登場しています。


この設計概念を正しく使うことができれば、システムの開発・運用コストを減らすことができます


今回は、このMVCモデルを解説します。




 

MVCモデルとは

f:id:kkamedev:20180807161123j:plain

MVCモデルとは、プログラミングにおける設計概念です。


システムを以下の3つのパートに役割分担する考え方です。

・Model
・View
・Controller


この3つのパートの頭文字を取ったものが「MVC」です。


図にすると以下のような関係になります。


■ MVCモデル図

MVCモデル

Model

・データ
・データを取得する処理
 → DBアクセスしてデータを取得する、など
・ビジネスロジック(システムや業務固有の処理)
 → 入力に対する計算処理/チェック処理、など


MVCの考え方では、システムのコアな処理はModelで持つことになり、Modelの処理が肥大しがちです。

View

・ユーザーへの入出力
・ユーザーへの入力をControllerに受け渡し
・Modelに変更があった場合は、出力に反映


画面での入出力など、ユーザーと直接やり取りするのはViewの役割です。

Controller

・Viewから受け取った入力情報を元に、Model/Viewへの指示出し


計算処理や描画処理などの具体的な処理は持たず、あくまで仲介役です。

MVCモデルのメリット

最大の目的は「開発・運用コストを減らすこと」。


MVCモデルに限らず、システム設計をする目的はこれです。


MVCは多くのプログラマが知っている言葉だと思いますが、色んな設計手法がある中で、なぜMVCモデルがこれほど浸透しているのか?


それは、MVCモデルが「実用的かつシンプルな考え方」だから。


MVCモデルは、システムの登場人物をシンプルな3つの役割に定義しているだけです。


シンプルなものは、どんな人にも理解しやすく、認識の齟齬が起きにくい


シンプルであることは大きな強みなのです。


しかしながら、シンプルなだけではダメで、実用的であることも大事。


その点MVCは、「役割分担することで影響範囲を限定できる」という実用性があります。


例えば、


「表示項目Aの値がおかしい」
→AのViewの表示処理と、その中で使っているデータの値を確認


「画面で入力したけど、画面上で何も起こらない」
→Controllerに入力が来ているか、Controllerからの指示出しが正しくできているか確認


と、このように、役割が定義されていることで、問題の迅速な調査・実装が可能です。


これは以前の記事で紹介したオブジェクト指向でも同様で、役割を定義することで開発スピードを高めています。


合わせて読みたい

オブジェクト指向のメリットとは?【プログラミング設計に役立つ】


システムにおける開発・運用コストの多くは、「人件費=実装時間」です。


なので、MVCモデルを活用することでコスト削減が可能になるのです。

MVCモデルの派生型

MVCモデルには、いくつかの派生型があります。


基本はMVCの考え方ですが、システムの特性に応じて役割を変化させたものです。

MVC2

■ MVC2モデル図

MVC2モデル


Webアプリケーションのやりとりで見られる形です。


1. ユーザーからのアクセス(=アクション)でControllerに飛ぶ
2. ControllerがModelとやりとりしてレスポンスを決める
3. ControllerがViewにレスポンスを渡して結果出力


といった感じに、Controller → Viewに単方向に処理が流れる形になっています。

MVP

■ MVPモデル図

MVPモデル


Controllerの代わりにPresenterがいて、こいつはViewとのインターフェースになっています。


ViewとModelは完全に独立しています。


図からは推測しづらいですが、Presenterは表示単位ごとに複数存在する設計になるかと思います。

MVVM

■ MVVMモデル図

MVVMモデル


Controllerの代わりにViewModelになっています。


これはリアルタイムな更新を反映させるのを想定しているモデルです。


例えば、システムからViewModelに時間経過などの通知があった場合に、その情報をViewに伝えて出力結果に即時反映させる、といった形です。

MVCモデルの注意点

「MVCモデルのメリット」でお伝えした通り、その特徴は「シンプルな考え方」であること。


ただ、それこそがMVCモデルを使う上で最大の足かせにもなります


なぜなら、現実的なシステムは「そんなにシンプルではない」からです。


MVCの形に収めるのは理想的ですが、一定以上の規模のシステムでは、MVCモデル通りの設計に収まることはほぼないのではないでしょうか。


・ユーザー以外からの入力がある
・非同期処理がある
・出力対象が1つではない


などなど。


これらがあるシステムでは、MVCのシンプルな設計に落とし込めず、どうしても例外事項が出て来ます。


また、無理にMVCの形におさめようとすると、都合の悪い部分も出てくるでしょう。


例えば、「何でもかんでも特定のControllerに判断を仰ぐようにしたら、入力の引き継ぎが大量になって、見通しが悪くなった」など。


なのでMVCを活かすためには、応用力が問われるのですね。


設計の目的は、特定のパターンを再現することではありません


システムの特性や規模、チームメンバーのスキルに合わせつつ、柔軟に使う必要がある、ということを覚えておきましょう。

おわりに

MVCモデルは、

・「実用的かつシンプル」なプログラム設計の概念
・「役割分担することで影響範囲を限定できる」メリットがある
MVC2MVVMといった派生型がある
・現実的なシステムはシンプルでないので、実戦で使いこなすには設計スキルが必要になる


といったことをお伝えしました。


MVCモデルは大変有効な手法ですが、使いこなすためのスキルも必要です。


うまく使いこなせないと、有効どころか逆に複雑になってしまいます


MVCモデルは、あくまで「シンプル」に考えられることが強み。


やってみてシンプルでないと感じたら、


MVCモデルに無理に捉われすぎていないか
MVCモデルに収められる仕様なのか


を見直してみましょう。


プログラム設計自体のメリットや、設計スキルを高める方法は以下をどうぞ↓


合わせて読みたい

プログラム設計は何のためにするのか?【有効な設計パターンも紹介】


この記事があなたのお役に立てば嬉しいです。


では、また。