こんにちは、株式会社スタメンでiOSエンジニアをしている青木 (@38Punkd)です。
弊社iOSアプリチームは、開発人数が増えるにつれて、コンフリクト頻度が増えることに悩まされていました。
またアプリの機能も増え、機能や画面間の依存関係が複雑になりつつあり、開発生産性を下げる要因になっていました。
今回この問題を解消するためにマルチモジュール化を行いましたので、その概要をご紹介できればと思います。
マルチモジュール化とは?
アプリのコードを、複数の独立したモジュール(単位)に分割することを指し、アプリの開発や保守を楽にするための手法です。
マルチモジュール化を進めることで、大規模なアプリを複数の小さなモジュールに分割して、それぞれのモジュールで独立して開発・テスト・管理できます。
iOSの場合、後述するプロジェクトファイルの厄介な問題も解消できます。
プロジェクトファイルとは
Appleの提供するOS上(iOS, macOS, watchOS, etc..)で動くアプリを開発する時に必要なメタデータが記述されたファイル(project.pbxproj)です。
ソースコードを統合開発環境Xcodeが自動生成したインデックスで紐づけて管理しています。
ファイルの追加・移動・削除時などに、このプロジェクトファイルに変更が加わります。
複数人で開発をしていると、ファイル操作を同じタイミングで行うことは良くあるかと思いますが、その際にプロジェクトファイルが、オートマージ不可能なコンフリクトを容易に起こしてしまいます。
自動生成されたメタデータのコンフリクト解消は、中々に辛いものがあります。
遂にマルチモジュール化に踏み切る
iOSのマルチモジュール化では、アプリのソースコードを Embedded Framework ないしは Swift Package にしてモジュール化を行います。
今回私たちは、アプリのソースコードをほぼ全て、 Swift Package にしてモジュール化を行いました。
Swift Package は、Apple 標準のパッケージマネージャ Swift Package Manager と同じくして登場した、新しいパッケージの種類です。
Swift Package 内の個々のファイルに対しては、プロジェクトファイルによるインデックス管理下から外れるため、上述したプロジェクトファイルでのコンフリクト頻度が激減します。
私たちのチームでは昨年、パッケージマネージャを Carthage から Swift Package Manager に移行していました。
既にSwift Package Manager を導入済みの環境であれば、アプリのソースコードを Swift Package 化もしやすいと考えました。
マルチモジュール後の構成
レイヤー × 機能 で以下のようにモジュール分割をしました。
(実際にはユーティリティ等の小さめのモジュールもありますが、割愛しています)
データベースや外部ライブラリに依存する実装と、アプリの機能を表現する実装は、関心事が違うので、Data モジュールと Domains モジュールで分けました。
開発は基本的に機能単位で行うことが多いので、Domainsモジュールに存在する各機能は、疎結合でありたいです。
なので、Module A, Module B, ... というように各機能をさらにモジュール化して分けました(サブモジュール化に相当します)。
よかったこと
Swift Package によるマルチモジュール化を行ったことで、コンフリクト頻度が減ったことはもちろん、機能間の依存関係が単一方向になるよう矯正され、より疎結合・高凝集なコードになりました。
また、既存のコードから関心の分離を行なっていく過程で、責務についての議論をチームで活発に行うことができ、ソースコードへの深い理解につながるという副次的な効果も得られました。
今後の展望
機能毎でモジュールを分けたことで、ビルド直後に、指定の機能にショートカットしてアクセスできるミニアプリを作れるようになります。
ビルドターゲットをこのミニアプリにすれば、機能が増えてもビルド速度を高速に保つことが可能です。
今後はミニアプリを各機能毎に作り、開発生産性をさらに高めていければと思います。
最後に
try! Swift Tokyo 2024 に出展します!
弊社は、2024年3月22日~24日の3日間、ベルサール渋谷ファーストにて開催される
「try! Swift Tokyo 2024」 tryswift.jp
に、ゴールドスポンサーとして協賛し、ブース出展を致します。
この3日間を通して、iOSエンジニアの皆様や、他の様々な技術分野の皆様とお会いできることを心よりお待ちしております!!
採用情報
スタメンでは、iOSエンジニアに限らず全技術領域で、プロダクトを成長させていくエキスパートを募集しています。
もし興味を持っていただけたら、下記からご応募ください!