1.【決策邊界|規格與驗收】 BLE 廣播式磅秤不需要配對,只要在範圍內,App 就收得到它的讀值。所以現場如果有兩台以上的秤,App 會同時收到好幾台的廣播。舊 App 的做法是:鎖定第一台看到的秤,之後整個任務都只認這台的位址。
新版至少有四種選法:
請寫下:
我的回答:(待補)
2.【預測再驗證|測試與品質】 秤重畫面要在讀值「穩定」後,才讓配送員送出重量。有人提議直接用 debounce 判斷:
@OptIn(FlowPreview::class)
fun Flow<Int>.stableGrams(): Flow<Int> = debounce(1_000)
用一個假的讀值來源測試。磅秤每 100 毫秒廣播一次:先模擬放上貨物,讀值一路爬升;接著有 3 秒讀值不動。
private fun fakeReadings(): Flow<Int> = flow {
for (g in 0..15_000 step 1_000) { emit(g); delay(100) } // 放上貨物,讀值爬升
repeat(30) { emit(15_000); delay(100) } // 之後 3 秒讀值不動
}
@Test
fun `stable weight`() = runTest {
val emitted = mutableListOf<Pair<Long, Int>>() // (虛擬時間, 克數)
val job = launch {
fakeReadings().stableGrams().collect { emitted += currentTime to it }
}
advanceUntilIdle()
job.cancel()
println(emitted)
}
先寫下預測:emitted 裡有幾筆?各是什麼時間點、什麼值?理由是什麼?然後跑測試驗證。
接著依序改下面三處,每改一處都先預測、再驗證:
fakeReadings() 的 flow { ... } 最後加一行 awaitCancellation(),模擬磅秤一直開著。stableGrams() 改成 distinctUntilChanged().debounce(1_000)。15_000 與 15_010 交替出現,模擬秤的雜訊。最後回答:
debounce 不夠用?我的回答:(待補)