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 を変更する。

キーワード

関連