ビジネスロジックをどこに書くか

Rails をかじっていくと、主に view と controller がごちゃごちゃしてくる。

あまり考えずに作っていくと以下のような状態になっちゃった

  • view: 様々な action からの遷移で表示したいものを :action で判定したりするコードが増える
  • controller: model から様々な形式の検索方法でデータを取得してきてそれなりの配列とかに加工
  • model: あまり処理なし。ほとんど空

自分の実感としてはMVCで考えると以下のようなイメージ

  • view: レイアウトがわかるようなレベルで処理を書きすぎない。デザインは css なのかな。
  • controller: view と model の仲介だから model から取得した値をあれこれいじりすぎずに view に渡す。逆に view からもらったデータを画面遷移とかに必要な最小限のデータだけ見てあとは model に渡す
  • model: DBから取得する値に対するあらゆる加工を施すメソッドを持つ。controller からは必要最小限のメソッド呼び出しで必要なデータを取得できるようにする

ユニットテストの観点からも view とか controller のテストって結構面倒だと思っているので、なるべく複雑そうなところは model に押しこんでテストしやすくするというのもあると思う。

世間はどうかなと調べてみたら以下のようなサイトがあった。

大体方向性は一緒かな。どの層でもそれなりに書いて動かせちゃうからみんな悩むんだろうな。
MVCの役割をしっかり考えてコードを書かないといけない。で、たぶん共通処理など曖昧な役割の処理をどこに書くかでまた悩むんだろう。

今の認識は以下のような感じ。

  • view: 部分テンプレート、ヘルパ
  • controller: ヘルパ?
  • model: ヘルパ? 

そういえばDBに直結しない model というのもアリなんだろうか。それとか複数の model を束ねる modelとか。
この辺の実現方法も今後必要になりそうだから抑えておきたい。

それと、twitter で悩みをつぶやいていたら @snoozer05 さんから以下の参考サイトを教えていただいた。

これはわかりやすい。最初 view に全てのコードを書いてぐちゃぐちゃになっている状態から徐々に controller と model に正しい責務で処理を分割していく過程を説明してくれている。
この考え方をお手本にして今後取り組んでみよう。