Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
ホットペッパービューティー
アプリリプレイスとMVCP
CAMPFIRE iOS #1 2017/03/16
@nirazo
誰
• 韮澤 賢三(にらさわ けんぞう)
• (株)リクルートライフスタイル
ホットペッパービューティー

iOSアプリ開発担当
• 日本グミ協会CTO (@gummi_life)
今日話すこと
• ホットペッパービューティーアプリリプレイ
スの背景と説明
• リプレイスで採用したMVCPの実装方法の説
明
• MVCPを導入してみた結果(良さ)について
今日話すこと
• ホットペッパービューティーアプリリプレイ
スの背景と説明
• リプレイスで採用したMVCPの実装方法の説
明
• MVCPを導入してみた結果(良さ)について
アプリリプレイス?
• Ver1.0リリースは2010年8月
• 6年半、秘伝のソースコードに継ぎ足し継ぎ足
し…
• 仕様が詳細にまとまっていない部分も多々
• かつ複雑な仕様も多々…
2000行超え、1000行超えVC続出
LOCは20万行弱
明確な設計指針は無い
リプレイスして未来を照らそう
リプレイスで目指していること
(要約)
• 今後5年、10年と安全かつ素早くサービスの
エンハンスが行えるようにする
• そのために明確な設計指針を設け、コード品質
を安定化させる
• テスト対象が明確で、テストコードが書ける作
りにする
本日の話の前提
• 本リプレイスは現在進行中(7~8割程度実装済
み)であり、今回の話も未リリースのプロジェク
トについての話です
• Obj-C -> Swiftの言語リプレイスも同時にやってい
ます
今日話すこと
• ホットペッパービューティーアプリリプレイ
スの背景と説明
• リプレイスで採用したMVCPの実装方法の説
明
• MVCPを導入してみた結果(良さ)について
MVCP
MVCP?
• iOS版MVP
• Model, ViewController, Presenterだから
MVCPでは!?という議論(?)の末命名
MVCP?
MVP (Passive View)のiOSバージョン
ViewController
ViewControllerの特性
• View, Presenterを所有、管理できる
• Presenterからはクロージャ、Notificationによってのみ通知を
受け付ける
• ライフサイクル系やAutoLayoutの処理等、必要最低...
ViewControllerの役割
• ライフサイクル系
• Viewの更新
• UIパーツのアクション
• アニメーション
• 画面遷移
• ダイアログ/アクションシート
• Notificationの受け付け
Presenter
Presenterの特性
• 表示用データの取得、加工
• Viewと直接やりとりは行わない(VC経由)
• Modelを所有、管理できる
• ほぼ1VCに1Presenter
• テストコード記述対象
Presenterの役割
• UI入力のチェック
• Modelのデータの表示用の加工
• 表示用データの取得・保持
• (Closureをもらって)Viewの更新
• 画面に依存したロジック
• 効果計測用ログ送信処理
Model
Modelの特性
• ビジネスロジックを実装するレイヤー
• テストコード記述対象
Modelの役割
• ビジネスロジック
• 我々のアプリだと、単純にAPIを叩いてcallback実
行、というケースが多い
• API追加読み込み制御
• UserDefaults, DBへのアクセス
実装例
エリア選択画面
ViewController
Presenterを保持
メソッドはライフサイクル系に留め、
それ以外のメソッドは極力VCには書かない
(UINavigation絡みはVCに書く)
計算等の処理自体はPresenterに任せる
Presenter
Modelを保持(複数APIを呼ぶ際は複数可)
ModelにAPI叩かせる
表示に関連するenumはPresenterで保持
row数やsection数など、表示に
関連するロジックはPresenter持ち
Model
API通信を行う
API側でビジネスロジックを持っていない部分については、Model
にビジネスロジックを記述
今日話すこと
• ホットペッパービューティーアプリリプレイ
スの背景と説明
• リプレイスで採用したMVCPの実装方法の説
明
• MVCPを導入してみた結果(良さ)について
何故MVCP?
• 設計自体の学習コストと得られるメリットの
トレードオフ
• 検証用アプリを小さく作る中で、少ない学習コ
ストで恩恵が受けられそうな見込みがあった
入れてみて
• 導入のハードルが低い!
• 新規参画者も理解しやすい
• ViewControllerの見通しが良くなる
• UnitTest可能範囲が明確
なところ
入れてみて
• 導入のハードルが低い!
• 新規参画者も理解しやすい
• ViewControllerの見通しが良くなる
• UnitTest可能範囲が明確
なところ
想定どおり!!
入れてみて
• MVCと比べると登場人物が増えてしまう…
• が、「書くのしんどい!」というレベルでは無
い
• 我々のアプリだとModelの役割が少し軽す
ぎてただのパイプになっている感あり
なところ
入れてみて
• MVCと比べると登場人物が増えてしまう…
• が、「書くのしんどい!」というレベルでは無
い
• 我々のアプリだとModelの役割が少し軽す
ぎて少しもったいない感あり
なところ
正直デメリットは
そこまで感じなかった
入れてみての実績
Before
(.mファイルのみ)
After
(実装7割程度)
LOC 182612 70722
実装
ファイル数
847 648
まだまだ課題はあるものの、
見通しはかなり良くなってます
入れてみての実績
• テストコードは絶賛実装中!!
まとめ
MVCPはバランスが取れてて良い
• 1x万行レベルのアプリでも、恩恵は十分に得られる
• 疎にしてテスト範囲の明確化
• VCの見通しをクリアに
• 学習コストが低く、とりあえずで試しやすい
• Modelが複雑化してきたらClean Arc...
iOSアプリの設計に
悩んでいる皆さま
まずはライトに、MVCPから
始めてみては?
~ fin ~
Upcoming SlideShare
Loading in …5
×

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

1,982 views

Published on

2017/03/16に行われたCAMPFIRE iOS #1の発表資料です。
ホットペッパービューティーのアプリリプレイスで採用した、
iOS向けのMVPであるMVCPモデルについてご紹介します。

Published in: Engineering
  • Be the first to comment

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

  1. 1. ホットペッパービューティー アプリリプレイスとMVCP CAMPFIRE iOS #1 2017/03/16 @nirazo
  2. 2. 誰 • 韮澤 賢三(にらさわ けんぞう) • (株)リクルートライフスタイル ホットペッパービューティー
 iOSアプリ開発担当 • 日本グミ協会CTO (@gummi_life)
  3. 3. 今日話すこと • ホットペッパービューティーアプリリプレイ スの背景と説明 • リプレイスで採用したMVCPの実装方法の説 明 • MVCPを導入してみた結果(良さ)について
  4. 4. 今日話すこと • ホットペッパービューティーアプリリプレイ スの背景と説明 • リプレイスで採用したMVCPの実装方法の説 明 • MVCPを導入してみた結果(良さ)について
  5. 5. アプリリプレイス? • Ver1.0リリースは2010年8月 • 6年半、秘伝のソースコードに継ぎ足し継ぎ足 し… • 仕様が詳細にまとまっていない部分も多々 • かつ複雑な仕様も多々…
  6. 6. 2000行超え、1000行超えVC続出 LOCは20万行弱
  7. 7. 明確な設計指針は無い
  8. 8. リプレイスして未来を照らそう
  9. 9. リプレイスで目指していること (要約) • 今後5年、10年と安全かつ素早くサービスの エンハンスが行えるようにする • そのために明確な設計指針を設け、コード品質 を安定化させる • テスト対象が明確で、テストコードが書ける作 りにする
  10. 10. 本日の話の前提 • 本リプレイスは現在進行中(7~8割程度実装済 み)であり、今回の話も未リリースのプロジェク トについての話です • Obj-C -> Swiftの言語リプレイスも同時にやってい ます
  11. 11. 今日話すこと • ホットペッパービューティーアプリリプレイ スの背景と説明 • リプレイスで採用したMVCPの実装方法の説 明 • MVCPを導入してみた結果(良さ)について
  12. 12. MVCP
  13. 13. MVCP? • iOS版MVP • Model, ViewController, Presenterだから MVCPでは!?という議論(?)の末命名
  14. 14. MVCP? MVP (Passive View)のiOSバージョン
  15. 15. ViewController
  16. 16. ViewControllerの特性 • View, Presenterを所有、管理できる • Presenterからはクロージャ、Notificationによってのみ通知を 受け付ける • ライフサイクル系やAutoLayoutの処理等、必要最低限に留め る(ホットペッパービューティーではSnapKit使用) • テストコードを書く対象になる処理は書かない
  17. 17. ViewControllerの役割 • ライフサイクル系 • Viewの更新 • UIパーツのアクション • アニメーション • 画面遷移 • ダイアログ/アクションシート • Notificationの受け付け
  18. 18. Presenter
  19. 19. Presenterの特性 • 表示用データの取得、加工 • Viewと直接やりとりは行わない(VC経由) • Modelを所有、管理できる • ほぼ1VCに1Presenter • テストコード記述対象
  20. 20. Presenterの役割 • UI入力のチェック • Modelのデータの表示用の加工 • 表示用データの取得・保持 • (Closureをもらって)Viewの更新 • 画面に依存したロジック • 効果計測用ログ送信処理
  21. 21. Model
  22. 22. Modelの特性 • ビジネスロジックを実装するレイヤー • テストコード記述対象
  23. 23. Modelの役割 • ビジネスロジック • 我々のアプリだと、単純にAPIを叩いてcallback実 行、というケースが多い • API追加読み込み制御 • UserDefaults, DBへのアクセス
  24. 24. 実装例
  25. 25. エリア選択画面
  26. 26. ViewController Presenterを保持 メソッドはライフサイクル系に留め、 それ以外のメソッドは極力VCには書かない (UINavigation絡みはVCに書く) 計算等の処理自体はPresenterに任せる
  27. 27. Presenter Modelを保持(複数APIを呼ぶ際は複数可) ModelにAPI叩かせる 表示に関連するenumはPresenterで保持 row数やsection数など、表示に 関連するロジックはPresenter持ち
  28. 28. Model API通信を行う API側でビジネスロジックを持っていない部分については、Model にビジネスロジックを記述
  29. 29. 今日話すこと • ホットペッパービューティーアプリリプレイ スの背景と説明 • リプレイスで採用したMVCPの実装方法の説 明 • MVCPを導入してみた結果(良さ)について
  30. 30. 何故MVCP? • 設計自体の学習コストと得られるメリットの トレードオフ • 検証用アプリを小さく作る中で、少ない学習コ ストで恩恵が受けられそうな見込みがあった
  31. 31. 入れてみて • 導入のハードルが低い! • 新規参画者も理解しやすい • ViewControllerの見通しが良くなる • UnitTest可能範囲が明確 なところ
  32. 32. 入れてみて • 導入のハードルが低い! • 新規参画者も理解しやすい • ViewControllerの見通しが良くなる • UnitTest可能範囲が明確 なところ 想定どおり!!
  33. 33. 入れてみて • MVCと比べると登場人物が増えてしまう… • が、「書くのしんどい!」というレベルでは無 い • 我々のアプリだとModelの役割が少し軽す ぎてただのパイプになっている感あり なところ
  34. 34. 入れてみて • MVCと比べると登場人物が増えてしまう… • が、「書くのしんどい!」というレベルでは無 い • 我々のアプリだとModelの役割が少し軽す ぎて少しもったいない感あり なところ 正直デメリットは そこまで感じなかった
  35. 35. 入れてみての実績 Before (.mファイルのみ) After (実装7割程度) LOC 182612 70722 実装 ファイル数 847 648
  36. 36. まだまだ課題はあるものの、 見通しはかなり良くなってます
  37. 37. 入れてみての実績 • テストコードは絶賛実装中!!
  38. 38. まとめ
  39. 39. MVCPはバランスが取れてて良い • 1x万行レベルのアプリでも、恩恵は十分に得られる • 疎にしてテスト範囲の明確化 • VCの見通しをクリアに • 学習コストが低く、とりあえずで試しやすい • Modelが複雑化してきたらClean ArchitectureやVIPERに比 較的移行しやすい
  40. 40. iOSアプリの設計に 悩んでいる皆さま
  41. 41. まずはライトに、MVCPから 始めてみては?
  42. 42. ~ fin ~

×