VIPERアーキテクチャパターンは、iOSアプリ開発において使われることが多いパターンです。View、Interactor、Presenter、Entity、Routingの5つの要素から構成されています。
View
- ユーザーインターフェイスを表示する役割を持ちます
- Presenterとの入出力を行います
- UIロジックのみを含みます
Interactor
- ビジネスロジックを実装する部分です
- Entityを操作し、必要なデータを準備します
- Presenterの指示に従ってビジネスロジックを実行します
Presenter
- ViewとInteractorを調整する役割を持ちます
- Viewからのユーザー入力をInteractorに伝え、Interactorからのデータを加工してViewに渡します
Entity
- アプリケーションのデータモデルを表現する部分です
- データベースやAPIからのデータを保持します
Routing
- 画面遷移のロジックを担当します
- どのViewを表示するかをプレゼンターに指示します
具体例としてメモ帳アプリを考えてみましょう。
View
- MemoListView: メモの一覧を表示するView
- MemoDetailView: メモの詳細を表示/編集するView
Interactor
- MemoListInteractor: メモ一覧の取得、追加、削除のロジックを実装
- MemoDetailInteractor: メモの詳細取得、更新のロジックを実装
Presenter
- MemoListPresenter: MemoListViewとMemoListInteractorの仲介役
- MemoDetailPresenter: MemoDetailViewとMemoDetailInteractorの仲介役
Entity
- Memo: メモのタイトル、本文、作成日時などのデータを保持
Routing
- MemoRouter: 一覧画面から詳細画面への遷移ロジックを実装
例えば、ユーザーがMemoListViewでメモを選択すると、MemoListViewはMemoListPresenterにその旨を伝えます。MemoListPresenterはMemoListInteractorにメモの詳細取得を指示し、取得したデータをMemoDetailPresenterに渡します。MemoDetailPresenterはそのデータを加工し、MemoDetailViewに渡して表示させます。この時、MemoRouterを経由してMemoDetailViewへ遷移します。
このようにVIPERパターンでは、責務をモジュール単位で分離することで疎結合を実現し、個々のモジュールの結合度を下げることができます。ただし、パターンが複雑で多くのクラスが生まれるため、小規模アプリで使うと開発コストがかかる可能性があります。