「ReactorKitを実戦投入してみて」Yu Sugawara, Picos
菅原祐氏で「ReactorKitを実戦投入してみて」というタイトルでの発表です。菅原氏はPicosという制作会社の代表で、iOSエンジニアでもあります。札幌を拠点として活動しており、今回はこのイベントのために来ていただきました。また、日本ではいち早くReactorKitを利用している開発者の一人です。
発表では、ReactorKitの利点と実践するにあたって発生した課題およびそのアプローチについて話してもらいました。
ReatorKitの利点
まず、ReactorKitの利点についてです。大きく2つあり、ひとつは強力な規約があること、もうひとつは軽量であることと菅原氏は話しました。
多くのアーキテクチャでは、アーキテクチャを理解して正しい実装に落とすことは容易ではありません。これらは具体的な規約を持たず、チームやプロジェクトに依存するためです。一方Fluxライクなアーキテクチャを実現するReactorKitでは柔軟性がありつつ、非常に強力な規約があることが強みです。そのため、導入してすぐにコードを書くことができます。
次に、軽量であることについて触れました。作者のキーノートでも説明があった通り、ReactorKitは非常にシンプルなコンセプトを持ちます。実装として登場するプロトコルもView ProtocolとReactor Protocolの2つだけです。実際に導入して、責務の分割がわかりやすい粒度であったと実感したそうです。
また、RxTodoやCleverbotやDrrribleといった具体的なアプリケーションでの実装を確認できるのも魅力的だと語りました。
実践投入して悩んだポイントとそのアプローチ
続いて、1.5人月規模のプロジェクトで導入したときに悩んだポイントと、そのアプローチについてです。以下の5つの疑問について触れられました。ひとつずつ見ていきます。
- 画面遷移は誰が行う?
- Alert表示は誰が行う?
- Realmとの組み合わせ方は?
- NoActionのReactorは必要?
- UITableViewCellのReactorは誰が管理する?
画面遷移は誰が行う?
Reactorの登場により、状態管理の責務はReactorへ移動しましたが、画面遷移のロジックはどうでしょうか? 例えば、MVVMでは、ViewModelというのがひとつの答えでないでしょうか。一方でReactorKitを使った場合はどうでしょう? 菅原氏はViewレイヤに書くという結論に至っています。少なくともReactorはUIKitをimportしてはいけないためReactor内で行うのはNGのようです。
Alert表示は誰が行う?
例えば、編集画面で編集を中断しようとして編集内容が失われるような場合、「Are you sure?」といったAlertを表示することが一般的ですが、こうしたAlertは誰が行うのでしょうか? Alertの画面遷移ではあるので、VIewレイヤでしょうか? 菅原氏はServiceレイヤだと述べています。これを行う理由として、AlertのActionを型安全にできることを挙げています。菅原氏はこの考え方に賛否がありそうだとも付け加えていますが、ユーザの操作を伴う副作用もActionストリーム内の反応(React)のひとつに過ぎないと考えることができると主張していました。
Realmとの組み合わせ方は?
Realmをキャッシュなどの用途に利用している開発者も多いかと思います。RealmとReactorKitをどのように組み合わせるのか? 菅原氏はServiceレイヤからのGlobal Eventを利用するのが答えだと述べています。さらにRealmは優秀な通知機能を持っているので、そのイベントをtransformでマージします。一方で、変更のActionがあった場合は、actionからServiceを呼び出しますが、mutationを返さずemptyにします。これにより、actionからservice、serviceからrealm、realmからtransformを経由してreduceにmutationが流れてくるようになります。
NoActionのReactorは必要?
続いての疑問は非常に興味深いです。Actionを持たない、つまりNoActionのReactorが必要なのかという疑問です。通常、ユーザのインタラクションを受け取り状態を更新するためにReactorを作成します。菅原氏の意見は「必須ではないが、いくつかの利点も考えられる」です。具体的にはどういったことでしょうか。例えば、Global Eventからの変更を受け取りたいなど、アクションなしでもリアクティブにしたいケースがあります。確かにこういったケースではNoActionになります。
UITableViewCellのReactorは誰が管理する?
UITableViewControllerとそのReactorがあり、さらに複数のUITableViewCellとそのReactorという構成を考えます。このときCellに対応するReactorは動的に増減しますが、これは誰が管理するのでしょうか? 菅原氏の答えは、UITableViewControllerのReactorです。
まとめ
- ReactorKitの方にはめた設計は楽
- Protocolの準拠するだけなので柔軟な設計が可能
- 単方向ストリームはシンプルで整理しやすい
- アーキテクチャ構築のコード量を削減
