Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

背景

いままで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から作ったまとめ

susu_susu__
Android / iOSのアプリ開発者
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away