導入
第3章のTaskFactoryでTaskItemを作れるようになりましたが、作ったTaskItemはローカル変数に入っているだけで、メソッドを抜ければ消えてしまいます。タスク管理アプリとして成立させるには「タスクを保持し、あとから一覧・検索できる」場所が必要です。
説明
Repository(リポジトリ)パターンは、「データの出し入れ」を、コレクションのような窓口に隠す設計です。
classDiagram
class TaskRepository {
<<interface>>
+add(TaskItem) void
+findAll() List~TaskItem~
+findById(String) Optional~TaskItem~
}
class InMemoryTaskRepository
class FakeTaskRepository
TaskRepository <|.. InMemoryTaskRepository
TaskRepository <|.. FakeTaskRepository
TaskService --> TaskRepository : 抽象にだけ依存
小さな例で要点を確認しましょう。
interface ContactRepository {
void add(String name);
int count();
}
class InMemoryContactRepository implements ContactRepository {
private final List<String> contacts = new ArrayList<>();
public void add(String name) {
contacts.add(name);
}
public int count() {
return contacts.size();
}
}
ContactRepository repo = new InMemoryContactRepository();
repo.add("田中");
repo.add("鈴木");
System.out.println(repo.count()); // 2
- 呼び出し側(業務ロジック)は
ContactRepositoryという抽象にだけ依存する - 保存の実体(リストか、DBか、ファイルか)は実装クラスが決める。呼び出し側は知らなくてよい
- 次のレッスンから、この形をそのまま
TaskItem向けのTaskRepositoryとして作ります
まとめ
- Repositoryは「データの出し入れ」を抽象化した窓口
- 呼び出し側は具体的な保存先を知らず、インターフェースにだけ依存する
- 次のレッスンからこの形を
TaskItemに適用します
次回: 契約どおりのTaskRepositoryとInMemoryTaskRepositoryをTDDで実装します。