14. 7 つの実装パターン
• Value Objects
• Service Objects
• Form Objects
• Query Objects
• View Objects
• Policy Objects
• Decorators
15. Value Objects
• おなじみ Value Object
• immutable な値を保持するクラス
• 保持する値によって比較可能
• 何らかのロジックを持つ attribute(また
はその小さな集合)が適している
• 具体例:PhoneNumber、Money、
Ratingなど
16. Service Objects
• 複数の model を利用する場合
• 外部のサービス、API と連携する場合
• 複雑なロジックを実装する場合
• 既存の model の主たる責務でない場合
• Strategy パターンを適用したい場合
• 普通 ActiveModel ではない
17. Form Objects
• 一つのフォームで複数の AR model を更
新したい場合に有効
• ActiveModel にする
• Form の save の内部で複数の AR model
の save を呼び出す
• 標準の accepts_nested_attributes_for
は @brynary 的には非推奨
• 複雑になったら永続化処理を Service に
18. Query Objects
• バッチ用 or 複雑な条件の SQL を AR の
scope やクラスメソッドにせず Query
Object として分離
• 初期化時に AR::Relation オブジェクトを
渡すようにすると合成可能になる
• TrialQuery.new(Account.where(…)).fin
d_each do ¦e¦ … end
19. View Objects
• View のためのロジックを AR model に
書かない(エラーメッセージ生成など)
• AR model を保持するクラスを定義し
render にはこちらを渡すようにする
• helper に AR model を渡す実装よりも、
リファクタリングが促進される
• 多様な UI に対応する場合にも有効
20. Policy Objects
• AR model を参照はするが主たるドメイ
ンではないロジック(分析のための判定
など)を分離する
• 例:メール配信対象?アクティブユーザ?
• AR model を保持するクラスとして定義
• 他との違い:Policy は read な処理だけ
Service は write も含む、Query は SQL
実行と result set を yield に渡すだけ
27. 今日から出来ること
• 盲目的に AR のクラスメソッドにしない
• AR でないモデルもどんどんつくる
• Controller に AR model 呼び出しをズラ
ズラ書くより Service にする
• 複雑なフォームは Form を導入する
• AR に表示用ロジックを持たず View
Object でラップして表示処理に渡す