本文へスキップ
BecomeCoder

Java MVVMコース · 第4章 Repository ― データアクセスの抽象化 · レッスン12

Repositoryパターン ― タスクをどこに保存するか

ローカル実施

導入

第3章のTaskFactoryTaskItemを作れるようになりましたが、作った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に適用します

次回: 契約どおりのTaskRepositoryInMemoryTaskRepositoryをTDDで実装します。