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をdisってます。
参考:やはりお前らのMVCは間違っている
参考:Life is beautiful: Ruby on Railsの「えせMVC」の弊害
参考:「えせMVC論争」についてこそこそと一言言っておくか - uehaj's blog
では、何なの?という話ですが、MVCではなく、MVC2という定義をしています。
MVC2とはObserverパターンが欠損したMVCになります。
ですので、これからCakephpやRails使いの方が気をつけることは・・・
といったところでしょうか
cakephpやrailsはMVCとか言ってしまうと小馬鹿にされちゃいますんで、「MVC2だよねぇ」とかで濁しておけばOKだと思います。
その他参考:CakePHPを使ったMVC設計のベストプラクティス - Sooey
その他参考:Web アプリの MVC 設計まとめ - もやし日記