経緯
プロジェクトでAndroidとiOSを同時期に開発することになりました。
同じアプリだから挙動や仕様も合わせた方がいいよねという話をして、
Android、iOS両方で実績のあるパターンでかつ、メンバーの学習コストが少ない
アーキテクチャパターンを調査・検討することになりました。
いくつか候補が上がった中で、
MVPがiOSではデフォルトだし、Androidでもよく使われるパターンの一つなので、
まずはこれで行きたいという話になりました。
(AndroidではMVVMがいいかなぁと思いつつ、AndroidでもMVPでできないことはないので、
比較的わかりやすいMVP(PassiveView)で行くことに決まりました)
参考書
この2冊を参考にそれぞれのOSでどう設計するかを検討しました。
ご存知の方も多いかもしれませんが、この2冊本当に良書です。
iOSの方は特にアーキテクチャ検討の歴史や直近流行しているアーキテクチャに対して
GUIアーキテクチャやシステムアーキテクチャなどアーキテクチャについて
整理もしてくれていてとても参考になります!
AndroidもiOSもソースはgithubで公開されているので、実装はこちらで確認しました。
- https://github.com/android/architecture-samples/
- https://github.com/peaks-cc/iOS_architecture_samplecode
悩んだ点と解決
android と iOS の MVP の違いがしっくり吸収できませんでした...
一旦、表に整理してみると頭が整理されました。
Layer / OS | Android | iOS |
---|---|---|
View | Fragment | ViewController |
Presenter | View / Presenter | Input / Output |
Model | RepositoryPattern | Model |
injection | Activity | AppDelegate |
Android と iOS で MVPの実装は同じなんですが、
違い(実は違わなくても)を整理してみました。
AndroidはModel層をRepositoryパターンで提示している、iOSはModelそのまま。
(画面に対するModelというよりデータに対して提供するイメージなのかな?)AndroidはPresenterを Contract という 一つ上のInterfaceに挟み込んでいる。iOSはInput/Output。
(どちらでもいいけど、iOSの方がとっつきやすい印象。Swiftの言語仕様的にKotlinの形はできないかも)
(iOSも変数名はpresenter/viewになっているので、ここの差異は小さい)
違いではないけど、ちょっと考え方に慣れなかったのが、
AndroidもiOSもViewを作るタイミングでPresenterもModelも生成して、
依存関係を全て解決している。
これは、テストをする上ではやりやすいのかもしれない。
ちなみに、Androidの実装内容についてはこちらの記事にすごく綺麗にまとまってました!
Android Architecture Blueprintsで学んだアプリ実装(MVP)
まとめ
自分の整理としてまとめてみると、頭で整理できなかったところが、
実はそれほど大きな違いではない事を気付きました(記事としては薄い内容に...)
とはいえ、両方のOSがそれぞれの推奨Practiceで進むべきかどうか、
整理してみて改めて検討の予知を知ることができたことは大きかったです。
(特にModel層は揃えないと挙動の違いに直結しそう...)
iOSはRepositoryパターンの記事が少ないので、まずは単純にModelで考えてみます。