Androidアーキテクチャコンポーネント(AAC)は「堅牢でテストとメンテナンスが簡単なアプリの設計を支援する」とドキュメントで説明されています。
有効そうだけど、実態がよくわからないので、いろいろ調べて理解した内容をまとめました。
ソフトウェアアーキテクチャ
アプリケーションは多機能になるほど、プログラムが複雑になります。
複雑になると、次のような問題点が発生します。
- (1)不具合の発生確率が上がる
- (2)テストが難しくなる
- (3)メンテナンスが難しくなる
- (4)拡張性(スケーラビリティ)が低くなる
さらに、複雑さがn倍になると、問題の度合いがnの累乗のように増えます。
問題の度合いが増大してしまう「複雑」は、プログラマにとって大きな課題です。
長年、プログラマや研究者たちは、この「複雑」の解決策を探求してきました。
探求の中から登場してきたのが「ソフトウェア アーキテクチャ パターン」です。抽象化と問題の分割によって、複雑さを整理する試みが行われました。
例えば、UI(User Interface)をもつアプリケーションでは、「UIとデータを分離する」という考えから生まれたMVCやMVVMなどがあります。
パターン | 構成 | ||
---|---|---|---|
MVC | Model | データの管理と処理(ビジネスロジック) | |
View | UIの外観と構造を定義(UIの表示) | (1)データを取り出して表示 | |
Controller | 入力の取得 | (2)入力をModelへ伝達 | |
![]() |
|||
MVVM | Model | データの管理と処理(ビジネスロジック) | |
View-Model | 状態の保持 入力の識別 | (4)データを状態へ変換 (3)入力を処理へ変換 |
|
View | UIの外観と構造を定義(UIの表示) 入力の取得 | (1)状態を取り出して表示 (2)入力をView-Modelへ伝達 |
|
![]() |
|||
・どちらもUI(View、View-Model)とデータ(Model)を分離した形を取ります。 ・Slaveは与えられた指示に従うだけで、Masterが誰かを知りません。 ・Modelは他のブロックに依存しません。ですので、再利用が容易です。 |
※「ソフトウェアアーキテクチャ」という言葉は、意味の範囲が広いので、ここでは「ソフトウェアの構成」という分野に絞った話になっています。
Androidアーキテクチャコンポーネント(AAC)
Androidアーキテクチャコンポーネントは、前述したMVCやMVVMといったパターンを取り入れたプログラミングを支援するコンポーネント(部品)の総称です。
次のようなコンポーネントが紹介されています。
コンポーネント | 概要 | 役割 |
---|---|---|
Lifecycle | 特定のクラスにライフサイクルを持たせる (ライフサイクル対応コンポーネント作成) | UIを分離する |
LiveData | データの更新を通知 (データの更新をきっかけに関数を実行) | UIを分離する |
ViewModel | ライフサイクルを超えたデータの引き継ぎ | UIを分離する |
Room | SQLite テーブルデータを Java オブジェクトに変換 | データの永続性を確保 |
Lifecycleの概要
Lifecycleは特定のクラスにライフサイクルを持たせることができます。このようなクラスを「ライフサイクル対応コンポーネント」と呼びます。
ビジネスロジックをActivityのライフサイクル中に処理を置く必要はありません。代わりにラフサイクル対応コンポーネント中へ置くことができます。
これにより、Activityはアプリの制御を外部へ追い出して、画面の表示制御に専念します。
※詳細は「Lifecycleでライフサイクル対応コンポーネント作成」を参照
LiveDataの概要
LiveDataは、データの更新を通知する監視機が付いた箱です。
Observerはvalueを監視していて、valueが更新されるとobserveによって登録されたonChange関数を実行(関数オブジェクトへ通知)します。
LiveDataが効果的な場面は、UI(User Interface)関連のデータの更新をきっかけにView(TextViewなどのWidget)の表示を更新する時です。
※詳細は「LiveDataでデータの更新を通知」を参照
ViewModelの概要
ViewMoldeはライフサイクルを超えて保持されるオブジェクトを作り、端末を回転させた場合などに発生する構成の変更の前後で、同じオブジェクトのインスタンスが取得できます。
つまり、ライフサイクルを超えたデータの引き継ぎが出来る仕組みです。
このオブジェクト内にUI関連のデータを格納しておけば、構成の変更後のActivityへ引き継ぐことができます。
※詳細は「ViewModelでライフサイクルを超えたデータの引き継ぎ」を参照
関連記事: