田舎の技術者が奮闘中

php ruby node.js javascript などのスクリプト言語とサーバー(Chef、Vagrant)に関して書きます。

cakephpやRailsのMVCデザインパターンに関して

私は開発する際に、cakephpなどのフレームワークを必ずと言っていいほど使用しています。便利だし、クラスなどの役割が明確になるので、誰が触っても似たような感じになります。

フレームワークを使わない場合でも、いつもいつもMVCで開発するべきだと、会社の後輩にも口を酸っぱくしていっているが・・・私の考えているMVCは実はMVC2と呼ばれているものでした。

私の無知さを教えてくたのが、以下の記事である。

PHPerのMVCの一体どこが間違っていたのか - MugeSoの日記

この記事を読んだ時に、理解が出来ませんでした。
何故ModelからViewを参照しているか?CakephpにModelを監視するクラスやメソッドが無いし、そもそもModelクラス自体呼び出す事が出来ません。(例外はあるけど、標準ではない)

全然納得が出来ませんでした。

でも、このままでは間違った認識で、後輩たちに情報を発信してしまうと思い、独自ではあるが調べてみました。

まず、MVCとはデザインパターンの一種で(Wikiではソフトウェアアーキテクチャとなっている)
機能ごとの分離が明確になることによって、それぞれの独立性が確保されます。開発においては分業がしやすくなり、デザインとプログラムの並行作業が容易になります。また機能がわかれているので、テストケースなども書きやすくなります。というところでしょうか・・・他にもあるかもしれませんが。

Model モデルは、システムの中でビジネスロジックを担当する、いわばシステムの本体部分にあたります。
View 表示、入出力といった部分を担当します。
Controller ViewとModelを制御します。自分自身では表示を行ったり、ロジックの実行は行わず、Viewからの入力に応じて、必要なロジックの実行をModelに依頼し、その結果表示をViewに依頼します。

参考:Java Solution FAQ:MVCモデルという言葉をよく聞きますが何のことですか?

ここでも私の認識と違っていました。
Modelとはデータベースのデータを引っ張ってくる所、だけではなくビジネスロジックなども担当する部分です。例えば、データを取得するだけではなく、データの加工や変わらない処理(アプリケーション固有の処理やルールを記述)などは全てModelに書くべきだと思います。
Modelに処理を書くことでControllerの肥大化も防げます。またテストケースなども書きやすくなります。

ここで一番以外だったのが、ViewからModelを参照していいとのこと。
はい、えせMVC使いの私としては驚愕の事実ですね。
でも、実際に参照って何するのか全く分かりません。ここで一番ハマりました。
Observerパターンがそれに当たると思いますが、WEBの特性上毎回HTTPリクエストを経由する必要があり、Observerパターンなんて使えるわけがありません。
ですので、CakephpにしろRailsにしろView→Modelという流れが全くなくなっています。
(webSocketなどで似たような処理をできるかもしれませんが・・・)

参考:MVC と MVC2 について改めて考えてみる - スタジオ・アルカナ技術ブログ

もうこの時点でMVCデザインパターンではないのです。

以下の記事もえせMVCをdisってます。

参考:やはりお前らのMVCは間違っている
参考:Life is beautiful: Ruby on Railsの「えせMVC」の弊害
参考:「えせMVC論争」についてこそこそと一言言っておくか - uehaj's blog

では、何なの?という話ですが、MVCではなく、MVC2という定義をしています。
MVC2とはObserverパターンが欠損したMVCになります。

ですので、これからCakephpRails使いの方が気をつけることは・・・

  1. MVCではなくMVC2が正しいということ。
  2. Modelにはビジネスロジックを書く部分。
  3. Controllerの肥大化を防ぐ(Modelに処理を書く)

といったところでしょうか
cakephprailsMVCとか言ってしまうと小馬鹿にされちゃいますんで、「MVC2だよねぇ」とかで濁しておけばOKだと思います。

その他参考:CakePHPを使ったMVC設計のベストプラクティス - Sooey
その他参考:Web アプリの MVC 設計まとめ - もやし日記