ソフトウェア上にドメインの概念を表現しただけでは、アプリケーションとして成り立たせることは難しい。
プログラムが実行される過程でメモリ上に展開されたデータはプログラムが終了すると消えてしまう。特にエンティティはライフサイクルのあるオブジェクトなので消えてしまっては困る。
オブジェクト(エンティティ)を繰り返し利用するには何らかのデータストアにオブジェクトのデータを永続化(保存)し、再構築(復元)する必要がある。
リポジトリはデータを永続化し再構築する処理を抽象的に扱うためのオブジェクト
オブジェクトのインスタンスをデータストアに直接保存するのではなく、リポジトリに保存依頼をし、データストアのデータからオブジェクトを再構築する際もリポジトリに依頼して行う。
リポジトリを経由して永続化、再構築を行うことでソフトウェアの柔軟性が高まる
リポジトリの責務はドメインオブジェクトの永続化や再構築を行うこと
永続化とは、インスタンスを保存し、復元できるようにすること
例として、ユーザー作成とユーザー名の重複確認処置のコードを書く場合、コードの大半はデータストアの具体的な操作になってしまう。なので、コードの趣旨がぼやけてしまう。
対策として、永続化処理を抽象化して取り扱うリポジトリを利用すると。データストア部分の処理を抜き出すことができるので本来の処理が明確になる
(例)リポジトリを利用したユーザー作成処理
class Program
{
private IUserRepository $userRepository;
public function __construct(IUserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function craeteUser(string $userName)
{
$user = new User(new UserName($userName));
$userService = new UserService($this->userRepository);
if ($userService->exists($user)) {
throw new Exception($userName . 'は既に存在しています。');
}
$userRepositoty->save($user);
}
}
Userオブジェクトの永続化はリポジトリであるIUserRepository
オブジェクトに対して依頼されるようになる。データストアがRDBなのかNoSQLなのかはドメインにとって重要なことではなく、重要なのはインスタンスが何らかの手段によって保存されるということ。
データストアに対する命令を抽象的に行うことでコードは具体的なデータストアにまつわる処置を分離し、ユーザー作成処理のみ意識すれば良い状態になった。
(例)ドメインサービス側のコード