iOS
Swift
VIPER

【Swift】VIPER導入のススメ

前段

  • MVCから脱却したくてMVPを勉強し、実際に導入してみた
  • そこで以下の学びがあった
    • テスト書けそうで実は書けないコードになっていなかった。(勉強不足)
    • ModelとPresenterのどちらに書くべきかをちゃんと決めていなかったので、
      FatPresenterやFatModelを作り出してしまった
    • 画面遷移処理をPresenter→Viewにお願いする必要があり、
      画面の更新処理と混在して見通しが悪くなった

そこでVIPER!

VIPERって?

こちらの記事にまとめましたので、詳しくはそちらを参照ください

導入してよかったと思うポイント

  • 単一責任の原則をとっており、どこにどの処理を書くべきかが定められている
    →実装するときに処理をどこに書くかで迷わなくなった
  • Routerがいい仕事している
    • Routerを見れば依存関係がわかる
    • DIの方法が確立しているのでテストをかけるコードになった
    • Viewが画面の更新処理だけに集中できるようになり、コードの見通しがよくなった
Routerのサンプル
protocol HogeWireframe: class {

    // HogeViewから遷移したい画面をここに書く
    func showFugaView()
}

class HogeRouter {

    // HogeViewControllerが必要なのでイニシャライザで受け取る
    weak var viewController: UIViewController?

    private init(viewController: UIViewController) {
        self.viewController = viewController
    }

    // DI 定型文
    static func assembleModule() -> UIViewController {
        let view = HogeViewController()
        let interactor = HogeInteractor()
        let router = HogeRouter(viewController: view)
        let presenter = HogePresenter(view: view, interactor: interactor, router: router)

        view.presenter = presenter
        interactor.output = presenter

        return view
    }
}

extension HogeRouter: HogeWireframe {

   // 画面遷移の処理
   // 遷移先のDIは遷移先のRouterにお願いする
   func showFugaView() {
       let fugaView = FugaRouter.assembleModule()
       // イニシャライザで受け取ったviewControllerはここで使う
       viewController?.navigationController?.pushViewController(fugaView, animated: true)
   }
}

学びをすべて解消できた!!

導入までにやったこと

まずはお勉強

VIPERに関する記事やらコードをみてお勉強

実際に書いてみる

  • 書くときに迷わないのと、Routerのいい仕事してる感が感じ取れたら、VIPERの魅力に気付けた証拠
  • ※書いてるとわかるが、毎回同じようなコードを書く必要がある。1つの画面を作るだけでも5つのファイルを作る必要がある…。

コード自動生成ツールを導入

満を持して会社のコードに適用&布教

  • 勉強してても最初は書き慣れておらずコーディングに時間がかかるので、その旨をチームの人に行っておくのが大事だった。
  • アーキテクチャのミニ勉強会を開催して、VIPERの布教活動
    • 書く人だけじゃなく、コードレビューをしてくれる人も巻き込んだ
    • モバイルアプリアーキテクチャ勉強会の記事を上から順番に説明しつつ、VIPERを含めたいろんなアーキテクチャの勉強をした

最後に

  • VIPERの特徴
    • 単一責任で処理を書く場所が決まっている
    • RouterのおかげでDIと画面遷移の仕組みが確立している
    • 生成するファイルが多いので、自動生成ツールで解決
  • 前段のように同じ悩みを持っている人は導入を検討してもらいたい
    • Routerだけでも導入するとよい
  • VIPERは最高