#presentation
Date : 2021/06/17
[https://youtu.be/5p6h5yiQ2PQ](https://youtu.be/5p6h5yiQ2PQ)
cookpad, AbemaTV, Merpay の3社のマルチモジュール事情を話す会
## 各社のマルチモジュール事情
### cookpad

Feature : Scene というあるまとまった機能、画面単位で中はVIPERで構成されてる
デメリットとしては、Feature 同士の依存が解決できないという問題が生じるが、[https://techlife.cookpad.com/entry/2021/06/16/110000](https://techlife.cookpad.com/entry/2021/06/16/110000) にその解決方法が投稿されてる
### AbemaTV

レイヤーでモジュールを分けている
UILayer
- UIResource だけが Dynamic Framework であとは Static Link してる
### Merpay

メルカリアプリに組み込まれるSDKとして提供されている
Shared は、Dynamic Framework
Feature は、Static Library + Bundle
インフラ系とFeature系をまず横で分けた上でFeatureを縦に分けるという方針
## メリット
- FeatureA だけをビルドして動かせば FeatureA に関連した修正やテストを実行できるので開発の中で必要なビルド速度が改善される
- フルビルドは変わらない
- 部署ごとに1つのモジュールだけを見ればよく他のモジュールへの依存がなくなる (コンウェイの法則的な考え方)
- UIComponent の導入をしてUIの確認が早くできるようになったのがよかったところ
- モジュールを分割する際のオーナーシップが生まれる
## デメリット
- 依存関係の管理や依存関係の解決が技術的な課題でオーバーヘッドがある
- どのモジュールに何を置くのかがわからないという混乱もある
- ボイラープレートや各モジュール間のモデルの変換などが発生する
## 依存関係
- メルペイでは、Merpay Schene 一覧が Core にあって他のFeature間での画面遷移のマッピングをしてる
- クックパッドは Resolver という仕組みで上の話を実装してて、どこまで依存関係を許可するのかというポリシーの定義が問題にあった。クックパッドはドメインとデータストアと画面を依存関係として取り出せるようになってる
- メルペイでは、画面だけしか取り出せない。しかも他のモジュールから呼び出されるような画面だけを定義してる
- アプリ全体で使うような機能はサードパーティ的に全体にまたがるモジュールとして定義されている
- Abemaでは、同じ層のクラスは呼び出せないようにしてる
- ただし規約レベルで守るみたいになってしまうので型でのチェックができなかったりする
- メルペイは最初は、Feature が Dynamic Library だったけど、リファタリングの際に Static Library になった
- Static Library にすると、シンボルの重複によってimportできないようにしてる
## SandboxアプリをQAなどでも使うのか
- クックパッド -> フルビルドでビルドしたアプリで検証する
- Abema -> UIカタログ用のアプリなので、検証には使ってない
- メルペイ -> メルカリアプリと一緒にBundleしたもので検証する
## 細かいモジュールに対するサードパーティーライブラリの依存
- クックパッド -> CocoaPods に入れる場合には、Core に入れて全体で使うようにしてる。XCFramework は基本モジュールごとにdynamic frameworkで解決してる
- メルカリ -> CocoaPodsでいれるようなものはアプリのターゲットに入れてる (各モジュール向けにprotocolなどでインターフェースを切るようにしてる)
## Feature Module を分割すればするほど Core が肥大化する
- クックパッド -> コードの重複ができてしまってもFeature Moduleにモデルを作ることもある。Core Module になるべく実装を持っていかないようにしてる。
- メルペイ -> Core に必要なものは肥大化しつつある
- 感想
- 基本的には、Entity やドメインでのモジュール分割がなされるべきなのでモデルが肥大化するってことは避けたい気もする
## ビルドされたライブラリのキャッシュ
- クックパッド -> もともとはCIでネットワークキャッシュしてた。今はローカルキャッシュするようにしてる