TL;DR
- 外部依存の多い iOS 開発では、副作用を分離して、予測可能でテストできる部品を組み合わせたい。
- The Composable Architecture(TCA)を使うと、純粋なロジックと副作用を分けられる。ただし
Reducerは純粋関数ではない。
内容
関数型プログラミングと iOS 開発
関数型プログラミングは、コードの再利用性を高め、コードを高品質な部品として再利用できるようにする手段である。
iOS 開発は外部依存だらけである。そのリスクを減らすには、自分のコードの振る舞いを予測可能にして自動で検証できるようにし、そのような信頼性の高い部品を組み合わせて作りたい。その第一歩が副作用の分離であり、TCA を使うと副作用を分離できる。TCA では、Reducer が Action を受けて State を変更し、View は State を反映するだけにする。TCA を使った例として CopilotForXcode がある。
TCA のメリット
TCA を使うと、純粋なロジックを副作用と分離できるので、可読性が上がる。Effect.run で分離した副作用は Swift Concurrency の上で動くので、優先順位の設定、並列実行の構造化、キャンセル処理を使える。関心を分離できるので、テストもしやすい。
永続化を端に追いやることも実現できる。Reducer は高階関数であり、依存性の注入ができるので、レイヤードアーキテクチャを導入する必要はなく、モジュールの分割で十分である。Reducer どうしの関数合成もできる。
注意点
Reducer の型は (inout State, Action) -> Effect<Action> であり、純粋関数ではない。inout State はミュータブルである。パフォーマンス上の懸念があるので、State を新しく作って返すのではなく、メインスレッドの Reducer 自身が State を変更する。
キーワード
- The Composable Architecture
- 関数型プログラミング
- 副作用
- 純粋関数
- 高階関数
- 依存性の注入
- レイヤードアーキテクチャ
- 関数合成