先にまとめ
- RailsのMVCと原義のMVCは異なる
- ビジネスロジックはModelに実装する
- Skinny Controller, Fat Model
- RailsにはFat Modelをリファクタリングする仕組みが色々あるよ
MVCの目的
コードの再利用性と関心事の分離
- コードの再利用性 : ビジネスロジックをModelに詰め込むことで、コードの再利用性を上げる
- 関心事の分離 : 役割を分けることで見通しを良くする
MVCの役割
Model
- データの保持
- ビジネスロジックの実行
- データの変更をViewに通知
View
- ユーザインターフェースの表示
Controller
- 入力をModelへのメッセージに変換して、Modelに伝える
処理の流れ
- 何かしらの入力イベントをControllerが受け取る
- ControllerがModelにメッセージを投げる
- Modelはメッセージにもとづきビジネスロジックを実行
- Modelはデータ更新イベントをViewに投げる
- Viewは、Modelからデータを取ってきて、画面を更新する
RailsのMVC
微妙に違う
RailsのMVCで勘違いしがちなこと
Model ≠ ActiveRecord
じゃあ ActiveRecord って何よ?
- デザインパターンの一種 → Active Record
- 以下のことを行う
- DBとのやり取りの抽象化
- データそのものの抽象化
Railsでは、ModelとDBとのやり取り、および、Model内のデータの抽象化にActiveRecordを使っている
Controllerがビジネスロジックを持つ
Modelはデータを保持するだけで、Controllerがビジネスロジックを持つと勘違いしてしまう
Controllerはビジネスロジックを持たない!!
MVCでは、Modelがビジネスロジックを持つ
Modelが持つもの : 出力がコンソールやモバイルに変わったとしても変わらない部分(ビジネスロジック)
Controllerのお仕事は以下の2つだけ
結果、Controllerがシンプルになり、Modelにビジネスロジックが詰め込まれる
これを、 Skinny Controller, Fat Model といい、Railはこの設計思想を推奨している
RailsWayに乗るなら Skinny Controller, Fat Model
Fat Model でも、詰め込む先が違うだけで、神classになることに変わりはないのでは?
そのためにRailsは、Modelの中身を仕事・役割毎に分離する方法を色々持ってる
- ActiveRecord::Callbacks
- ActiveModel::EachValidator
- ActiveModel::Validator
- Formオブジェクト
参考
- Ruby - てめえらのRailsはオブジェクト指向じゃねえ!まずはCallbackクラス、Validatorクラスを活用しろ! - Qiita
- 肥大化したActiveRecordモデルをリファクタリングする7つの方法(翻訳) | TechRacho