TCA の歩き方 2022
こんにちは、アイカワといいます。
この記事は The Composable Architecture Advent Calendar 2022 の 10 日目の記事になります🙏
今回少し無茶をして TCA のアドベントカレンダーに一人で 7 記事エントリーしてしまっているので、頑張って完走したい気持ちです。
自分自身は元々 TCA を個人的に勉強していたのですが、今年は大変ありがたいことに副業で TCA を使って開発させて頂けていたり、TCA にはプチプチコントリビュートもできたりしていて、TCA に昨年より多く関われて良かったです。
本記事では 2022 年も終わるというところで、最近変化が非常に激しい TCA についての個人的におすすめな歩き方を紹介できたら嬉しいなと思っています。
TCA の歩き方ということで、「TCA をまだ使ったことがない」とか「TCA を使い始めているけど難しくてよくわからない」みたいな方を対象としています。
TCA の近況
TCA の歩き方について紹介する前に、TCA が現状どのような状況なのかについて簡単に紹介させてください。
TCA は登場してから数年経ち、本記事執筆時点では v0.47.2 までリリースされているという状況です。
特にここ最近は以下のような大規模なアップデートもありました。
-
Async Composable Architecture
- TCA の API が Combine ベースから Swift Concurrency ベースになった
-
Reducer Protocol
- State, Action, Reducer, Environment などの記述方法が大きく変更となった
-
TCA が swiftui-navigation に依存するようになった
- このブログ自体は依存するようになったことを表しているものではないですが、TCA 自体が swiftui-navigation という Point-Free 製のライブラリに依存するようになり、いよいよ TCA で Navigation support される動きが本格化してきています
(この記事でそれぞれの詳細について本格的に話し始めると、記事がとんでもない長さになってしまいそうなので、後に紹介する公式のリソース群や今回の TCA のアドカレで他の方が書かれた記事などを詳しくはご参照ください🙏)
Road to 1.0 という Discussion もオープンされ、今後入ってくるであろう大きな機能としては Navigation support が挙げられています。(Navigation support については、別の Discussion でも待望されていて、別ブランチで動きが進んでいるようです)
このように、TCA はどんどんアップデートされていて、言語機能をさらに活かすような設計になりつつ、開発者にとってもどんどん使いやすい形になってきているというのが現状という認識です。
また、嬉しい点としては、TCA の利用者が緩やかにアップデートに対応していけるように Point-Free の二人が配慮してくださっているというものがあります。
例えば、急にアプリがビルドエラーになったり warning まみれになったりしないように soft deprecations という形で API をアップデートしてくれていたり、マイグレーションガイドも用意してくれていたりなどしているという親切対応です。
一方で、ある程度普段から TCA を触っている開発者でもキャッチアップに少し苦労するくらいのアップデート速度にはなっていることもあり (と個人的には思っている)、Navigation support 以外が落ち着いてきた現在のタイミングで「TCA の歩き方」を紹介することで、本記事がどなたかの参考になれば嬉しいなと思っています。
個人的におすすめしたい TCA の歩き方 2022
では、そろそろ本題に入ろうと思います。
個人的な経験をもとにおすすめしたい TCA の歩き方は以下のような流れです。
- README を見る
- A Tour of the Composable Architecture を見る
- TCA の Documentation を見る
- Examples を見たり触ったりする
- isowords を見たり触ったりする
- 実践する
一応、順序も意識はしていますが、人によって全然変わってくるものかなとは思うので一つの参考程度にして頂けたら嬉しいです🙏
伝えたいのは、「TCA のキャッチアップ材料は非常に豊富」ということです。
(2023年に追記: 良いチュートリアルが公開されたので、今はそちらをはじめの方にやっておくと良さそうです)
一つずつ簡単に紹介していきます。
README を見る
まず一番最初に見た方が良さそうなのは TCA の README があると思います。
TCA そのものについてや TCA の利用方法などについて簡潔に説明されており、TCA のコンセプトを理解する上で初めの一歩として読んでおいた方が良いものかなと思います。
本記事の冒頭で「TCA にプチコントリビュートした」とか言っていたと思いますが、実は日本語版の README を書いていたりするので、日本語で読みたいという方はぜひ🙏 (頑張ってちょこちょこ最新の README に追従させています🙇)
もちろん README を読んだだけで完全に理解することはできないと思うので (できる人もいるかもしれないですが)、以降の説明に移っていきます。
A Tour of the Composable Architecture を見る
次におすすめしたいのは、Point-Free によって作成されているサイトに公開されている A Tour of the Composable Architecture というビデオシリーズを視聴することです。
全部で 4 つの動画があるのですが、この 4 つを見ればなんとなくは TCA を理解できる状態になるのではないかなと思います。
多くの Point-Free の動画は Subscriber only となっているのですが、これらの動画に関しては無料で公開されているので誰でも視聴することができます。
また、サイト内には Transcript も用意されているので、英語が苦手な方はその Transcript を翻訳機に突っ込むなどして読んでいくと良いかなと思います。(自分も学習し始めの頃は翻訳機に頼りまくっていました)
注意として、この 4 つの動画の内容は初期段階の TCA くらいの話であるため、現在の API とはだいぶ乖離した内容になってしまっています。
そのため、この動画では概念を掴む程度にしておいて、次以降に紹介するものを参考にしていくのが良いかなと思います。
TCA の Documentation を見る
次におすすめしたいのが DocC 製の Documentation です。
この Documentation では、それぞれの API についての説明があるだけではなく、以下のような Articles が用意されています。
- Getting started
- Dependency management
- Testing
- Performance
- Concurrency
- Bindings
- Migrating to the reducer protocol
この中でも Performance については TCA をある程度理解している人向けのものになっている気はしますが (TCA アドカレの別日に Performance についての記事を書く予定です)、それ以外については目を通しておくとさらに TCA を理解できて良さそうかなと思います。
Examples を見たり触ったりする
ここまで座学寄りのリソースを紹介してきましたが、TCA の魅力の一つと言っても過言ではない豊富なリソースの一つに Examples
という多くの TCA の利用例があります。
このディレクトリに現時点で入っているものは以下の通りです。
- Case Studies
- Search
- Speech Recognition
- Tic-Tac-Toe
- Todos
- Voice Memos
Case Studies には TCA のさまざまな利用シーンごとの実装例が豊富に用意されていて、それ以外のディレクトリは TCA による小規模なアプリ ~ マルチモジュール化されたアプリなど、非常に様々な TCA の利用例が存在しています。
キャッチアップ用途で見ていくというケースに絞って話すと、Case Studies を見たり触ったりするのが良いかなと思っています。
ざっと眺めてみるという使い方でも良いと思いますし、実際に TCA を使っている時にリファレンス的に利用するという形も良いかなと思います。
isowords を見たり触ったりする
次に紹介したい実践的な例は Point-Free による isowords という OSS のゲームアプリケーションです。
詳細な説明はしないのですが、「TCA を用いた規模がそこそこ大きいアプリケーション」になっており、TCA のキャッチアップ・リファレンス用途として非常にありがたいリソースです。
また、SPM によるマルチモジュール化も行われているので、その観点で見てみるのも面白そうかなと思います。
SPM のマルチモジュール化に関しては、松舘さんが iOSDC で発表されているものもあり、そちらも非常に勉強になります。
特に TCA は Composable という名前の通り、モジュールとしての独立性を高めやすい設計にすることができる (もちろん利用方法によってはそうならない場合もありますが) ので、マルチモジュール化との相性も良いと感じています。
そういった意味でも TCA を利用する際には、isowords は常に片手に置いておきたいリソースかなと思っています。
実践する
ここまでに紹介してきたリソースを頑張って見てみる前に、この「実践する」というステップを踏んでももちろん良いと思うのですが、やはり実践して TCA の利用方法・良さを実感するのが一番良いとは思います。
実践してみながら、先ほど紹介した Examples
や isowords を見て、またさらに実践していくというステップを何度も繰り返せば、いつの間にか TCA を理解できる状態にきっとなっているはず...
開発中に困った時はどうすれば良い?
最後に開発中に困った時の Tips も簡単に紹介します。
TCA の利用中に困った時、自分は以下のような流れで解決策を探っています。
- Disucussion, Forums などで同じような問題に困っている人がいないかを探してみる
-
Examples
を見てみる - isowords を見てみる
TCA に関する質問などは Discussion や Forums などで受け付けられているので、その辺りに知りたい情報が転がっていることが結構あります。
そのため、何か困った時はこの辺りを探してみると同じ問題に困っている人に遭遇できるかもしれません。
また、先ほど紹介した Examples
や isowords には豊富なコードが存在するため、そこを探すと解決策が見つかることが多いと思います。
嬉しいことに Examples
も isowords も TCA の大規模なアップデートと共にしっかりと更新されているので、最新の TCA を使っていても参考になる例がしっかりと存在しているという形になっています。 (これは本当にありがたいと思うと共に、例となるソースコードまで毎回しっかりとアップデートしてくれるパワフルさが本当にすごいと思っています...)
ただ、isowords の方は若干追従されていない部分もあったりするため (TCA の利用部分は最新化してくれているが、TCA のベストプラクティス的なコードになっていない場合はある)、Examples
から探しに行くと効率的に情報を探すことができるかもしれません。
おわりに
以上、個人的な「TCA の歩き方 2022」でした🙏
TCA は良いライブラリというだけではなく、「開発していく上でのサポートが充実していること・最新の Swift の機能をうまく取り入れてくれがちなので Swift の新しい機能にもある程度詳しくなりやすい」という辺りも、個人的には TCA を利用していて良いなと感じているポイントです。
この記事が、これから TCA をキャッチアップするどなたかの参考になれば嬉しいです!
Discussion