はじめに
下記の記事を読んだので、せっかくなので私の考えも述べようかと思う。
@t_ishida さんが書かれている
他の人の考える「ぼくのかんがえるMVCべからず集」も読んでみたいです。
には私も同意なのでもっと投稿が増えるとうれしい。
それとQiitaにはトラックバック機能を用意してほしい。
私流MVCの分け方
私のMVCの分け方はこんな風だ。
if UIの仕事 || Webの仕事
if HTMLの生成
Viewに書く
else
Controllerに書く
end
else
Modelに書く
end
これに基づき、各項目について自分の意見を述べる。
回答
引用は、本投稿の先頭のリンク先のものです。
二つを分けるため後者からの記事にのみ @t_ishida さんの名前を書いておきます。
Model
DBにアクセスしていいのはModelだけ。
同意。正確に言えば「直接DBにアクセス」「SQLの生成」などはModelの仕事。
必要であればViewからも直接DBを見に行けるべきです。Viewが単純に表示したいだけの都合でModelやControllerが影響を受けるべきではない。
DBに触る場合はコネクションを張るなどの前準備が必要なので、そこらへんをモデルに書くとViewから直接ってのはあまり無いように思う。
Viewのこまごましたことにデータ用のインスタンスを作る必要はないという意味であれば同意。
Modelモジュール内にちょろっとしたstatic関数を用意してViewからそれを叩くのがよいと思う。
他のデータとの整合性など最終確認はModelで。
同意。
テストファーストで書く
テストは当然書くべきだが、それはMVCとは別。
あと私はテストは後に書く派です。
ここでprintとか絶対NG
このprintはどこへの出力だろうか。
- 標準出力へ書き込み
- ダメ。リポジトリにコミットする前に必ず取り除くこと。
- logファイルへの書き込み。
- 良いことだ。
- HTTPリクエストのレスポンスボディへの書き込み
- 同意。Viewに全投げすべき。
ここでWebサーバ由来の情報(SESSIONなど)があったら、何か間違ってる
同意。
View
ここでDBにアクセスしてたら何か間違ってる
同意。前述のとおり。
ここでIF文とかあったら、Controller側ですべきか検討する
IFはそんな大きな機能じゃないので一概に言えるものではない。
ユーザ一覧を<table>
で表示するViewが、ユーザがいないときは「ユーザは見つかりませんでした」と表示したいのであれば、IF文は必要だと思う。
Controller
ここでDBにアクセスしてたら何か間違ってる
同意。前述のとおり。
ここでバリデーションとかしてたら、何か間違ってる
Modelの箇所に「最終確認はModelで」と書いてあるのに同意する。
データの整合性のバリデーションはModelに書くべきである。
しかしユーザビリティのため同じようなコードをControllerやViewに書いてしまうことも多々ある。最近のWebアプリだとJavascriptで入力検証したり<input>
要素にmaxlength
やrequired
属性をつけて検証していたりする。Controllerでするのが妥当なバリデーションもある。
Rails4では「Strong Parameters」という機能が入りまさにControllerで検証を行っている。
あるモデルのある個所を変更してよいかは「モデルの責務」ではなく「WebAPIの責務」だという考えかたのようだ。
おわり
いろいろ書いたがこういうのは理想論に近いので、無理のない程度に自分の理想を追いかけるのが良いと思う。