kotlin-coroutines-expert について
Kotlinで非同期処理やリアクティブストリームを実装する開発者向けのコルーチンガイドです。構造化並行性、例外処理、Flow、テストに加え、キャンセルや例外の調査方法を扱います。
主な機能
- 01構造化並行性のガイド
- 02Flow変換とストリームのパターン
- 03コルーチンの例外処理
- 04TestScopeとrunTestによるテスト
活用シーン
- 01Kotlinの非同期処理の実装
- 02Flowによるリアクティブストリームの設計
- 03キャンセルや例外の調査
- 04サスペンド関数とFlowのテスト
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill kotlin-coroutines-expertインストール後、Claude Code で/kotlin-coroutines-expertを入力して読み込まれたか確認します。
詳細
Kotlin コルーチンのエキスパート
概要
Kotlin コルーチンを使った非同期プログラミングを習得するためのガイドです。構造化並行性、Flow の変換、例外処理、テスト戦略などの高度なトピックを扱います。
このスキルを使う場面
- Kotlin で非同期処理を実装するときに使用します。
Flowを使ってリアクティブなデータストリームを設計するときに使用します。- コルーチンのキャンセルや例外をデバッグするときに使用します。
- サスペンド関数や
Flowの単体テストを書くときに使用します。
ステップごとのガイド
1. 構造化並行性
コルーチンは必ず、定義された CoroutineScope 内で起動してください。並行タスクをまとめるには、coroutineScope または supervisorScope を使用します。
suspend fun loadDashboardData(): DashboardData = coroutineScope {
val userDeferred = async { userRepo.getUser() }
val settingsDeferred = async { settingsRepo.getSettings() }
DashboardData(
user = userDeferred.await(),
settings = settingsDeferred.await()
)
}
2. 例外処理
トップレベルのスコープには CoroutineExceptionHandler を使用します。ただし、細かく制御するには、サスペンド関数内で try-catch を使用します。
val handler = CoroutineExceptionHandler { _, exception ->
println("Caught $exception")
}
viewModelScope.launch(handler) {
try {
riskyOperation()
} catch (e: IOException) {
// Handle network error specifically
}
}
3. Flow を使ったリアクティブストリーム
保持が必要な状態には StateFlow を、イベントには SharedFlow を使用します。
// Cold Flow (Lazy)
val searchResults: Flow<List<Item>> = searchQuery
.debounce(300)
.flatMapLatest { query -> searchRepo.search(query) }
.flowOn(Dispatchers.IO)
// Hot Flow (State)
val uiState: StateFlow<UiState> = _uiState.asStateFlow()
例
例 1:エラー処理を伴う並列実行
suspend fun fetchDataWithErrorHandling() = supervisorScope {
val task1 = async {
try { api.fetchA() } catch (e: CancellationException) { throw e } catch (e: IOException) { null }
}
val task2 = async { api.fetchB() }
// A child failure does not directly cancel its siblings.
// But an uncaught exception from await escapes the supervisor block and cancels it.
val result1 = task1.await()
val result2 = task2.await() // May throw
}
ベストプラクティス
- ✅ 推奨: ブロッキング I/O 処理には
Dispatchers.IOを使用します。 - ✅ 推奨: 不要になったスコープはキャンセルします(例:
ViewModel.onCleared)。 - ✅ 推奨: コルーチンの単体テストには
TestScopeとrunTestを使用します。 - ❌ 非推奨:
GlobalScopeは使用しないでください。構造化並行性が損なわれ、リークにつながる可能性があります。 - ❌ 非推奨: 再スローしない限り、
CancellationExceptionはキャッチしないでください。
トラブルシューティング
問題: コルーチンのテストがハングしたり、予測できない形で失敗したりします。
解決策: runTest を使用し、クラスに TestDispatcher を注入して仮想時間を制御できるようにしてください。
制限事項
- このスキルは、タスクが上記の説明に明確に合致する場合にのみ使用してください。
- 出力を、環境固有の検証、テスト、または専門家によるレビューの代わりとして扱わないでください。
- 必要な入力、権限、安全上の境界、または成功基準が不足している場合は、作業を中断して確認してください。
例は断片です。インポート、リポジトリーのインターフェース、Android のライフサイクル依存関係、およびインストール済みのコルーチンのバージョンを補ってください。await した処理の失敗はそれぞれ適切に処理し、キャンセルは再スローしてください。SharedFlow のリプレイ/バッファーの設定によって、コレクターがアクティブでない間の配信方法が決まります。イベントキューとしての配信は保証されません。StateFlow は状態の変化を集約します。正常系だけでなく、キャンセルや、コレクターの処理が遅い場合・コレクターが存在しない場合もテストしてください。公式の例外処理の動作 を参照してください。