Grokking Simplicity FP CH16 CH17 #8
wintersprouter
started this conversation in
General
Replies: 1 comment
-
圖文好讀版也很精美! |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
本文為簡約的軟體開發思維:用 Functional Programming 重構程式 以 Javascript 為例這本書中的共享資源、協調時間線這兩個章節的筆記:
為什麼 FP 是管理時間線的好方法?
在軟體開發中,時間線(Timelines) 是不可避免的:
當系統還只有一條時間線時,我們只需要追蹤程式的直線流程;但一旦出現多條時間線:
這些都讓程式變得難以推理,進而導致:
Functional Programming(FP)提供了一個關鍵思路:
不是消滅時間線,而是讓它們顯性化、可組合、可推理。
透過:
第16章 多條時間線共享資源
多條時間線共享資源:用 Queue 讓混亂變得可控
在單條時間線中,程式的行為是可預測的。但當多條時間線同時操作同一資源(例如:購物車、Token、動畫狀態)時,就會出現競賽條件(Race Condition)。
什麼是競賽條件?
當系統的輸出取決於多個非同步事件的執行順序時,就可能導致不一致的結果:
購物車正在計算總價的同時,有另一個事件新增商品 → 最終總價錯誤。
Refresh Token 還沒更新完畢,另一個 API 已經開始使用過期 Token → 認證失敗。
核心挑戰:共享狀態在多條時間線中難以控制
FP 的簡約原則
為了降低這種複雜度,書中提出五個方向:
在這篇,我們聚焦在用 Queue 讓多條時間線「單一化」。
用 Queue 控制共享資源
基本版 Queue
Queue 的概念是先進先出:
假設我們要更新購物車的總價:
不管事件觸發多少次,總價的更新會按順序執行,避免競賽條件。
DroppingQueue:丟棄不必要的更新
有些情況下,我們不需要處理所有事件,只需要保留最新的。例如:
實務案例:Refresh Token 問題
在許多應用中,API 請求可能同時觸發 Refresh Token:
結果:
解法:用 Queue 確保 Refresh Token 流程一次只執行一個:
這樣,不論多少請求同時觸發刷新,系統都能按順序處理,避免競賽條件。
Queue vs Debounce vs Throttle
在前端事件控制中:
Queue 側重「正確性」,Debounce/Throttle 側重「效能」。
第17章 協調時間線
為什麼需要協調?
即使控制了共享資源,時間線之間仍可能有依賴:
這時,我們需要協調(Coordination)。
繪製時間線圖:先看清問題
Concurrency Primitives
併發,確保資源分享的安全性
Cut:等所有時間線完成再繼續
問題:必須等多條時間線的結果都回來,才能進行下一步(例如多 API 合併更新)
解法:設一個「同步點」
直觀:多條時間線「在終點對齊」→ 保證下一步只在「全部完成」後執行
JustOnce:副作用只執行一次
問題:多條時間線可能同時觸發同一動作(例如結帳完成通知)
解法:只讓它真正執行一次
直觀:把「重複的副作用」收斂成「唯一一次」
為什麼 console.log("完成") 是 Action?
因為它與外部世界互動(輸出到 console),因為它產生了副作用 side effect,影響外部世界(終端機出現輸出),是不可重複的副作用。
改善多時間線運作的方法
圖文好讀版
Beta Was this translation helpful? Give feedback.
All reactions