ホットペッパービューティーアプリリプレイスとmvcp

42
ホットペッパービューティー アプリリプレイスとMVCP CAMPFIRE iOS #1 2017/03/16 @nirazo

Upload: recruit-lifestyle-co-ltd

Post on 11-Apr-2017

607 views

Category:

Engineering


0 download

TRANSCRIPT

Page 1: ホットペッパービューティーアプリリプレイスとMVCP

ホットペッパービューティー

アプリリプレイスとMVCPCAMPFIRE iOS #1 2017/03/16 @nirazo

Page 2: ホットペッパービューティーアプリリプレイスとMVCP

• 韮澤 賢三(にらさわ けんぞう)

• (株)リクルートライフスタイル

ホットペッパービューティー iOSアプリ開発担当

• 日本グミ協会CTO (@gummi_life)

Page 3: ホットペッパービューティーアプリリプレイスとMVCP

今日話すこと

• ホットペッパービューティーアプリリプレイスの背景と説明

• リプレイスで採用したMVCPの実装方法の説明

• MVCPを導入してみた結果(良さ)について

Page 4: ホットペッパービューティーアプリリプレイスとMVCP

今日話すこと

• ホットペッパービューティーアプリリプレイスの背景と説明

• リプレイスで採用したMVCPの実装方法の説明

• MVCPを導入してみた結果(良さ)について

Page 5: ホットペッパービューティーアプリリプレイスとMVCP

アプリリプレイス?

• Ver1.0リリースは2010年8月

• 6年半、秘伝のソースコードに継ぎ足し継ぎ足し…

• 仕様が詳細にまとまっていない部分も多々

• かつ複雑な仕様も多々…

Page 6: ホットペッパービューティーアプリリプレイスとMVCP

2000行超え、1000行超えVC続出

LOCは20万行弱

Page 7: ホットペッパービューティーアプリリプレイスとMVCP

明確な設計指針は無い

Page 8: ホットペッパービューティーアプリリプレイスとMVCP

リプレイスして未来を照らそう

Page 9: ホットペッパービューティーアプリリプレイスとMVCP

リプレイスで目指していること (要約)• 今後5年、10年と安全かつ素早くサービスのエンハンスが行えるようにする

• そのために明確な設計指針を設け、コード品質を安定化させる

• テスト対象が明確で、テストコードが書ける作りにする

Page 10: ホットペッパービューティーアプリリプレイスとMVCP

本日の話の前提

• 本リプレイスは現在進行中(7~8割程度実装済み)であり、今回の話も未リリースのプロジェクトについての話です

• Obj-C -> Swiftの言語リプレイスも同時にやっています

Page 11: ホットペッパービューティーアプリリプレイスとMVCP

今日話すこと

• ホットペッパービューティーアプリリプレイスの背景と説明

• リプレイスで採用したMVCPの実装方法の説明

• MVCPを導入してみた結果(良さ)について

Page 12: ホットペッパービューティーアプリリプレイスとMVCP

MVCP

Page 13: ホットペッパービューティーアプリリプレイスとMVCP

MVCP?

• iOS版MVP

• Model, ViewController, PresenterだからMVCPでは!?という議論(?)の末命名

Page 14: ホットペッパービューティーアプリリプレイスとMVCP

MVCP?

MVP (Passive View)のiOSバージョン

Page 15: ホットペッパービューティーアプリリプレイスとMVCP

ViewController

Page 16: ホットペッパービューティーアプリリプレイスとMVCP

ViewControllerの特性• View, Presenterを所有、管理できる

• Presenterからはクロージャ、Notificationによってのみ通知を受け付ける

• ライフサイクル系やAutoLayoutの処理等、必要最低限に留める(ホットペッパービューティーではSnapKit使用)

• テストコードを書く対象になる処理は書かない

Page 17: ホットペッパービューティーアプリリプレイスとMVCP

ViewControllerの役割

• ライフサイクル系

• Viewの更新

• UIパーツのアクション

• アニメーション

• 画面遷移

• ダイアログ/アクションシート

• Notificationの受け付け

Page 18: ホットペッパービューティーアプリリプレイスとMVCP

Presenter

Page 19: ホットペッパービューティーアプリリプレイスとMVCP

Presenterの特性

• 表示用データの取得、加工

• Viewと直接やりとりは行わない(VC経由)

• Modelを所有、管理できる

• ほぼ1VCに1Presenter

• テストコード記述対象

Page 20: ホットペッパービューティーアプリリプレイスとMVCP

Presenterの役割

• UI入力のチェック

• Modelのデータの表示用の加工

• 表示用データの取得・保持

• (Closureをもらって)Viewの更新

• 画面に依存したロジック

• 効果計測用ログ送信処理

Page 21: ホットペッパービューティーアプリリプレイスとMVCP

Model

Page 22: ホットペッパービューティーアプリリプレイスとMVCP

Modelの特性

• ビジネスロジックを実装するレイヤー

• テストコード記述対象

Page 23: ホットペッパービューティーアプリリプレイスとMVCP

Modelの役割

• ビジネスロジック

• 我々のアプリだと、単純にAPIを叩いてcallback実行、というケースが多い

• API追加読み込み制御

• UserDefaults, DBへのアクセス

Page 24: ホットペッパービューティーアプリリプレイスとMVCP

実装例

Page 25: ホットペッパービューティーアプリリプレイスとMVCP

エリア選択画面

Page 26: ホットペッパービューティーアプリリプレイスとMVCP

ViewController

Presenterを保持

メソッドはライフサイクル系に留め、 それ以外のメソッドは極力VCには書かない

(UINavigation絡みはVCに書く)

計算等の処理自体はPresenterに任せる

Page 27: ホットペッパービューティーアプリリプレイスとMVCP

Presenter

Modelを保持(複数APIを呼ぶ際は複数可)

ModelにAPI叩かせる

表示に関連するenumはPresenterで保持

row数やsection数など、表示に

関連するロジックはPresenter持ち

Page 28: ホットペッパービューティーアプリリプレイスとMVCP

Model

API通信を行う

API側でビジネスロジックを持っていない部分については、Modelにビジネスロジックを記述

Page 29: ホットペッパービューティーアプリリプレイスとMVCP

今日話すこと

• ホットペッパービューティーアプリリプレイスの背景と説明

• リプレイスで採用したMVCPの実装方法の説明

• MVCPを導入してみた結果(良さ)について

Page 30: ホットペッパービューティーアプリリプレイスとMVCP

何故MVCP?

• 設計自体の学習コストと得られるメリットのトレードオフ

• 検証用アプリを小さく作る中で、少ない学習コストで恩恵が受けられそうな見込みがあった

Page 31: ホットペッパービューティーアプリリプレイスとMVCP

入れてみて

• 導入のハードルが低い!

• 新規参画者も理解しやすい

• ViewControllerの見通しが良くなる

• UnitTest可能範囲が明確

なところ

Page 32: ホットペッパービューティーアプリリプレイスとMVCP

入れてみて

• 導入のハードルが低い!

• 新規参画者も理解しやすい

• ViewControllerの見通しが良くなる

• UnitTest可能範囲が明確

なところ

想定どおり!!

Page 33: ホットペッパービューティーアプリリプレイスとMVCP

入れてみて

• MVCと比べると登場人物が増えてしまう…

• が、「書くのしんどい!」というレベルでは無い

• 我々のアプリだとModelの役割が少し軽すぎてただのパイプになっている感あり

なところ

Page 34: ホットペッパービューティーアプリリプレイスとMVCP

入れてみて

• MVCと比べると登場人物が増えてしまう…

• が、「書くのしんどい!」というレベルでは無い

• 我々のアプリだとModelの役割が少し軽すぎて少しもったいない感あり

なところ

正直デメリットは そこまで感じなかった

Page 35: ホットペッパービューティーアプリリプレイスとMVCP

入れてみての実績

Before (.mファイルのみ)

After (実装7割程度)

LOC 182612 70722

実装 ファイル数 847 648

Page 36: ホットペッパービューティーアプリリプレイスとMVCP

まだまだ課題はあるものの、 見通しはかなり良くなってます

Page 37: ホットペッパービューティーアプリリプレイスとMVCP

入れてみての実績

• テストコードは絶賛実装中!!

Page 38: ホットペッパービューティーアプリリプレイスとMVCP

まとめ

Page 39: ホットペッパービューティーアプリリプレイスとMVCP

MVCPはバランスが取れてて良い

• 1x万行レベルのアプリでも、恩恵は十分に得られる

• 疎にしてテスト範囲の明確化

• VCの見通しをクリアに

• 学習コストが低く、とりあえずで試しやすい

• Modelが複雑化してきたらClean ArchitectureやVIPERに比較的移行しやすい

Page 40: ホットペッパービューティーアプリリプレイスとMVCP

iOSアプリの設計に 悩んでいる皆さま

Page 41: ホットペッパービューティーアプリリプレイスとMVCP

まずはライトに、MVCPから始めてみては?

Page 42: ホットペッパービューティーアプリリプレイスとMVCP

~ fin ~