【個人的サーベイ】Railsのデザインパターンについて
先日次の記事を書きました。
これをきっかけにRailsのデザインパターンについて色々調べて見ることにしました。
Decoratorオブジェクト
モデルが持つ属性やロジックを利用して、表示に関するロジックを実装するオブジェクトです。
ユーザーに表示する画面の内容や、データや処理の結果の表現方法をモデルに記述するとモデルが肥大化するため、その回避方法として使用されます。
Finderオブジェクト
後述するqueryオブジェクトと同じくDBに複雑な操作を要求する際に使用します。
ただし、こちらは検索の際に使用されます。
【Rails】Finder Object で検索ロジックをすっきりさせる
Formオブジェクト
form_withを利用するユースケースの際に利用されるオブジェクトです。
ユーザーとのやり取りに用いるフォームを実装する際に用いられます。
Policyオブジェクト
ビジネスルール(処理の実行権限)を規定するオブジェクトです。
Rails tips: Policy Objectパターンでリファクタリング(翻訳)
Interactorオブジェクト
ビジネスロジックを実装するオブジェクトです。
後述するServiceオブジェクトと役割は似ていますが、こちらの方は役割が明確で、
Gemによるルールがあるため設計の原則を守りやすいです。
Railsのデザインパターン: Interactorオブジェクト
Queryオブジェクト
ActiveModel::Relationに関する複雑な操作(テーブル結合・絞り込み・ソートなど)を行い、
Relationを返すオブジェクトです。
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オブジェクトの指定ができます。
View Componentオブジェクト
Viewをコンポーネント単位でまとめてHTMLを出力するオブジェクトです。
感想
Railsデザインパターンの存在は知っていましたが、改めて調べて見ると初めて知ったものもあり、
勉強になりました。
一方でRailsのアプリケーション開発の原則は「Skinny Controller,Fat Model」であることから、
まずはModelにメソッドを寄せて、可読性が悪くなったときや複雑性が高いときにこれらのパターンの採用を検討したいと思います。
Discussion