りゅうじの学習blog

学習したことをアウトプットしていきます。

ドメイン駆動設計入門Chapter5

リポジトリとは

  • ソフトウェア文脈のリポジトリデータの保管庫です
  • リポジトリデータを保存・復元する処理を抽象的に扱うためのオブジェクトです

💡  オブジェクトを繰り返し利用するには、データベースにオブジェクトのデータを保存・復元する必要がある。特にエンティティはライフサイクルのあるオブジェクトなので、プログラムが終了したからといって消えてしまっては困る。

リポジトリを経由させる

リポジトリの責務

  • ドメインオブジェクトの永続化・再構築を行うこと

リポジトリにデータベースへの保存・復元の処理を記述して値オブジェクトやエンティティにDIして使用する

リポジトリのインターフェース

テストによる確認

  • テストを行うための手間が積み重なると開発者は次第にテストに対して誠実でなくなっていく
    • ある程度経験を積んだ開発者は記述したコードが「おそらく」意図した通りに動作するだろうと判断できてしまう
      • そのテストを多大な労力をかけて書くのはコストと対価が見合わないと感じられてしまう
        • テストをしなかったコードに対して、開発者ができることは祈りを捧げ得ることだけである
          • 願いは不安の裏返しであり、祈りを捨てる必要がある

テスト用のリポジトリを作成する

  • テストを行う際に特定のインフラストラクチャを準備するのは億劫
    • メモリをデータストアとしてインメモリで動作するようにする

インメモリとは、ソフトウェアを実行する際、使用するプログラムやデータのすべてをメインメモリRAM)上に読み込み、ストレージ(外部記憶装置)を使わないこと。特に、そのような方式のデータベースを「インメモリデータベース」という。

  • テストのFindメソッドでは検索してヒットしたインスタンスをそのまま返却せずにディープコピーして返却する

ディープコピーとは、オブジェクトのみをコピーではなく、オブジェクトとメモリ上にロードされたデータの両方をコピーすること

  • saveメソッドでも同様にディープコピーを行う

ORMでもリポジトリに定義できる

リポジトリに定義されるふるまい

永続化に関するふるまい

  • Saveメソッド、永続化のふるまいは永続化を行うオブジェクトを引数にとる
  • Updateメソッド、対象の識別子と更新項目を引き渡して更新させるようなメソッドは用意しない
    • オブジェクトが保持するデータを変更するのであれば、オブジェクト自身に依頼するべき
  • Deleteメソッド、削除のメソッドはリポジトリに定義する

再構築に関するふるまい

  • Findメソッド、例としてユーザ名の重複が発生しているかを確認するために全建取得する必要がある
    • 対象となる前オブジェクトを再構築するメソッドを定義する
      • オブジェクトの数によってはリソースを食い潰してしまうので慎重になる必要がある
        • 探索を定義する際には適したメソッドを定義する