定義
MVCパターンとは、ひとつのソフトウェアを、データ(Model)、画面(View)、制御(Controller)という3つの役割にうまく分けて設計する方法です。それぞれが自分の担当範囲だけに集中できるようにすることで、複雑なプログラムを保守しやすくしてくれます。
三人組の完璧な分業
レストランで、料理人が注文も取り、配膳も会計もひとりでこなそうとしたら、厨房はあっという間にめちゃくちゃになってしまいます。だから、注文を取る人、料理を作る人、料理を盛りつけるお皿の役割は、きっちり分かれています。ソフトウェアも同じです。
まずモデル(Model)は、レストランの厨房であり食材の倉庫です。ユーザーが目にする実際のデータや業務のルールを、安全に保管して処理します。会員情報や投稿の内容、ポイントの計算式といった核心部分がここに入ります。
次にビュー(View)は、お客さんが座るテーブルとすてきなお皿です。スマホやモニターの画面のように、ユーザーが目で見て、タップしたりクリックしたりするあらゆる見た目の部分を担当します。データがどんな形をしているかを、きれいに見せることだけが仕事です。
最後にコントローラー(Controller)は、間に立ってせっせと動き回るウェイターです。ユーザーがボタンを押すと、その注文(リクエスト)を受け取ってモデルに伝え、モデルが処理した結果をビューに渡して、画面を更新します。
なぜわざわざ3つに分けて作るのでしょう?
画面のデザインをまるごと新しくしたい場面を思い浮かべてみてください。もしデータ処理のコードと画面デザインのコードがひとつのファイルの中でごちゃ混ぜになっていたら、文字の色をひとつ変えようとしただけで決済機能が壊れる、という大惨事が起こりかねません。
MVCパターンを使えば、画面のデザイナーとサーバーの開発者が、お互いの領域に手を出さずに、それぞれ独立して作業できます。画面デザインをどれだけ大きく作り替えても、データを処理する中心となる業務ロジックは安全に守られるからです。
さらに、同じ会員データ(Model)を使って、モバイルアプリの画面、Webサイトの画面、スマートウォッチの画面など、さまざまな形のビュー(View)を簡単につなげられます。コードを再利用しやすくなり、バグを探す時間を減らすのにも役立ちます。
もう少し正確に言うと
実際の開発現場では、使うプログラミング言語やフレームワークによって、MVCの具体的な動き方が少しずつ変わります。初期のデスクトップ用プログラムでは、ビューがモデルの変化を直接見張っていて、画面を自分で書き換えることもありました。
しかし、Webサービスが中心の現代の環境では、ほとんどの作業が「ユーザーのリクエスト → コントローラー → モデルの処理 → ビューの画面更新」というはっきりした一方向の流れで進みます。コントローラーが交通整理をしっかり担当するとき、構造がいちばんシンプルになるからです。
最近では、MVCパターンを変形したMVPやMVVMといった設計パターンも広く使われています。形は少しずつ違いますが、目指すところはひとつです。関心の分離(Separation of Concerns)によって、コードを丈夫で、すっきりした状態に保つことなのです。
よくある誤解
MVCパターンを使えば書くコードの量が減るので、開発は必ず速くなる。
ファイルとルールが3つに分かれるため、最初のうちは作らなければならない基本のコードがむしろ増えます。その代わり、プロジェクトが大きくなったときに、コードの修正やバグの対応といった保守がしやすくなりやすいのです。
日常で出会う場面
ログインボタンを押したとき:コントローラーがIDを受け取ってモデルに確認を依頼し、一致すれば成功画面(ビュー)を表示します。
ショッピングサイトで「価格の安い順」を押すと、コントローラーがモデルから並べ替え済みのデータを受け取り、ビューの商品一覧だけを描き直します。
つまり ひとことで
データ(M)、画面(V)、仲立ち役(C)に役割を分けて、プログラムをすっきりと、直しやすく作るための設計の考え方です。