リポジトリとは?
データを永続化(保存)して、再構築(復元)するといった処理を抽象的に扱うためのオブジェクト。(メモリ上に展開したデータはプログラム終了したら消えてしまうので永続化が必要)
オブジェクトのインスタンスをDBに保存、読み出しをしたい場合などはリポジトリに依頼する。
ドメインオブジェクトにとっては、データの永続化が固有のインフラストラクチャ技術(NoSQLなのか、ファイルなのか、RDBMSなのか)はそれほど重要なことではないです。
DDDにおけるリポジトリ
「エンティティ」や「値オブジェクト」から構成される「集約」の格納と取得を担当します。集約とリポジトリの関係は「1:1」になります。
リポジトリとDAOの違い
DAOはデータ中心志向であるのに対して、リポジトリはオブジェクト指向のアプローチです。
DDD:「ドメインモデル」+「リポジトリ」+「データマッパー(Hibernateなど)」
DAO:「トランザクションスクリプト」+「テーブルモジュール/テーブルデータゲートウェイ/アクティブレコード」
リポジトリの実体
リポジトリの実体はインターフェースです。例えば、以下のように記述します。インターフェースはドメイン層に配置します。また、実装クラスは、インフラストラクチャ層に配置します。
1 2 3 4 |
public interface IXXXRepository { void save(User user); User Find(name name); } |
save系、update系
戻り値は返しません。(void)
アンチパターン
以下のように個別のデータ項目を更新するような処理は避けましょう。
- updateName
- updateEmail
このような個別のメソッドはエンティティオブジェクト自身に依頼するべきです。エンティティで個別に更新してからupdateメソッドなどで更新依頼をかけるべきです。
find系
エンティティオブジェクトをnewして返します。
アンチパターン
findAllなどではコンピュータリソースを食い潰す可能性がある。findByUserNameなどの適切な名前をつけると良いでしょう。
責務
リポジトリの役割はあくまで「オブジェクトの永続化」にあります。
なので、保存(saveなど)や、取得(findなど)などは記述して良いですが、例えば、重複確認(Exists)などのドメインよりに近い処理は記述しないようにしましょう。
この記事へのコメントはありません。