SlideShare una empresa de Scribd logo
1 de 35
Descargar para leer sin conexión
VIPER アーキテクチャ 
による iOS アプリの設計 
Copyright © Classmethod, Inc. 
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
Swift勉強会改め、スマホアプリの設計的な話にしようかと思う 
んだけど、どう? 
Copyright © Classmethod, Inc. 
9月下旬… 
5 
F.T氏 
私 
設計の話すか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
VIPERアーキテクチャ 
• View Interactor Presenter Entity Routing 
Copyright © Classmethod, Inc. 
9
Copyright © Classmethod, Inc. 10
その前に… 
Copyright © Classmethod, Inc. 11
MVCアーキテクチャ 
• ModelとViewとControllerにコードを分割 
• Model: ロジック 
• View: 表示 
• Controller: Modelを制御 
Copyright © Classmethod, Inc. 
12 
Controller 
View 
Model 
Event
MVP on iOS Application 
• Model View Presenter 
• ViewはModelを直接操作しない 
• Model : ロジック 
• Presenter : UIViewController 
• View : UIView 
Copyright © Classmethod, Inc. 
13 
View 
Presenter 
Model
Massive ViewController 
• ModelとViewに置けなかったロジックは 
ViewController(Presenter)へ 
• 扱うViewの量に合わせて         
コード量が増える 
• Mediatorとしては正解だが… 
Copyright © Classmethod, Inc. 
14
Massive ViewController 
• ModelとViewに置けなかったロジックは 
ViewController(Presenter)へ 
• 扱うViewの量に合わせて         
コード量が増える 
• Mediatorとしては正解だが… 
Copyright © Classmethod, Inc. 
15
MVCで考えることの不満点 
• Modelに様々な役割があるのにひとまとめ 
にしてしまう 
• Massive ViewControllerになりやすい 
• テスト可能なModelへの移行に役割を与え 
たい 
Copyright © Classmethod, Inc. 
16
Copyright © Classmethod, Inc. 
Before VIPER 
View 
Controller 
Model 
17
Controller(Over 1000lines!!) 
Copyright © Classmethod, Inc. 
Before VIPER 
View 
Model 
18
VIPER 再び 
Copyright © Classmethod, Inc. 19
VIPERアーキテクチャ 
View Interactor Presenter Entity Routing 
• フレームワークに依存しない 
• DB, APIに依存しない 
• UIに依存しない 
• テストしやすい 
Copyright © Classmethod, Inc. 
20
VIPERアーキテクチャ 
DataStore 
Interactor 
Entity 
Copyright © Classmethod, Inc. 
• コアの静的モデル 
• 内部ビジネスロジック 
• 外界とビジネスロジッ 
クの仲介 
• 外界 
21 
DB 
API 
View 
OSS 
Presenter 
Routing
Copyright © Classmethod, Inc. 22 
View 
Presenter 
Routing 
Interactor 
Entity 
DataStore
Copyright © Classmethod, Inc. 23 
View 
Presenter 
Routing 
Interactor 
Entity 
DataStore 
Protocolによって疎結合に、互いに知らない状態にする
依存性を注入 
DB,WebAPIを 
仲介 
UIView, UIViewController 
Copyright © Classmethod, Inc. 24 
UIロジック 
Businessロジック 
静的データ
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 
View 
Controller 
Model 
30
After VIPER 
Copyright © Classmethod, Inc. 31 
View 
Presenter 
Routing 
Interactor 
Entity 
DataStore
After VIPER 
Copyright © Classmethod, Inc. 32 
View 
Presenter 
Routing 
Interactor 
Entity 
DataStore
Copyright © Classmethod, Inc. 33
参考資料 
objc-io 13 
http://www.objc.io/issue-13/viper.html 
Clean Architecture 
http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean- 
architecture.html 
Forked Sample Code 
https://github.com/UsrNameu1/VIPER-SWIFT 
Copyright © Classmethod, Inc. 34
VIPER アーキテクチャによる iOS アプリの設計

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

TDD のこころ
TDD のこころTDD のこころ
TDD のこころ
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くかDDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
 
リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計
 
PHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作ったPHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作った
 
Reinventing the Transaction Script (NDC London 2020)
Reinventing the Transaction Script (NDC London 2020)Reinventing the Transaction Script (NDC London 2020)
Reinventing the Transaction Script (NDC London 2020)
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
REST API のコツ
REST API のコツREST API のコツ
REST API のコツ
 
ITコミュニティと情報発信に共通する成長と貢献の要素
ITコミュニティと情報発信に共通する成長と貢献の要素ITコミュニティと情報発信に共通する成長と貢献の要素
ITコミュニティと情報発信に共通する成長と貢献の要素
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発
 
ミクシィ 21卒向け Android研修
ミクシィ 21卒向け Android研修ミクシィ 21卒向け Android研修
ミクシィ 21卒向け Android研修
 
SQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォークSQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォーク
 

Similar a VIPER アーキテクチャによる iOS アプリの設計

Angular でもっとAPIファースト・もっとモダンデザインなWebアプリケーションを作ろう!
Angular でもっとAPIファースト・もっとモダンデザインなWebアプリケーションを作ろう!Angular でもっとAPIファースト・もっとモダンデザインなWebアプリケーションを作ろう!
Angular でもっとAPIファースト・もっとモダンデザインなWebアプリケーションを作ろう!
CData Software Japan
 

Similar a VIPER アーキテクチャによる iOS アプリの設計 (20)

技術選択とアーキテクトの役割
技術選択とアーキテクトの役割技術選択とアーキテクトの役割
技術選択とアーキテクトの役割
 
Angular でもっとAPIファースト・もっとモダンデザインなWebアプリケーションを作ろう!
Angular でもっとAPIファースト・もっとモダンデザインなWebアプリケーションを作ろう!Angular でもっとAPIファースト・もっとモダンデザインなWebアプリケーションを作ろう!
Angular でもっとAPIファースト・もっとモダンデザインなWebアプリケーションを作ろう!
 
Adobe XD Plugin「Scenegraph」の操作とDialogの作り方
Adobe XD Plugin「Scenegraph」の操作とDialogの作り方Adobe XD Plugin「Scenegraph」の操作とDialogの作り方
Adobe XD Plugin「Scenegraph」の操作とDialogの作り方
 
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
 
最近のiOS開発の現状と実状
最近のiOS開発の現状と実状 最近のiOS開発の現状と実状
最近のiOS開発の現状と実状
 
20110824 android apps_endo
20110824 android apps_endo20110824 android apps_endo
20110824 android apps_endo
 
ActiveResourceモデルによるAPIの隠蔽の怖い話 ~レスポンスタイムへの致命的影響~ at #shinjukurb
ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurbActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb
ActiveResourceモデルによるAPIの隠蔽の怖い話 ~レスポンスタイムへの致命的影響~ at #shinjukurb
 
20110824 android apps_endo
20110824 android apps_endo20110824 android apps_endo
20110824 android apps_endo
 
Rancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げるRancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げる
 
20180130 設計イベント
20180130 設計イベント20180130 設計イベント
20180130 設計イベント
 
Spring I/O 2015 報告
Spring I/O 2015 報告Spring I/O 2015 報告
Spring I/O 2015 報告
 
決済金融から始めるデータドリブンカンパニー #yjmu
決済金融から始めるデータドリブンカンパニー #yjmu決済金融から始めるデータドリブンカンパニー #yjmu
決済金融から始めるデータドリブンカンパニー #yjmu
 
[GrapeCity Web TECH FORUM 2018]レガシーからの移行 - 株式会社日本プロテック
[GrapeCity Web TECH FORUM 2018]レガシーからの移行 - 株式会社日本プロテック[GrapeCity Web TECH FORUM 2018]レガシーからの移行 - 株式会社日本プロテック
[GrapeCity Web TECH FORUM 2018]レガシーからの移行 - 株式会社日本プロテック
 
スマートフォンアプリケーション開発の最新動向
スマートフォンアプリケーション開発の最新動向スマートフォンアプリケーション開発の最新動向
スマートフォンアプリケーション開発の最新動向
 
Angularreflex20141210
Angularreflex20141210Angularreflex20141210
Angularreflex20141210
 
継続的にテスト可能な設計を考える
継続的にテスト可能な設計を考える継続的にテスト可能な設計を考える
継続的にテスト可能な設計を考える
 
決済金融から始めるデータドリブンカンパニー
決済金融から始めるデータドリブンカンパニー決済金融から始めるデータドリブンカンパニー
決済金融から始めるデータドリブンカンパニー
 
Toolsの杜- 弥生株式会社の自動仕訳エンジンを支えるフロントエンド ~ 「ダサいは、バグだ!」を標榜してUXを徹底的に追求する ~
Toolsの杜- 弥生株式会社の自動仕訳エンジンを支えるフロントエンド ~ 「ダサいは、バグだ!」を標榜してUXを徹底的に追求する ~Toolsの杜- 弥生株式会社の自動仕訳エンジンを支えるフロントエンド ~ 「ダサいは、バグだ!」を標榜してUXを徹底的に追求する ~
Toolsの杜- 弥生株式会社の自動仕訳エンジンを支えるフロントエンド ~ 「ダサいは、バグだ!」を標榜してUXを徹底的に追求する ~
 
Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法
 
Jazug-8th: Azure AKS & FIWARE & Robot
Jazug-8th: Azure AKS & FIWARE & RobotJazug-8th: Azure AKS & FIWARE & Robot
Jazug-8th: Azure AKS & FIWARE & Robot
 

Más de Yuichi Adachi

Más de Yuichi Adachi (12)

Seminar on Quantum Computation & Quantum Information part28
Seminar on Quantum Computation & Quantum Information part28Seminar on Quantum Computation & Quantum Information part28
Seminar on Quantum Computation & Quantum Information part28
 
Swift2.x を Scala からみる
Swift2.x を Scala からみるSwift2.x を Scala からみる
Swift2.x を Scala からみる
 
Swift2 の新機能 Protocol Extension
Swift2 の新機能 Protocol ExtensionSwift2 の新機能 Protocol Extension
Swift2 の新機能 Protocol Extension
 
Seminar on Quantum Computation & Quantum Information part19
Seminar on Quantum Computation & Quantum Information part19Seminar on Quantum Computation & Quantum Information part19
Seminar on Quantum Computation & Quantum Information part19
 
続・ゲンバのSwift
続・ゲンバのSwift続・ゲンバのSwift
続・ゲンバのSwift
 
Seminar on Quantum Computation & Quantum Information part15
Seminar on Quantum Computation & Quantum Information part15Seminar on Quantum Computation & Quantum Information part15
Seminar on Quantum Computation & Quantum Information part15
 
ゲンバのSwift
ゲンバのSwiftゲンバのSwift
ゲンバのSwift
 
Seminar on Quantum Computation & Quantum Information part14
Seminar on Quantum Computation & Quantum Information part14Seminar on Quantum Computation & Quantum Information part14
Seminar on Quantum Computation & Quantum Information part14
 
[iOS8] 新たな線形代数ライブラリ Linear Algebra
[iOS8] 新たな線形代数ライブラリ Linear Algebra[iOS8] 新たな線形代数ライブラリ Linear Algebra
[iOS8] 新たな線形代数ライブラリ Linear Algebra
 
Swiftの新機能 Optional
Swiftの新機能 OptionalSwiftの新機能 Optional
Swiftの新機能 Optional
 
ユニットテスト初学者がKiwiFramework非同期テストで失敗した
ユニットテスト初学者がKiwiFramework非同期テストで失敗したユニットテスト初学者がKiwiFramework非同期テストで失敗した
ユニットテスト初学者がKiwiFramework非同期テストで失敗した
 
Applicative functor
Applicative functorApplicative functor
Applicative functor
 

VIPER アーキテクチャによる iOS アプリの設計