開発ノート@HarikoApps

HarikoApps: https://hariko.sprkls.me

2024-06-09

Railsアプリのコード整理ではまずMVCの境界を意識するのが良い #6

仕事柄色々なRailsプロジェクトに触れる機会があるのですが、途中からJoinしたプロジェクトでコード整理に課題があるなと感じるとき、多くの場合MVCの境界違反が見られます。よくあるのはControllerにビジネスロジックを書いてしまうといういわゆる 「Fat Controller」ですが、他にはモデルにビュー用のロジックが含まれていたり、ビューにドメインロジックが混在している場合もあります。
このような場合に意識するべきはやはりまずはRailsのMVCだと思います。

  • M: Modelはビジネスロジックを担当します。ビジネスロジックはアプリケーションの中核となるロジックで担当業務について記述します。例えば販売管理のアプリケーションでは「商品の販売時に在庫を減らす」などのロジックになります。ModelはView, Controllerに依存しません。
  • V: Viewはユーザーに表示される画面を担当します。あるModelがあったときにそれがどのようにユーザーに表示されるかを決定する役割を担います。ViewはModelにのみ依存します。
  • C: Controllerはユーザー入力を受け取り、どのように処理するか決定します。ModelのビジネスロジックをコールしViewに表示部分を指示します。ControllerはViewとModelに依存します。

まずこれらの境界をしっかりと意識した上で「このロジックはどこに属するかな?」と考えるのが綺麗で持続可能なアプリケーションのコードベースを形作る上で非常に重要です。

Fat Controllerを解決しようとしてService層を導入すると言う事例はよく見かけるのですが、Serviceにロジックを詰め込みすぎてこれはドメインモデル貧血症ではないかと思うことも多いです。Serviceは手続型のコードになってしまうことが多いですし、ビューのロジックまで詰め込まれてしまうこともままあります。Service層を設ける前に素のRailsは十分に豊かである(翻訳)のような記事を参考にしてリッチなドメインモデルを構築することを意識すると良いのかなと思います。

そうすると次はFat Modelが問題になってくるのですが、膨らんできたModel層を整理するには「素のRailsは十分に豊かである」記事に加えてフラクタルな旅(翻訳)のような形で新たなクラス・モジュールを作ってコードを移していくのが有効かと思います。このようなコードを書くにはRubyの熟練が必要なので綺麗にRailsアプリを作ろうとするなら、やはりRubyについても詳しくなる必要があると思います。

(参考)37signalsブログの「Code I like」シリーズ

自分自身も過去にMVC境界を跨ぐようなコードを書いたことがあるので、その反省も含めて記事を書きました。

Updated at