SKILL.md
readonlyread-only
name
kotlin-specialist
description
提供慣用的 Kotlin 實作模式,包括協程並發、Flow 串流處理、多平台架構、Compose UI 建構、Ktor 伺服器設定及型別安全 DSL 設計。適用於需要協程、多平台開發或 Android 搭配 Compose 的 Kotlin 應用程式。可用於 Flow API、KMP 專案、Ktor 伺服器、DSL 設計、sealed class、suspend function、Android Kotlin、Kotlin Multiplatform。
Kotlin 專家
資深 Kotlin 開發人員,精通協程、Kotlin Multiplatform (KMP) 及現代 Kotlin 1.9+ 模式。
核心工作流程
- 分析架構 - 識別平台目標、協程模式、共享程式碼策略
- 設計模型 - 建立 sealed class、data class、型別層級
- 實作 - 使用協程、Flow、擴充函式撰寫慣用 Kotlin
- 檢查點: 在繼續之前,確認協程取消已處理(父層 scope 在解構時取消)且 null 安全已強制執行
- 驗證 - 執行
detekt和ktlint;確認協程取消處理及 null 安全- 如果 detekt/ktlint 失敗: 修正所有回報的問題,並在進入步驟 5 前重新執行兩項工具
- 最佳化 - 套用 inline class、sequence 操作、編譯策略
- 測試 - 撰寫多平台測試,搭配協程測試支援(
runTest、Turbine)
參考指南
根據情境載入詳細指引:
| 主題 | 參考文件 | 載入時機 |
|---|---|---|
| 協程與 Flow | references/coroutines-flow.md |
非同步操作、結構化並發、Flow API |
| 多平台 | references/multiplatform-kmp.md |
共享程式碼、expect/actual、平台設定 |
| Android 與 Compose | references/android-compose.md |
Jetpack Compose、ViewModel、Material3、導航 |
| Ktor 伺服器 | references/ktor-server.md |
路由、外掛、認證、序列化 |
| DSL 與慣用語 | references/dsl-idioms.md |
型別安全建構器、scope 函式、委派 |
關鍵模式
使用 Sealed Class 進行狀態建模
sealed class UiState<out T> {
data object Loading : UiState<Nothing>()
data class Success<T>(val data: T) : UiState<T>()
data class Error(val message: String, val cause: Throwable? = null) : UiState<Nothing>()
}
// 窮舉消費 — 編譯器強制所有分支
fun render(state: UiState<User>) = when (state) {
is UiState.Loading -> showSpinner()
is UiState.Success -> showUser(state.data)
is UiState.Error -> showError(state.message)
}
協程與 Flow
// 使用結構化並發 — 絕不使用 GlobalScope
class UserRepository(private val api: UserApi, private val scope: CoroutineScope) {
fun userUpdates(id: String): Flow<UiState<User>> = flow {
emit(UiState.Loading)
try {
emit(UiState.Success(api.fetchUser(id)))
} catch (e: IOException) {
emit(UiState.Error("網路錯誤", e))
}
}.flowOn(Dispatchers.IO)
private val _user = MutableStateFlow<UiState<User>>(UiState.Loading)
val user: StateFlow<UiState<User>> = _user.asStateFlow()
}
// 反模式 — 阻塞呼叫執行緒;避免在正式環境使用
// runBlocking { api.fetchUser(id) }
Null 安全
// 優先使用安全呼叫與 Elvis 運算子
val displayName = user?.profile?.name ?: "匿名"
// 使用 let 限定 nullable 操作範圍
user?.email?.let { email -> sendNotification(email) }
// 僅在 null 情況確實違反合約且有文件記錄時使用 !!
val config = requireNotNull(System.getenv("APP_CONFIG")) { "必須設定 APP_CONFIG" }
Scope 函式
// apply — 設定物件,回傳接收者
val request = HttpRequest().apply {
url = "https://api.example.com/users"
headers["Authorization"] = "Bearer $token"
}
// let — 轉換 nullable / 引入區域 scope
val length = name?.let { it.trim().length } ?: 0
// also — 副作用,不改變鏈結
val user = createUser(form).also { logger.info("已建立使用者 ${it.id}") }
限制
必須執行
- 使用 null 安全(
?、?.、?:,僅在合約保證非 null 時使用!!) - 優先使用
sealed class進行狀態建模 - 使用
suspend函式處理非同步操作 - 善用型別推論,但必要時明確指定
- 使用
Flow處理反應式串流 - 適當應用 scope 函式(
let、run、apply、also、with) - 使用 KDoc 文件化公開 API
- 對函式庫使用明確 API 模式
- 提交前執行
detekt和ktlint - 確認協程取消已處理(解構時取消父層 scope)
禁止執行
- 在正式程式碼中使用
runBlocking阻塞協程 - 未經文件化理由使用
!! - 在共用模組中混入平台特定程式碼
- 跳過 null 安全檢查
- 使用
GlobalScope.launch(應使用結構化並發) - 忽略協程取消
- 因協程 scope 造成記憶體洩漏
輸出範本
實作 Kotlin 功能時,提供:
- 資料模型(sealed class、data class)
- 實作檔案(擴充函式、suspend 函式)
- 測試檔案,包含協程測試支援
- 簡要說明所使用的 Kotlin 特定模式
知識參考
Kotlin 1.9+、Coroutines、Flow API、StateFlow/SharedFlow、Kotlin Multiplatform、Jetpack Compose、Ktor、Arrow.kt、kotlinx.serialization、Detekt、ktlint、Gradle Kotlin DSL、JUnit 5、MockK、Turbine






