Swiftのビルド時間と戦うためのprivateなViewModel
Swiftではよくそのビルド時間が問題として話題になります。
- コンパイラに型推論をさせすぎない
- module分割をする
- Mac Proを買う
などなど、対策方法はあります。
原因の1つに、ファイル数が増えれば増えるほどビルドに時間がかかるというものがあります。
FiNCでは931ものSwiftファイルが存在していました。。
ビルド時間を検証
実際にファイル数が増えると、どれくらいビルド時間が変わるのかというのを簡易的に検証してみました。
ViewControllerとViewModelを1ファイル内に分けずにおき100ファイル持っているプロジェクトA
# プロジェクトA# ViewController1.swift
import UIKitclass ViewController1: UIViewController { private let viewModel = ViewModel1()}private class ViewModel1 {}
ViewControllerとViewModelを2ファイルに分けた組み合わせを100組持っているプロジェクトB
# プロジェクトB# ViewController1.swift
import UIKitclass ViewController1: UIViewController { private let viewModel = ViewModel1()}# ViewModel1.swift
import Foundationclass ViewModel1 {}
プロジェクトABでそれぞれclean buildを10回試してみたところ、プロジェクトAの方が30%ほどビルド時間が短くなるという結果が出ました。
1ViewController、1ViewModel
Swiftの特徴を生かした1ファイル2クラス
FiNCではMVVMを採用していてほとんどの画面で、ViewControllerとViewModelが1つずつセットで存在します。
単純に考えても1画面につき最低でも2ファイル、TableViewを使う画面ではCellもあるのでもっと沢山のファイルを使います。
画面が増えれば増えるほど大量のファイルを使用することとなるので、なんとかしなければ。
ということで、1つのファイル内にClassを複数書くことができるSwiftの特徴を利用して、新規作成時には1つのファイル内にViewControllerとViewModelをセットでおくことを試しています。
メリットとデメリットを天秤にかけた選択
もちろんViewControllerが肥大になることや、可読性の問題がないわけではありません。
1つのファイル内にClassを複数置くことで起きる問題とビルド時間とを天秤にかけた時に、FiNCではビルド時間の問題解決を優先しました。
try! Swiftの「スタートアップのSwift」という講演では、「最初はミニマムで作り必要な時が来たら変更を加えていく」というような話もありましたが、僕たちも新規作成時にできるだけ無駄なファイルを増やさずに行こうという方針で開発をしています。
新しくJoinしたメンバーには少し驚かれることもありますが、UITableViewが書かれたファイル内に複数のUITableViewCellが置かれていたりもします。
同じファイル内にViewControllerとViewModelを置くことでAccessControlを縛ることができます。
final class FiNCViewController: UIViewController {
private let viewModel = ViewModel()
}private final class ViewModel {}
このようにすると、ViewModelという名前を使っても他の画面のViewModelと名前衝突が起きることがありません。
これは思わぬ副産物でした。
チームへの浸透
1ファイルに2つのクラスを置くという単純な話でも、チームメンバーへ新しいやり方を浸透させる部分まで考えないとなかなかうまくいきません。
そこでtry!Swiftの「チームの生産性を改善するために決断疲れを最小化する」という講演であった、「Xcodeのテンプレートを活用する」という話を参考に、1ファイルにViewControllerとViewModelを書いたテンプレートファイルを用意することにしました。
ViewController新規作成時にはViewModel部分まで作ってしまうので、これでだいぶ浸透できるのでは思っています。
最後に
記事の中でちょいちょい出てきましたが、FiNCではtry!Swiftへチームメンバー6人で参加していました。
今度は6月のWWDCにみんなで行けないかなーなんて考えています。
そんなFiNCに興味がある方はこちらからhttps://www.wantedly.com/projects/71417