Upgrade to Pro — share decks privately, control downloads, hide ads and more …

はじめましてコンさん、さようならコンさん、

 はじめましてコンさん、さようならコンさん、

わたしとRailsのConcernの物語

Avatar for Botofune

Botofune

April 26, 2025
Tweet

Other Decks in Programming

Transcript

  1. 第一話 はじめましてコンさん、 こんな状況でした。 似てるテーブルたちそれぞれに、 コントローラーや テストを作っていた。 共通化すると、 微妙な差異の対応によってコードが カオスになるかも、 と思っていたので。

    でも、 「これまとめられそうだな…まとめられないかな…。」 と思いながら同じような内容のコントローラーやテス トを作っていく内に、 精神的にツラくなってきた。
  2. ・ Concern はコードを整理するのに有効である ・ Concern はコードの再利用性を高める なのでコンさんが活躍できるのは、 コードの重複の解消だけじゃない。 なんだったら、 機能の整理が本分なのかもしれない。

    最終話 https://guides.rubyonrails.org/getting_started.html#extracting-a-concern Concerns are a great way to organize features of your Rails application. As you add more features to the Product, the class will become messy. Instead, we can use Concerns to extract each feature out into a self-contained module like Product::Notifications which contains all the functionality for handling subscribers and how notifications are sent. Extracting code into concerns also helps make features reusable. For example, we could introduce a new model that also needs subscriber notifications. This module could be used in multiple models to provide the same functionality.
  3. ・ バリデーションとか、 コールバックとか、   メソッドとかが、 競合するリスクがある ・ テストが書きにくい ・ コードを分散しているだけで、

      責務を分離できていない ・ 「継承よりコンポジション」 に反する Service Object と比較して、 Concern が あんまり…なポイント
  4. モデルに Concern を include ↓ モデルにメソッドが生えたり、 バリデーションなどが追加される。 ↓ モデルが fat

    になる ↓ Concern 自体はテストできないので、 モデルのテストで concern のテストを書く。 コードを分散しているだけで、   責務を分離できていない テストが書きにくい &
  5. Service Objectパターンで、 Product モデルの新規機能開発を想像してみよう。 「メールの他にLINEで通知する機能を実装するなら?」 「メールクラスと LINEクラスを作って、 それぞれを 呼び出すクラスの、 計3クラスを作る?」

    「ディレクトリはどうやって分ける?」 「メールと LINEのクラスの上の階層に、 呼び出すクラスを置く?」 「他のモデルで同様にクラスをつくることになったら、 Product の階層と合わせる?」 「ルールを設けたとして、 それを守り続けられる?」 「ルールの柔軟性はどうする?厳守する?例外を認める?」 「ルールやコードを忘れたとき、 ディレクトリやコードが辿りやすく、 すぐに思い出せそう?」
  6. 一旦はモデルに諸々書いちゃっていいんじゃないでしょうか。 大丈夫です。 Skinny Controller, Fat Model っていう言葉があります。 「わたしはモデルを fat にしているのではない。

    ゴージャスにしているのだ」 と自分に言い聞かせましょう。 それでも大きくなり過ぎたモデルに頭を抱えるときが来るかも しれません。 そのときに、 機能を整理しましょう。 我々人類は、 具体的にどうすればよいのだろうか。
  7. 参考 Getting Started with Rails — Ruby on Rails Guides

    https://guides.rubyonrails.org/getting_started.html#extracting-a-concern Put chubby models on a diet with concerns – Signal v. Noise https://signalvnoise.com/posts/3372-put-chubby-models-on-a-diet-with-concerns Helping devs understand concerns faster - A May Of WTFs - Ruby on Rails Discussions https://discuss.rubyonrails.org/t/helping-devs-understand-concerns-faster/74619 I disagree - I think we're talking about two competing philosophies. DHH / stand... | Hacker News https://news.ycombinator.com/item?id=7438038 Buckblog: Skinny Controller, Fat Model https://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model 人は Fat Model を恐れサービスを求め ドメインモデルは貧血に至る - @ledsun blog https://ledsun.hatenablog.com/entry/2022/04/08/000748