LoginSignup
6
7

More than 3 years have passed since last update.

MVVM+Repositoryのアーキテクチャを使っています①

Last updated at Posted at 2020-11-27

もくじ

・MVVM + Repositoryについて
・階層について
・DataClass実装
➡ 次回はRepositoryとViewmodel部分の実装について書きます

MVVM+Repositoryとは

アーキテクチャの1つです。他にも様々なアーキテクチャがあるのだと思いますが、公式ガイドではMVVMの形式が推奨されておりますので、PeerRadioでもMVVMを使用しております。しかし、そこにRepositoryというのがくっついていますね。これはDBを扱う部分で、MVVMから分けて作っているということです(分けるのが必須ではないです)。

MVVM+Repositoryの登場人物とその関係性は以下の画像の通りです。
スクリーンショット 2020-11-27 113309.jpg
ActivityやFragmentからViewModelを呼び出し、ViewModelから非同期処理(Kotlin Coroutine)でasync{}.await()withContextを使ってRepositoryを呼び、RepositoryではDataClassへ行ったり来たりしつつ実際にDB(PeerRadioの場合はFirestore)へアクセスする処理を書きます。DBへアクセスした結果(取得した情報など)はViewModelへ戻り、さらに、RxJavaのRxRelayのaccept()subscribe()を組み合わせてActivityやFragmentでデータを受け取ります。RxJavaを利用しなくても、LiveDataのobserve()でもActivity/Fragmentでデータを受け取れます。

この記事の次回以降では、図の②の「async/ awaitで非同期処理を扱う方法」と「withContextで非同期処理を扱う方法」の両方をかきます。また、図の⑥でも同様に「RxRelayでデータを受け取る方法」と「LiveDataでデータを受け取る方法」の両方を説明します。

階層

実際PeerRadioではMVVM+Repositoryがどのような階層で配置されているのかが、以下の画像で分かると思います。*今実装してるAdapterにエラーが出ていますが気にしないで行きましょう
スクリーンショット 2020-11-27 120802.jpg
もっと簡単に階層の概要をかくとこんなかんじです。
スクリーンショット 2020-11-27 112243.jpg
つまり、①modelというパッケージを作成し、そこにDataClassというファイルを格納。②repositoryというパッケージにRepositroryクラスを格納。③それ以外の普通にActivityとかFragmentとかが入っているとこにViewModelクラスも一緒に格納。こんなイメージです。

DataClass実装

Post.kt
data class Post(
    val postUrl: String? = null,
    val postTitle: String? = null,
    val postDuration: String? = null,
    val createdAt: String? = null
)

DBにどんなカラムを作りたいかをかくイメージです。PeerRadioの場合はFirestoreを利用しているので、Firestoreにどんなフィールドを作りたいかをイメージしてここにかいております。
実際にFirestoreではこんな感じで作られてます。
スクリーンショット 2020-11-27 133532.jpg

さいごに

この記事はだいぶ長くなってしまうので、今回はDataClassまでにします。次回はRepositoryとViewModelの実装について詳しく書いていきます。よろしくおねがいします!

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7