読者です 読者をやめる 読者になる 読者になる

【Android】クラスの設計案

Androidアプリのクラスの設計案です。

f:id:chocolattips:20170223100112j:plain

各クラスの役割

各クラスの役割を簡単にまとめると、

Activity

Toolbar, NavigationDrawer, FloatingActionButtonを持ち、 コンテンツはFragmentに任せます。

Fragment

コンテンツを表示します。

ViewModel

Fragmentのデータが関係する部分を扱います。

UseCase

Presentationで必要なビジネスロジックです。

UseCaseImpl

Presentation/UseCaseの実装になります。 interfaceを通してレイヤー間のやりとりをします。

Repository

Domainで必要なデータの保存/取得です。

RepositoryImpl

Domain/Repositoryの具体的な実装ですが、 具体的な保存/取得処理はStoreに任せます。 Fileなのか、DatabaseなのかなどはRepositoryImpl側では わからなくても問題が無いようにします。 ここでもinterfaceを通してレイヤー間のやりとりをします。

Store

具体的な保存/取得の処理を記述します。

InstanceState, InstanceStateImpl

アプリ終了後も以前の状態から再開するときに使用します。 単にPresentation内の状態を保存しておくだけのため、Domainを経由しません。

DataSourceContext

DataSourceで使用するContextを保持し、Contextが必要ならここから使用します。 このクラスはContext取得にApplicationクラスへのアクセスを許容しないために用意します。

Data

図にデータの記載がありませんが、以下の2種類があります。

  • Entity
  • Model

Entity

Domain - DataSource間のデータになります。

Model

Presentation - Domain間のデータになります。

まとめ

規模に応じてinterfaceを省いたり、一部クラスを省略したりしながら適度に手抜きし、 徐々にきっちりとしたものにリファクタリングしていくと良いのではと思っています。

特にデータに関しては、Annotationを使用したDatabaseの場合、 Entityを記述しても特にやることがなかったりします。 その場合はEntityを省き、ModelをPresentaion - DataSourceまでにすると、 不必要な入れ替え処理がなくなります。

参考