🎨

【個人的サーベイ】Railsのデザインパターンについて

2022/11/23に公開

先日次の記事を書きました。

https://zenn.dev/adverdest/articles/form_object_article

これをきっかけにRailsのデザインパターンについて色々調べて見ることにしました。

Decoratorオブジェクト

モデルが持つ属性やロジックを利用して、表示に関するロジックを実装するオブジェクトです。
ユーザーに表示する画面の内容や、データや処理の結果の表現方法をモデルに記述するとモデルが肥大化するため、その回避方法として使用されます。

Decoratorの役割とDraperについて

Finderオブジェクト

後述するqueryオブジェクトと同じくDBに複雑な操作を要求する際に使用します。
ただし、こちらは検索の際に使用されます。

詳解Railsデザインパターン:Finderオブジェクト

【Rails】Finder Object で検索ロジックをすっきりさせる

Formオブジェクト

form_withを利用するユースケースの際に利用されるオブジェクトです。
ユーザーとのやり取りに用いるフォームを実装する際に用いられます。

【備忘録】Formオブジェクトについて

Policyオブジェクト

ビジネスルール(処理の実行権限)を規定するオブジェクトです。

Rails tips: Policy Objectパターンでリファクタリング(翻訳)

Interactorオブジェクト

ビジネスロジックを実装するオブジェクトです。
後述するServiceオブジェクトと役割は似ていますが、こちらの方は役割が明確で、
Gemによるルールがあるため設計の原則を守りやすいです。

Railsのデザインパターン: Interactorオブジェクト

詳解Railsデザインパターン:Interactor

Queryオブジェクト

ActiveModel::Relationに関する複雑な操作(テーブル結合・絞り込み・ソートなど)を行い、
Relationを返すオブジェクトです。

Railsのデザインパターン: Queryオブジェクト

詳解Railsデザインパターン:Queryオブジェクト

Railsで重要なパターンpart 2: Query Object(翻訳)

Rails - ActiveRecord の scope を Query object で実装する

Serviceオブジェクト

モデルに実装すると不自然なドメインロジックが出てくることがあります。
例えば、複数のオブジェクトを組み合わせて表現するロジックです。
このようなロジックを独立したオブジェクトとして定義したものです。

Railsで重要なパターンpart 1: Service Object(翻訳)

Validatorオブジェクト

モデルとFormオブジェクトなどの間でバリデーションルールを定義して利用します。
ActiveModel::EachValidatorとActiveModel::Validatorを利用します。

Valueオブジェクト

複数のモデルから扱われる特定の意味を持った値を表現するオブジェクトです。
composed_ofを利用することでValueオブジェクトの指定ができます。

Railsのデザインパターン: Valueオブジェクト

View Componentオブジェクト

Viewをコンポーネント単位でまとめてHTMLを出力するオブジェクトです。

ViewComponent

感想

Railsデザインパターンの存在は知っていましたが、改めて調べて見ると初めて知ったものもあり、
勉強になりました。
一方でRailsのアプリケーション開発の原則は「Skinny Controller,Fat Model」であることから、
まずはModelにメソッドを寄せて、可読性が悪くなったときや複雑性が高いときにこれらのパターンの採用を検討したいと思います。

参考文献・記事

パーフェクト Ruby on Rails【増補改訂版】

Railsのデザインパターンまとめ

肥大化したActiveRecordモデルをリファクタリングする7つの方法(翻訳)

Discussion