SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

イベントレポート

ReactorKitの生みの親も登壇した「ReactorKit Meetup Japan」レポート

「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のようです。

Fig. 2.1 Viewのbind関数内で画面遷移を定義(登壇資料:Page 25より引用)
Fig. 2.1 Viewのbind関数内で画面遷移を定義(登壇資料:Page 25より引用)

Alert表示は誰が行う?

 例えば、編集画面で編集を中断しようとして編集内容が失われるような場合、「Are you sure?」といったAlertを表示することが一般的ですが、こうしたAlertは誰が行うのでしょうか? Alertの画面遷移ではあるので、VIewレイヤでしょうか? 菅原氏はServiceレイヤだと述べています。これを行う理由として、AlertのActionを型安全にできることを挙げています。菅原氏はこの考え方に賛否がありそうだとも付け加えていますが、ユーザの操作を伴う副作用もActionストリーム内の反応(React)のひとつに過ぎないと考えることができると主張していました。

Fig. 2.2 mutate関数でAlert表示をするサービスを呼ぶ(登壇資料:Page 31より引用)
Fig. 2.2 mutate関数でAlert表示をするサービスを呼ぶ(登壇資料:Page 31より引用)

Realmとの組み合わせ方は?

 Realmをキャッシュなどの用途に利用している開発者も多いかと思います。RealmとReactorKitをどのように組み合わせるのか? 菅原氏はServiceレイヤからのGlobal Eventを利用するのが答えだと述べています。さらにRealmは優秀な通知機能を持っているので、そのイベントをtransformでマージします。一方で、変更のActionがあった場合は、actionからServiceを呼び出しますが、mutationを返さずemptyにします。これにより、actionからservice、serviceからrealm、realmからtransformを経由してreduceにmutationが流れてくるようになります。

Fig. 2.3 サービスレイヤを通してGlobal Eventを利用(登壇資料:Page 44より引用)
Fig. 2.3 サービスレイヤを通してGlobal Eventを利用(登壇資料:Page 44より引用)

NoActionのReactorは必要?

 続いての疑問は非常に興味深いです。Actionを持たない、つまりNoActionのReactorが必要なのかという疑問です。通常、ユーザのインタラクションを受け取り状態を更新するためにReactorを作成します。菅原氏の意見は「必須ではないが、いくつかの利点も考えられる」です。具体的にはどういったことでしょうか。例えば、Global Eventからの変更を受け取りたいなど、アクションなしでもリアクティブにしたいケースがあります。確かにこういったケースではNoActionになります。

UITableViewCellのReactorは誰が管理する?

 UITableViewControllerとそのReactorがあり、さらに複数のUITableViewCellとそのReactorという構成を考えます。このときCellに対応するReactorは動的に増減しますが、これは誰が管理するのでしょうか? 菅原氏の答えは、UITableViewControllerのReactorです。

Fig. 2.4 UITableViewControllerのReactorがStateとして持つChatViewSection(登壇資料:Page 54より引用)
Fig. 2.4 UITableViewControllerのReactorがStateとして持つChatViewSection(登壇資料:Page 54より引用)

まとめ

  • ReactorKitの方にはめた設計は楽
  • Protocolの準拠するだけなので柔軟な設計が可能
  • 単方向ストリームはシンプルで整理しやすい
  • アーキテクチャ構築のコード量を削減

次のページ
「Architecture and ReactorKit」Yoichi Tagaya, Mercari

この記事は参考になりましたか?

イベントレポート連載記事一覧

もっと読む

この記事の著者

永田 健人(ウォンテッドリー株式会社)(ナガタ ケント)

 ソフトウェアエンジニア。ウォンテッドリー株式会社所属。Wantedly Visitを通して、より多くの人と企業が「気軽に出会う体験」をつくっています。サーバサイドはRails、フロントはReact/Redux、iOSでSwiftをメインに開発をしています。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/10971 2018/07/25 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー