37
39

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Re: 私家版MVCべからず集

Posted at

はじめに

下記の記事を読んだので、せっかくなので私の考えも述べようかと思う。

@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の仕事。

@t_ishida

必要であれば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>要素にmaxlengthrequired属性をつけて検証していたりする。Controllerでするのが妥当なバリデーションもある。

Rails4では「Strong Parameters」という機能が入りまさにControllerで検証を行っている。
あるモデルのある個所を変更してよいかは「モデルの責務」ではなく「WebAPIの責務」だという考えかたのようだ。

おわり

いろいろ書いたがこういうのは理想論に近いので、無理のない程度に自分の理想を追いかけるのが良いと思う。

37
39
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
39

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?