viper アーキテクチャによる ios アプリの設計
DESCRIPTION
第二回 北海道勉強会「スマホアプリ開発、あしたのための環境と設計のアプローチ」 資料TRANSCRIPT
Copyright © Classmethod, Inc.
VIPER アーキテクチャによる iOS アプリの設計
Classmethod Inc安達勇一
1
Copyright © Classmethod, Inc.
自己紹介
• iPhone アプリ・サービス事業部• iOS 開発歴 2.5 年• 最近は Swift で開発をしています
2
Copyright © Classmethod, Inc.
9月上旬…
3
F.T氏
私
北海道勉強会やるんだけど、なんか話さない?お題は未定ね
そうすね…Swift かなんかで話しましょうか…
F.T氏
Swift勉強会…いいよね…
Copyright © Classmethod, Inc. 4
月日は流れ…
Copyright © Classmethod, Inc.
9月下旬…
5
F.T氏
私
Swift勉強会改め、スマホアプリの設計的な話にしようかと思うんだけど、どう?
設計の話すかwwwwwwwwww
_人人人人人人人人人_> 突然の仕様変更 <‾Y^Y^Y^Y^Y^Y^Y^Y‾
Copyright © Classmethod, Inc.
🔍
6
ios mobile archtecture
Copyright © Classmethod, Inc.
🔍
7
ios mobile archtecture
Copyright © Classmethod, Inc. 8
💡
Copyright © Classmethod, Inc.
VIPERアーキテクチャ
• View Interactor Presenter Entity Routing
9
Copyright © Classmethod, Inc. 10
Copyright © Classmethod, Inc. 11
その前に…
Copyright © Classmethod, Inc.
MVCアーキテクチャ• ModelとViewとControllerにコードを分割• Model: ロジック• View: 表示• Controller: Modelを制御
12
View
Controller
Model
Event
Copyright © Classmethod, Inc.
MVP on iOS Application• Model View Presenter• ViewはModelを直接操作しない• Model : ロジック• Presenter : UIViewController• View : UIView
13
View
Presenter
Model
Copyright © Classmethod, Inc.
Massive ViewController• ModelとViewに置けなかったロジックは
ViewController(Presenter)へ• 扱うViewの量に合わせて コード量が増える
• Mediatorとしては正解だが…
14
Copyright © Classmethod, Inc.
Massive ViewController
15
• ModelとViewに置けなかったロジックはViewController(Presenter)へ
• 扱うViewの量に合わせて コード量が増える
• Mediatorとしては正解だが…
Copyright © Classmethod, Inc.
MVCで考えることの不満点
• Modelに様々な役割があるのにひとまとめにしてしまう
• Massive ViewControllerになりやすい• テスト可能なModelへの移行に役割を与えたい
16
Copyright © Classmethod, Inc.
Before VIPER
17
View
ModelController
Copyright © Classmethod, Inc.
Before VIPER
18
View
Model
Controller(Over 1000lines!!)
Copyright © Classmethod, Inc. 19
VIPER 再び
Copyright © Classmethod, Inc.
VIPERアーキテクチャ
• フレームワークに依存しない• DB, APIに依存しない• UIに依存しない• テストしやすい
20
View Interactor Presenter Entity Routing
Copyright © Classmethod, Inc.
VIPERアーキテクチャ
• コアの静的モデル• 内部ビジネスロジック• 外界とビジネスロジックの仲介
• 外界
21
DB
API
View
OSS
Presenter
Interactor
Entity
DataStore
Routing
Copyright © Classmethod, Inc. 22
View
PresenterRouting
Interactor
EntityDataStore
Copyright © Classmethod, Inc. 23
View
PresenterRouting
Interactor
EntityDataStore
Protocolによって疎結合に、互いに知らない状態にする
Copyright © Classmethod, Inc. 24
依存性を注入
DB,WebAPIを仲介
Businessロジック
UIロジック
UIView, UIViewController
静的データ
Copyright © Classmethod, Inc.
Interactor
• 単一のユースケースを動的なモデルで表現• ビジネスロジック部• UIに全く依存しない• テストしやすい
25
Copyright © Classmethod, Inc.
Entity
• Presenter以降のレイヤに直接渡されない• 静的なモデル• VIPERでは動的でない
26
Copyright © Classmethod, Inc.
Presenter• InteractorからのデータをView向けに送る• Viewからのインプットを受ける• Viewを直接知らない• Viewロジックに対する テストを書ける
27
Copyright © Classmethod, Inc.
View• View, ViewController等• 主体的にPresenterにデータを要求しない• Presenterからの指示 待ち
28
Copyright © Classmethod, Inc.
Routing• UIWindowのインスタンスを保有• WindowにViewController(VC)を注入• VCにPresenterを注入• VCの遷移表示も管理
29
Copyright © Classmethod, Inc.
Before VIPER
30
View
Model
Controller
Copyright © Classmethod, Inc. 31
After VIPERView
PresenterRouting
Interactor
EntityDataStore
Copyright © Classmethod, Inc. 32
View
PresenterRouting
Interactor
EntityDataStore
After VIPER
Copyright © Classmethod, Inc. 33
Copyright © Classmethod, Inc. 34
https://github.com/UsrNameu1/VIPER-SWIFT
http://www.objc.io/issue-13/viper.html
http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html
参考資料objc-io 13
Clean Architecture
Forked Sample Code