LoginSignup
23
20

More than 3 years have passed since last update.

iOSアプリの設計手法について

Last updated at Posted at 2019-06-09

背景

いままでiOSアプリを開発する時、MVCフレームワークを利用しているケースが多かったと思います!!
(実際私も現場でMVCの開発が多かった・・・💦)

MVCですと、Controllerのビジネスロジックが肥大化し、かなり見づらくなり、管理もしずらくなります!!

そんな中、iOSの開発現場で生まれたのが、VIPERです❗️

VIPERとは?

VIPERは、各レイヤーの頭文字の組み合わせで VIPER と呼びます。

  • View
  • Interactor
  • Presenter
  • Entity
  • Router

各レイヤーの関係

公式の図(よく分からなかった・・・💦)

alt

公式 iOS Project Architecture: Using VIPER から引用しました。

自分が読み取って関係図を作成✨

VIPER.png

たぶん、こんな感じ・・・💦
間違ってたら指摘ください。すぐに直します❗️

各レイヤーについて

「View」

基本的には、画面のUI表示、UIのイベント受信を行う。
また、ビジネスロジックは、Presenterへ処理を投げる。

「Presenter」

DB等のデータの更新、画面表示の更新、画面遷移の処理を各レイヤーへ投げる。

「Router」

画面遷移を行う。
画面間のデータの受け渡しにも利用できる

「Interactor」

ユースケースごとにデータのCRUDをする
また、システムのビジネスロジックや動的な処理を担う
Backgroundな通信周りなども含む

「Entity」

データの定義を行う
GETTER / SETTER

命名

役割 プロトコル名 実体名
View {ModuleName}View {ModuleName}ViewController
Interactor {ModuleName}Usecase {ModuleName}Interactor
{ModuleName}InteractorDelegate
Presenter {ModuleName}ViewPresentation {ModuleName}ViewPresenter
Entity - ※1 {~~}Entity ※2
Router {ModuleName}Wireframe {ModuleName}Router

引用そのままパクってきましたw

※1:Entityはテストの際に差し替える必要がないほどシンプルな構造なのでプロトコル不要
※2:1つのモジュールで複数のEntityを扱うこともあるため

まとめ

画面周りとDBを完全に切り分けることで、それぞれに機能としての役割を持たせることができ、簡潔に設計できることが分かりました。
また、Interactorに限っては、スタンドアローンな設計であるので、ブラックボックスなテストがしやすいです。

テストコード(XCTest)については、以下の記事をご覧ください❗️

:arrow_forward: やさしいSwift単体テスト~テスト可能なクラス設計・前編~
:arrow_forward: XCTest入門 (Swift) ~UITest編~

引用

詳細な内容については、以下の記事をご覧ください❗️

:arrow_forward: iOS Project Architecture : Using VIPER [和訳]
:arrow_forward: VIPERアーキテクチャ まとめ
:arrow_forward: VIPERアーキテクチャでプロダクトのiOSアプリを1から作ったまとめ

23
20
11

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
20