MVC入門・何処に何書くの?




みなさん、あけましておめでとうございます。
プロクラスの野間です。
本年もよろしくお願いいたします。

今回はMVCの役割(考え方)についての紹介をしたいと思います。
ただ、MVC自体の説明ではなく、実際にMVC構成を作る際に
「(MVCの)どこに何を書いたら良いかわからない」との質問を受けたことがあるので、
具体的にどこに書くべきコードなのかについてお話をしたいと思います。

■まずはMVCの役割
MVCモデルとは
・Model
・View
・Controller
の頭文字を並べたものになります。
私がよく出会うのはWEBが多いので、WEBを具体例として進めたいと思います。

プログラムを1つのファイルに全て書くのではなく役割に分けて構成させましょうって事になります。
ここまで読んで必死に理解しようとしている方。
安心してください、まだ何も説明していませんので、ここまでの何かを理解しようとする必要はないです。(笑

ここではModel、View、Controllerの用語だけわかってもらえればOKです。

説明では利点を記述しますが、理解する上で最もわかりやすい例程度のものだと思ってください。
(利点なんて色々あるものです)

ここでは顧客一覧を表示するページを作る事をイメージして進めます。

■View
Model、View、Controllerと書いておきながら説明はViewからになります。
開発を行う際、複数人で行うことが多くなります。
特に画面周りはデザイナさんがとても綺麗なページをデザインしてくれます。
ですが、顧客一覧となるとDBに保存されている顧客のデータを取ってきて、時に別のデータと引っ付けたり、分離したりして表示する事になります。
HTML内にDBからデータを取ってきたり、引っ付けたり等のプログラムが書いてあるものをデザイナさんが編集するって無理があると思いませんか?

デザイナさんはHTMLやCSSは良くご存じだと思います。
ひょっとするとJSも書ける方も居られると思います。
ですが、ガッツリ書いてあるPHPをいじるのは無理があります。
(配置)分類を考えるうえでイメージしやすい考え方は「Viewはデザイナさん管轄」だと思うと良いと思います。
デザイナさん管轄なので可能な限りPHP等のプログラムは無い方がよいです。
「あるだけ表示」等の条件がある以上、全くプログラムなしってのは無理ですが、あくまで考え方の問題です。
プログラムを知らない方のファイルに間借りしている気分になれば「可能な限りコードを減らさないと」ってなりますよね。

Viewってそんな場所だと思ってください。
表示に必要なものだけに限定する。
全てのお膳立て済み状態にして表示するだけのコードにする。

(プログラムコードは出来るだけ無い方が良い)

■Controller
プログラムの構成でControllerと言われればなんとなく複雑に考えてしまいますが、
イメージしていただきたいのはゲームのControllerです。
多くの方に馴染みがあるのではないかと思いますが、ゲームのControllerの役割って何かわかりますよね?
まさかゲームのControllerで何か処理されているとは思わないでしょう?
全く持ってその通りで、ボタンを押下したら「パンチを出せ」と本体に指示を出すだけです。
Controllerの役割は正にここ、指示を出すことだと思ってください。

ブラウザからサーバにアクセスがあった場合、まず最初にControllerに処理が来ます。
そして色々と準備をして・・・最後に表示準備が整ったらViewを呼び出すことになります。

Viewの理想形はHTMLのみでしたが、Controllerの理想形は「指示を出すだけ」って事になります。

■Model
最後になったModelですが、これは要するに今までの説明で出てきたViewとController以外の全てがModelの仕事って事になります。
「以外の全て」と書くと凄く色々ありそうですが、簡単な話「実処理」って事になります。

ゲームで考えると、コントローラから「パンチを出せ」と言われたら「表示する画像の用意」や「相手にあたったか」の判定から「ダメージ計算」等の処理はModelに存在することになります。
ただ、実際のコントローラからの指示は「パンチを出せ」とした大雑把なものではなく「表示する画像の用意しろ」や「相手にあたったか判定しろ」当たっていたら「ダメージ計算しろ」等といった細かい単位になることが多いです。

補足
大まかな指示になるか細かい指示になるかは構成によって変わります。あくまで基本の考え方としてControllerは指示を出すだけであったり、具体的処理と処理のつなぎ合わせをしたり、個別処理をしたりが仕事になる点になります。

■簡単な具体例
以上を踏まえてユーザー一覧の表示を書くと次のようになります。
①ブラウザからアクセスがある
②Controllerに処理が来る
③Controller:Modelにユーザーデータ取得を要求
④Model:DBからユーザーデータを取得してControllerに返す
⑤Controller:Modelから取得したユーザーデータを表示しやすいように構成を変更する
⑥Controller:ユーザーデータをViewに渡す
⑦View:ユーザーデータを表示する

こんな感じになります。(表現上、多少の語弊が含まれています)

流れに直すと以下のような感じになります。

ブラウザ  
①アクセス
Model ③データ頂戴
←———-
Controller
④データだよ
———→
⑥表示しておくれ~
⑦はいよ~ View