iOSアプリ研修課題を通じて学んだiOSアーキテクチャパターンについて振り返ってみた

iOSアプリ開発研修を通して知ることができたiOSアーキテクチャパターンについて調べてみました。
2021.03.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

だんだん暖かい日が続いているこの頃、眠気に襲われつつあるひつじなHaeunです?

モバイルアプリチームに配属されてから約3ヶ月になり、研修を通してアプリ開発スキルも上達できたはず!...と思えるように日々頑張っています。 特にAPIを取得してアプリを作成する課題を進めてみて、MVVMパターンでファイル分けしながら進めていたことが開発にとても役立っていたのでブログとして残しておきたいなと思いました。

単に振り返りの内容なだけで、「MVVM最強!!」とかの主張ではないですので軽く読んでいただけるど幸いです。

アプリチームでの研修

アプリチームに配属されてiOSアプリエンジニアとして働くことになったものの、当初XcodeもSwiftも初心者な私にとってはすぐ案件に入れる状態ではありませんでした。それで、先輩エンジニアさんの下で課題を解決しながらiOSアプリ開発について学ぶこととなりました。

最初は課題を解決することを優先するあまり、とりあえず検索をかけ、viewControllerに書きなぐるようなことをしていました。(実装すること自体に問題はある訳ではないのですが、課題で作るアプリと実際のプロダクトとして出ているアプリとは格が違いますよね。)

そんな訳で、先輩エンジニアさんからMVVMパターンの存在について軽く触れられ、iOSアーキテクチャパターンについて調べるところまで辿り着きました。

iOSアーキテクチャパターンって何?

アーキテクチャパターンとはその名の通り、設計や構造方法を規範化したものです。特に、アプリの開発ではクラスの肥大化でコードが追えなかったり、再利用や機能の追加がしづらいとなると致命的です。なので、この問題を防ぐためにアーキテクチャパータンを選び開発をしていきます。

iOSアーキテクチャパターンにはMVC、MVVM、MVPがよく知られてますが、今回の記事ではMVCとMVVMのみ触れてみようと思います。

MVC (Model View Controller)

MVCは上の画像のようにModel、View、Controllerで構成されています。ちなみに、

  • View : 表示及び、入出力に関すること
  • Model : アプリケーションが実現する機能を表す個々の概念(ビジネスロジックを行う)

と役割が分けられていて、ControllerがViewとModelを参照する形となります。つまり、Controllerが架け橋のような役割をしていて、Viewの入出力をModelが反映し、Modelでの変更点をViewで更新するようにします。

ただし、iOSの場合はViewとControllerの繋がりが強いため、View Controllerでほとんどの動きが行われています。その理由としてはControllerがViewのライフサイクルに関わっていて個々に分離することが難しいからです。

そんな訳でiOSアプリでのMVCは実際だと以下の画像のような形になります。

一番よく知られている基本的な構造ではあるのですが、View Controllerに大体の作業を書いてしまうので、規模が大きくなると後々の開発や運用、テストが困難になる可能性があります。

MVVM (Model View ViewModel)

MVVMはModel、View、ViewModelで構成されます。Controllerがなくなり、ViewがView+Controllerの役割をします。そして、ViewModelがViewとModelを繋ぐ形になります。

ViewとViewModelはバインディングという仕組みで繋がっていて、ViewModelがModelから変更点を受け取り、ViewModel自身の状態を更新します。

この二つの違いとは?

いや、これだけの説明でMVCとMVVMの違いなんてわからんよ!って思いますよね。わかります。

例えとして、店舗情報を持っているAPIから、とある店舗の商品一覧を出すアプリを作成すると仮定しましょう。MVCパターンではAPIをパースするコードとtableViewなどに表示するためのコードをviewController内に書いていきます。ただ、APIのデータをパースして処理するコードは意外と書いてるうちに長くなってしまいます。これだと後々レビューやテストをする際などに不便が生じます。

この問題を防ぐためにViewModelにデータの処理に関するコードを書き、viewController内にはViewに表示するためのコードを書きます。こうすることで、ViewとViewModelに分離され、より快適になります。

最後に

このようにざっと書いていきましたが、結構難しい概念だなと思ったり、書いてる途中に投げ出そうかなとも思いましたけど、無事最後まで書き終えることができてよかったです?

過去から今までを振り返ってみると、学生時代にはアーキテクチャにあまり気にかけず開発をしてましたが、研修を通してこのパターンがコードを読む力や開発スキルを伸ばすことができたと思います。特にアーキテクチャパターンはiOSのみではなく、AndroidやWeb開発でも共通な部分があるので、それぞれのパターンと比較してみても楽しそうです。

来月から本格的に案件にも関わるようになるので、これまでの経験を活かしながら案件も突破できるように頑張ります!

参照

iOS Architecture Patterns

Cocoa Core Competencies