はじめに
最近、個人開発iOSアプリのアーキテクチャを考えるにあたり、MVC、MVVM、ReSwift、Clean Architecture等のQiita記事が大変参考になりました。
感謝の意を込めて、はなはだ僭越ながら成果をフィードバックさせて頂きます。
価値観
-
MVC/MVP/MVVMのシンプルさは、個人開発目的ならいいかも
- Fat ViewControllerはもうやだ
- UnitTestできる範囲を多くしたい
- とはいえ、Clean ArchitectureやVIPER、ReSwiftはちょっとヘビー
-
ViewModelからViewへの一方通行DataBindingはよさげ
- RxSwift、ReactiveSwift、Bond等、どれにするか迷う
- 外部ライブラリに依存したくない
- 片方向なら学習コスト低くて、大きい効果を期待できるかも
-
ReSwift のdispatchの考え方はよさげ
- 開発したいアプリは、画面数3で画面遷移も少ない一方、画面が複雑
- 親ViewControllerr:1
- 子ViewControlller:4
- 子ViewControllerのイベントを、親や他の子に通知したい
- 親や子のイベントを1箇所に集約すれば、実行ログが見やすくなるのでは
- 開発したいアプリは、画面数3で画面遷移も少ない一方、画面が複雑
出来上がったアーキテクチャ
レイヤー
ExternalLayerとInternalLayerの2層
- ExternalLayerは、Clean Architectureの一番外側のイメージ
- InternalLayerは、Clean ArchitectureのContollers, Use Case, Entityのイメージ
ViewControllerは、この絵のViewに属します。
MVCモデルのVとCがviewに対応して、MがUseCase/ViewModel/Actorに対応するイメージです。
処理の流れ
①Viewは、ユーザからの入力を受け付けたら、Dispatcherにイベントを通知する。
②Dispatcherは、イベントを適切なUseCaseにマッピングする。
③UseCaseは、Actorにデータ更新Actionを依頼する。
④Actorは、データ更新処理を行う。
⑤UseCaseは、ViewModelにデータ更新通知をする。
⑥ViewModelは、Actorにデータ参照アクションを依頼して、自身に反映する。
⑦Viewは、購読しているViewModelの値を自身に反映する。
⑧Viewは更新された画面をユーザに表示する。
Viewの責務
- ユーザ入力やシステムイベントをDispatcherに通知する
- ViewModelを購買して、ViewModelの値に変化があったら画面に反映する
UseCaseの責務
- Viewに、イベント通知のインタフェースを提供する
- func dispatch(from:, event:)
- ユースケース(データ更新アクション)を実行する
- ユースケースの実態は、どのアクターにどのアクションどの順番で依頼するかを決めたもの
- 更新結果を画面に反映するため、ViewModelに通知する
Actorの責務
- UseCaseやViewModelに、アクション実行依頼のインタフェースを提供する。
- データ更新アクション、およびデータ参照アクションを実行する。
Service Interfaceの責務
- Actorに、ExternalLayerのAPIを隠蔽するためのインタフェースを提供する。
ViewModelの責務
- UseCaseに、データ更新通知のインタフェースを提供する
- Actorにデータ参照依頼して、結果を自身に反映する。
おわりに
どなたかのお役に立てたら幸いです!