BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Redditはいかにして自らのiOSアプリのパフォーマンス、モジュール性、テスト性を改善したか

Redditはいかにして自らのiOSアプリのパフォーマンス、モジュール性、テスト性を改善したか

ブックマーク

原文(投稿日:2018/09/19)へのリンク

Redditは昨年、独自iOSアプリのパフォーマンスの改善とともに、より速いイテレーションサイクルへの対応、テストカバレッジの向上、拡張性の改善に尽力していた。このすべてを実現したのが、アプリをMVCアーキテクチャからモデル–ビュー–プレゼンタ(MVP)アーキテクチャに移行したことだった。

元のMVC設計にあった大きな問題のひとつは、ビューとコントローラが密接に結合していたため、ビューコントローラが肥大化する傾向にあったことだ。これにより、スクロールパフォーマンスが60fpsから45~55fpsに低下するなどの顕著な影響が現れていた、とRedditのエンジニアであるAndrew Rohn氏は記している。ビューとコントローラの結合性のため、ビューの実装を改善するためには、数千行というコントローラのコードをコピーする作業が必要だった。そこでRedditのエンジニアは、アプリの一部を書き換えて、モデル–ビュー–プレゼンタ(MVP)設計に移行することを計画した。

MVPはMVCと大きくは異ならないが、以下の図に示すように、プレゼンテーションとビジネスロジックの分離性が向上している。

このアイデアに従ってRedditのエンジニアは、UIViewControllerからビュー以外のロジックを削除して、ビューとモデルのインタラクションのみを担当するPresenterクラスに移動させた。これによってUIViewControllerは、ユーザ入力処理やビューのセットアップ、バインディング、ビューライフサイクルの管理といった責務に徹することができる。Presenter自体はデータの取得と変換、プレゼンテーションを担当している。MVPで重要なのは、Prensenterがビューオブジェクトに直接ではなく、インターフェースを通じてアクセスすることだ。

MVPへの移行により、コードのモジュール性と再利用性が向上し、ビジネスロジックをビューとは独立してテストできるようになった。MVCと比較した場合のMVPのメリットの中で、特にRohn氏が強調するのは、継承に対するコンポジションの優位性だ。プレゼンタはビューコントローラから独立したコンポーネントなので、再利用や、異なる実装との置き換えがより簡単になる。何よりも重要なのは、MVPによってビューレイヤの実装の書き直しが可能になったため、Textureによるマルチスレッド化に移行することにより、スクロールパフォーマンスの問題が解決できたことだ。Textureを使用する上での大きなハードルは、Rohn氏の説明によれば、プレゼンタがフィードUIをレンダリングする間は状態をロックする必要があるという、状態アクセスの同期に関わる処理である。

MVPは、MVCを超えるための数多くある選択肢のひとつに過ぎない。iOSアプリのアーキテクチャにおけるさまざまな代替アプローチの比較分析に興味があるならば、Chris Eidhof、Matt Gallagher、Florian Kugler各氏の共著である“App Architecture, iOS Application Design Patterns in Swift”を見落とすべきではない。

この記事を評価

採用ステージ
スタイル

この記事に星をつける

おすすめ度
スタイル

BT