榊原昌彦

2014/07/06

[初心者向け] MVCモデルを実務から考える。構造から考えるから理解できないんだって。

記事のアイキャッチ画像

こんにちは、榊原です。
システム開発をしていると、ちょっとコードに慣れたあたりで「MVCモデル」という未知の世界に直面するのですが、Wikipediaみても適当に検索しても「構造としてこういうものでしょ」という記事が大半で、理論としては理解しても実感としてはわかりにくかったというのが私の実感です。
そこで、構造という観点以外の実務的な観点からMVCモデルについて書いていきます。

Viewがわざわざ分離されている理由

まず、フレームワークを使わずにMVCモデルを理解しようと思うと、意味がわからなくなります。私もなりました。以前書いた、私のようなhtmlの延長線上でphpをさわった人にありがちだと思います。
 
まず、MVCモデルを確立しているサイトの多くは、公開フォルダにはindex.phpのファイルが存在します。ここに、company.phpとかそういった個別ファイルは存在しません。
 
「いやいや、URLみるといろいろフォルダ分けされて「ファイル名.php」とかファイル名持ってるじゃん」
 
と私も思ってた時期はありますが、あれは見せかけです。そんなファイルはありません。
例えば、
[html]
http://hoge.jp/category/php/page/219.php
[/html]
というURLが仮にあったとしましたら(わかりやすいように架空のURLを書いています)実際のところは、
[html]
http://hoge.jp/index.php?category=php&page=219
[/html]
というファイルパスでして、それを.htaccessを使ってそう見せかけてるだけです。最後の.phpとか、ただURLを書き換えてそう表示してるだけで何の意味も持っていません。
 
イメージとしては、このGET値によって分岐しまくってテンプレートを呼び出してると考えて下さい。
だからこそViewファイルを分離することは必然なのです。だって、1つのファイルに長々とViewファイルのif文書いてられないじゃないですか(笑)
 

ControllerによってViewを分岐する

350px-ModelViewControllerDiagram2.svg
URLからまず呼び出されるのはControllerです。多くのフレームワークでは、GET値と一致するControllerが呼び出されるようになっています。なので、categoryというURLがあったら、Controllerは
[php]
class Category(){
}
[/php]
という名前で書かれてる場合がほとんどです。で、このコントローラーの中で、Viewテンプレートを呼び出す処理をしたりします。echo とか書くと、そのまま表示されます。
 
ちなみにModelは端的にいうと、Controllerの中でデータベースに接続するコード(例えばPODとか)だけを抜き取ったものです。
 

コードの再利用性と作業分担、セキュリティ対策ができるからMVC

ちなみに、別にMVCにしようとしなければ 「ControllerでView部分も書いてしまえばいい」ということも可能だったりします。URL振り分けで呼び出されたあと全ての処理をControllerでしようと思ったらできてしまうわけで。
いや、そんなことを言い出すと、Viewを分離せずに、company.phpとか、mail.phpとか個別で全部つくることだって可能なわけです。
 
ただ、そんなことをしますと、まず同類の処理でもいちいち記述する羽目になります。別Controllerを呼び出すと全ての処理を呼び出してしまうわけですから。もちろん引数をつけてパターン化するという選択肢もありますが、そんなことするよりもModelなりViewなりを外に出して呼び出す方が効率がいいわけです。
MVCモデルってコードを再利用しやすいのです。
 
あと、作業分担。
分業協業しようとすると、どっかのパーツを外注して作ってもらう、とかいうことになります。その時、「このページのすべての処理書いてね!」だとDB構成からはじまりいろいろなbackgroundを全て説明しないと作業にならないです。けど、このControllerだけお願いね!とかいうのは非常にやりやすい。デザイナーにViewだけ作ってね!ルールはこれね!っていう方が何倍も分業協業に対してコストは低い。
 
ついでにいうと、どっかでPHPエラー出したからシステム全部が止まる、ということも避けられます。
望ましいことではありませんが本番環境で作業せざるえないこともあるわけで。MVCを分離しているとどっかのコードを間違えててコンパイル通らなかったから「すべてのページが」エラーを返す、といったことは避けられます。
また逆にいうと、問題点の特定も非常にやりやすい。「ユニットテスト」という、コード単体をテストしてバグを探すようなことも可能となります。
 

まとめ

以上、「MVCモデルはこういうものだ」から一歩足を踏み出して、MVCモデルで作られてるサイトの処理とその必然性という観点からMVCモデルについてご紹介しました。ただ、ざっくんばらんで厳密な定義なく書きましたので、あくまで初心者の入り口として活用していただければと思います。
ちなみに、もっと詳しく知りたい方は

が詳しいです。でも一番勉強になるのは、MVCモデルを採用しているフレームワーク(私はCodeIgniterで理解しましたw)を一度使ってみるのがいいかと思います。
 
それでは、また。

Cookieを利用します

このWebサイトでは、Google Analyticsをアクセス解析のために導入しており、個人データであるCookieにアクセスします。引き続き利用する場合はCookieの利用への同意が必要です。

同意する