ビズリーチiOSアプリをクリーンアーキテクチャでフルリニューアル

ビズリーチ事業部のiOSアプリチームの権(ゴン)です。今回はビズリーチのiOSアプリの開発にClean Architectureを導入したので、そのお話をさせていただきます!

背景/経緯

2018年5月7日。Apple様より以下のご信託がありました。

iOS 11 delivers innovative features and the redesigned App Store to hundreds of millions of customers around the world. Your apps can deliver more intelligent, unified, and immersive experiences with Core ML, ARKit, new camera APIs, new SiriKit domains, Apple Music integration, drag and drop for iPad, and more. Starting July 2018, all iOS app updates submitted to the App Store must be built with the iOS 11 SDK and must support the Super Retina display of iPhone X.

簡単にいうと、「Xcode9(Swift4系)を使ってビルドしたアプリじゃないとアップデートできないよ」

_人人人人人人人人人人人人人人_
> 突然のアップデートできない <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄

ええ、全ゴンに激震が走りましたね。

当初Xcode7(Swift2系)を使って開発を行っていたビズリーチアプリは対応必須。Xcode8(Swift3系)の対応も後回しにしていたツケが回ってきてしまいました。

Swift3からSwift4ではそうでもないですが、Swift2からSwift3のアップデートは結構なボリュームで、これならいっその事、機能を変えずにイチから作り直してしまおう。そして、今回の機会を活かして、今後のメンテナンス性も考えClean Architectureを導入しようという決断に至りました。

クリーンアーキテクチャーとは

iOSのClean Architectureでよく言われているのが、DDD(ドメイン駆動開発)のDomain層, Data層をもう少し細かくレイヤーを分けたようなイメージ。

こまかい説明やイメージ画像は検索すればいくらでも見つかるため、今回はここでの説明は省かせていただきますが、現在弊社のソースは1ファイルに膨大な量のコードが書かれており、コンフリクトなどが日常茶飯事でした。そういった部分をClean Architectureを導入することによって改善できればと思い導入に至りました。

で、実際やってみ。。る前に!

実際作業に入る前に大事なことが1点あります。

それは。。

何をどこに書くか認識を合わせること。

当たり前なことですが、これはとても大事です。

レイヤーを細かく分ける分、それだけ認識がずれやすくなります。

一人認識がずれてしまうと、そこから書き方がずれていってしまいます。

そして、結果その一人の担当した箇所が全リファクタリングになったり。。

そう、僕がやってしまったようにね

なので、ここは時間がかかってもいいので、バッチリ認識合わせしてください。

で、実際やってみた!

僕のやらかしはスルーしますが、実際やってみると最初はめちゃくちゃ時間かかります。

そりゃぁレイヤーを細かくしたら、1ファイルに書くソース量は減ってもファイル数が増えて大変ですよね。あと、書いてるとこんなに細かく書く必要ある!?ってところも出てきます。

個人的には

UseCase ↔ Repository ↔ Datastore
  ↕
Translator

受けて渡して受けて渡して受けて渡して。。

1ファイルでやればいいじゃなあああああああああああああい

でもそこはね。一度決めればやらないとね。

一人が違うことするとね。あとで盛大にリファクタリング発生しちゃいますからね。

そう、僕がやってしまったようにね

ビズリーチ事例紹介

まずビズリーチの既存ソースの説明をするとAという機能があり、その中にa,b,cという画面があるとします。皆様はstoryboardはどう分けるでしょうか。

お恥ずかしい話ですが、ビズリーチはAというstoryboardの中にa,b,cすべての画面をぶっこんでいました。そしてa,b,cそれぞれViewControllerを作る。

ファイル名の整合性も取れず、どの画面がどのstoryboardにあるかもわからない。そんな状態だったディレクトリ構造がこうなりました。

ばばん!!

BeforeAfter

なんということでしょう~

Clean Architecture導入前はstoryboardとViewControllerだけだったものが、14ファイルに〜(いい意味で)

どこになにが書いてあるかわからなかったソースが、細かく分けたことによりひと目でわかるように〜

これでもうソースを開いてひたすらスクロールする心配はありません。

これからはこのディレクトリ構造でコンフリクトせずに複数人でソースの修正ができることでしょう〜

結果

上記内容を見てどう思ったでしょうか。

ディレクトリ構造だけではちょっと分かりづらいのですが、とあるViewControllerは1000行以上のボリュームでした。1ファイルの中にすべてのレイヤーが凝縮されてるんですね。それを各レイヤーで細かく役割分担することによって、修正に伴う工数がかなり効率化。

そして、新規メンバー参入時に「どこになにがあるか」の説明が容易になり、新規メンバー参入へのハードルがかなり下がりました。

まとめ

実際やってみて思ったのですが、ちょっとした画面でもレイヤーを細かく分けるので、こんなに細かくする必要ある?!って場面が多々出てきます。(1ファイル10行くらい)でも、ある程度出来上がってくると、修正範囲がかなり明確になり、いざ修正する際にかなり楽に修正箇所を特定することができるようになりました。

また、1つのstoryboardに対して、複数のViewControllerを使用していたところを、1体1としたため、影響範囲が調べやすくなり、デグレを起こす確率も少なくなりました。

弊社ではアプリエンジニアが少ないため、こういったアーキテクチャを今後導入することによって、開発の敷居を下げ、もっとアプリエンジニアを増やしていきたいと思います。