[Android] UseCaseの実装
目次
昨年(2021年)末にAndroid Developersに掲載されているアプリアーキテクチャガイドが更新されていましたね。更新版の内容で参考になったことの一つが、UseCaseの実装についてでした。Domain layerに関する以下のページです。
ドメインとは何か、UseCaseとは何か、ということについては上記のリンクに譲ることにして、ここではその実装方法を見ていきたいと思います。
リンク先では、以下のようにUseCaseの invoke
を実装することで、UseCaseがただ一つの機能のみを持っていることを強制できるようにしています。以下のサンプルコードは上記のリンク先のものです。
operator fun invoke(date: Date): String {
return formatter.format(date)
}
例えばコーディング規約などでUseCaseは invoke
のみを実装していることを定めれば、一つのUseCaseがただ一つの機能のみを提供していることが保証できるようになるかと思います1。 invoke
の引数と返り値は自由に定義できるので、実装上も不便はなさそうです。
UseCaseの命名は、アプリアーキテクチャガイドにあるように、「動詞+名詞+UseCase」というように命名します。例えば、LogOutUserUseCaseというような命名です。このように命名した場合は、インスタンスに対して logOutUserUseCase()
というように書けば invoke
に実装した処理を実行できます。この命名規則に従うことにより、このUseCaseが「ユーザーのログアウトを行う」という処理を実行していることがわかりやすくなると思います。
また、 invoke
を実装する場合も、UseCaseのinterfaceを切ったり、 suspend
を付けることもできます。例えばUseCaseの invoke
でFlowを返す、という時にはこんな感じで実装できます。 @Inject
はDaggerのアノテーションです。
interface LogOutUserUseCase {
operator fun invoke(): Flow<LogOutState>
}
class LogOutUserUseCaseImpl @Inject constructor() : LogOutUserUseCase {
override operator fun invoke(): Flow<LogOutState> =
flow {
// do something here
}
}
invoke
をsuspend funにする時はこんな感じで書けます。
suspend operator fun invoke(): AwesomeType
override suspend operator fun invoke(): AwesomeType {
// do something here
}
UseCaseを実行する時は、UseCaseのインスタンスに ()
を付けて invoke
を呼び出せば良いです。
viewModelScope.launch {
logOutUserUseCase()
.map(/* do something here */)
.onEach(/* do something here */)
.launchIn(this)
}
}
UseCaseをいい感じに実装できて捗りそうです。
Reference
- Domain layer | Android Developers(最終アクセス日:2022年1月5日)
- Operator overloading | Kotlin(最終アクセス日:2022年1月5日)
-
一つのUseCaseに複数の機能が生えてくることが稀によくある。 ↩︎
書いている人 😎

茨城県つくば市在住のモバイルアプリケーションアーキテクト(Androidが得意です)。モバイルアプリのアーキテクチャ、自動テスト、CI/CDに興味があります。いわゆる「レガシーコード」のリファクタリング・リアーキテクチャが好きです。
👉 もっと詳しく
著書 ✍
ソフトウェアデザイン 2023年6月号📚
特集「クリーンアーキテクチャとは何か?」の第5章「モバイルアプリ開発における実践」を執筆しました。
Android クリーンアーキテクチャ ヒッチハイク・ガイド🧳
Androidアプリでのクリーンアーキテクチャに入門するためのガイダンスです。クリーンアーキテクチャの概念を理解し、Androidアプリに適用する方法を解説しています。
Android ユニットテスト ヒッチハイク・ガイド🧳
Androidアプリのユニットテストに入門するためのガイダンスです。初学者が混乱せずにAndroidアプリのユニットテストを書き始めることができる、ということを目的としています。
Android MVVMアーキテクチャ入門🛠
Androidアプリ開発の初学者に向けた、MVVM(Model-View-ViewModel)アーキテクチャの入門書を書きました。初学者の方を確実にネクストレベルに引き上げる技術書です。NextPublishingより出版されています。
関連記事 👀
- ソフトウェアデザイン 2023年6月号にAndroidアプリ開発におけるクリーンアーキテクチャについて執筆しました
- Androidアプリ開発におけるセマンティック・バージョニング
- DroidKaigi.collect{ #1@Tokyo }で「例外を投げるな、値を返せ」というLTをしました
- Truthのカスタムサブジェクトを定義する
- [Android] build.gradle.ktsでJaCoCoを動かす