$30 off During Our Annual Pro Sale. View Details »

Active Recordについてわかったことを説明するよ

bayashi
December 23, 2022

Active Recordについてわかったことを説明するよ

一年前くらいに社内勉強会で発表した資料です。
公開しても問題なさそうなんで公開

bayashi

December 23, 2022
Tweet

More Decks by bayashi

Other Decks in Programming

Transcript

  1. 家政婦は見た!

    命を張った好奇心

    Active Recordの正体と

    犠牲にされた疎結合

    命を張った好奇心

    Active Recordの正体と

    犠牲にされた疎結合


    View Slide

  2. 最近

    設計の本とかパーフェクト ruby on railsとか読んでActive Recordが何なのかちょっとだ
    け理解できてきたので語っていきます。


    View Slide

  3. Rails ガイドのActive Recordとは

    1 Active Recordについて
    Active Recordとは、MVCで言うところのM、つまりモデルに相当するものであり、ビジネスデータとビジネスロジックを表すシステムの階層です。Active
    Recordは、データベースに恒久的に保存される必要のあるビジネスオブジェクトの作成と利用を円滑に行なえるようにします。Active Recordは、ORM
    (オブジェクト/リレーショナルマッピング)システムに記述されている「Active Recordパターン」を実装したものであり、このパターンと同じ名前が付けら
    れています。
    1.1 Active Recordパターン
    パターン名としてのActive RecordはMartin Fowler『Patterns of Enterprise Application Architecture』という書籍に記述されています。Active Record
    パターンにおいて、オブジェクトとは永続的なデータであり、そのデータに対する振る舞いでもあります。Active Recordパターンは、データアクセスのロ
    ジックを常にオブジェクトに含めておくことで、そのオブジェクトの利用者にデータベースへの読み書き方法を指示できる、という立場に立っています。
    https://railsguides.jp/active_record_basics.html#active-record%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

    View Slide

  4. PoEAA

    https://www.amazon.co.jp/dp/B01B5MX2O2/

    View Slide

  5. PoEAAのActive Recordとは

    データベースのテーブルやビューの列をラップし、データベースアクセスをカプセル化し、ドメインロジックを追加するオブジェクト
    データと振る舞いの両方を持つオブジェクト。データの多くは永続的であり、データベースに格納される必要がある。 ActiveRecordは、メイン
    オブジェクトにデータアクセス処理を置くという最も明らかなアプローチを採用している。この方法では、全員がデータベースへの読み書きす
    るやり方を知っている。
    https://bliki-ja.github.io/pofeaa/ActiveRecord/

    View Slide

  6. Active Recordとは

    1. データベースのテーブルやビューの列をラップし、

    a. 1テーブル、1クラス。クラスの属性は、テーブルの各カラムに対応


    2. データベースアクセスをカプセル化し、

    a. ORM


    3. ドメインロジックを追加するオブジェクト

    a. ドメインロジック?なんだそれ


    View Slide

  7. ドメインとは

    ドメインは「領域」の意味をもった言葉です。ソフト
    ウェア開発におけるドメインは、「プログラムを適用
    する対象となる領域」を指します。重要なのはドメイ
    ンが何かではなく、ドメインに含まれるものが何か
    です。

    成瀬 允宣. ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本

    View Slide

  8. ドメインとは

    たとえば会計システムを例にしてみましょう。会計
    の世界には金銭や帳票といった概念が登場しま
    す。これらは会計システムのドメインに含まれま
    す。物流システムであればどうでしょうか。会計シ
    ステムとは打って変わって貨物や倉庫、輸送手段
    などの概念が存在し、それらがそのまま物流シス
    テムのドメインに含まれます。



    成瀬 允宣. ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本

    View Slide

  9. モデルとは

    「モデルとは、何らかの実体があって、それ
    を縮小(あるいは拡大)して細かい部分は
    省いて自分たちの都合の良いところだけを
    抽出して形成した形のことである。」(知り合
    いのモデラー談)


    View Slide

  10. モデルとは

    同じ人間だけど、「スポーツをする人」と捉
    えたときと「転職をする人」と捉えたときで
    抽出する情報は変わってくる。 


    自分たちがシステム化したいドメインに関
    して対象をモデル化したものを ドメインモデ
    ルと呼ぶ。


    Active Recordをドメインモデルと呼んでる
    人はあんまりいないけど広義にはActive
    Recordもドメインモデルになると思う。 


    View Slide

  11. RailsのActive Recordを継承したmodel 

    - 値のチェック

    - ユースケースの組み立て 

    RailsにおけるActive Recordがやってくれること

    値のチェック

    →validation

    ユースケースの組み立て

    →after_createとか



    Active Record パターン 

    - DBをラップ

    - ORM

    - ドメインロジック


    View Slide

  12. 僕がやったことのあるSpring(Javaのフレームワーク)

    値のチェック → form object

    ユースケースの組み立て → service

    ORM → repository

    DBをラップ → なかった気がする

    ドメインロジック → Entity

    確かこんな感じだった気がする...


    View Slide

  13. RailsのActive Record 

    - 値のチェック

    - ユースケースの組み立て 

    RailsにおけるActive Recordがやってくれること

    値のチェック

    →validation

    ユースケースの組み立て

    →after_createとか



    Active Record パターン 

    - DBをラップ

    - ORM

    - ドメインロジック


    View Slide

  14. RailsのActive Record 

    - 値のチェック

    - ユースケースの組み立て 

    RailsにおけるActive Recordがやってくれること

    値のチェック

    →validation

    ユースケースの組み立て

    →after_createとか



    Active Record パターン 

    - DBをラップ

    - ORM

    - ドメインロジック


    そりゃあFat Modelになりまっせ!


    View Slide

  15. Rails の Active Recordは

    めっちゃ色んな機能を集約したおかげで便利につかえる

    あとModelとTableを1:1対応にしたことで何も宣言せずに便利に使える

    https://speakerdeck.com/yasaichi/what-is-ruby-on-rails-and-how-to-deal-with-it?slide=39

    View Slide

  16. じゃあFat Modelどうするんだ

    値object

    →紹介

    ドメインモデルへの切り出し

    https://qiita.com/MinoDriven/items/3c7db287e2c66f36589a


    サービスクラスhttps://qiita.com/chrischris0801/items/58a12d17a440b842db02


    View Slide

  17. 値オブジェクト

    パラメータ名 パラメータの型
    名前 String
    誕生日 date
    住所 String
    性別 String
    人物モデル

    各パラメータの制限や便利メソッドはすべ
    て人物モデルの中にある
    制限の例: 誕生日は過去日でないといけな

    便利メソッド: 誕生日から今の年齢を出す

    View Slide

  18. 値オブジェクト

    パラメータ名 パラメータの型
    名前 String
    誕生日 Birthday
    住所 String
    性別 String
    人物モデル

    制限の例: 誕生日は過去日でないといけな

    便利メソッド: 誕生日から今の年齢を出す

    Birthdayクラスを作りそこに集約する

    View Slide

  19. こういうのやっていくとRails wayから離れる


    =


    規約のパワーでどうにかできなくなりRailsである必要
    ある?状態になる


    View Slide

  20. ちょっとまって本当にまだRails Wayから去る必要ある?

    tableとmodelが1:1だとして

    データモデリングちゃんとできてる?


    View Slide

  21. https://www.slideshare.net/HidekatsuIzuno/ss-67532977

    View Slide

  22. 人物マージの例

    例えば人物マージという機能がある

    - データ上のAさんとBさんが実際は同一人物(重複登録)だったためマージする機能


    人物マージはそもそも人物というモデルの責務なのか?

    マージされる側の責務?マージする側の責務?

    controllerは何のメソッド使う?update?delete?

    merge可能かどうかはどう判定する?


    View Slide

  23. 過去自分がやった実装

    マージされる側の責務?マージする側の責務?

    →マージする側(残る側)の責務にしよう...うーん


    controllerは何のメソッド使う?update?delete?

    →よくわかんないけどupdateかな...


    merge可能かどうかはどう判定する?

    →merge_candidateメソッドの中でチェックしよう...


    View Slide

  24. 今の自分がやるなら

    人物マージをイベントとして捉えてそれをモデルにする

    (イベントが発生したらDBにも保存する)


    マージされる側の責務?マージする側の責務?

    →人物の責務じゃなくて人物マージの責務

    controllerは何のメソッド使う?update?delete?

    →人物マージのレコードがひとつ増えるからcreate

    merge可能かどうかはどう判定する?

    →validateで判定可能


    after_createでマージされる側を削除するロジックを組み立てる

    View Slide

  25. 参考文献

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

    現場で役立つシステム設計の原則

    ドメイン駆動設計入門

    https://anchor.fm/textafm


    View Slide