條件抽成變數還是 function,判準是求值時機與規模
書上的 Decompose Conditional 要你把條件抽成 function。我多數時候改用變數——但這不是純粹的偏好,它有成立的前提。
// 書上:抽成 function
if (checkCondition()) { /* ... */ } else { /* ... */ }
// 我的做法:抽成變數
const isCondition = a !== 10 && 'b' in object
if (isCondition) { /* ... */ } else { /* ... */ }我選變數的兩個理由
- naming 的摩擦。function 要叫
getXxx還是isXxx/hasXxx?我的慣例是is/has留給 boolean、get留給取得資料,所以 function 版只能用check開頭——這是習慣問題,而習慣問題最難推動。變數版沒有這個爭議:它本來就是 boolean,直接套 boolean 的命名慣例。 - 閱讀不用跳。變數就宣告在 if-else 的正上方,看得到;抽成 function 則要跳去定義處確認,增加 code review 的成本。
兩個前提(不成立就不要用變數)
- 條件求值沒有 side effect,而且便宜。變數版在 if 之前無條件先算,function 版只有走到才算。
'b' in object無所謂,換成await checkRemote()就不等價。 - 宣告之後要緊接著 if-else。中間隔了一段,就得回頭讀這個變數怎麼來的——那就失去建立它的意義了。
什麼時候還是抽 function
條件太長、或太複雜(需要多行前置運算才算得出來)時,變數版會在 if 前面堆一坨東西,反而更難讀——這時抽 function 是對的。
判準:一行寫得完、只用一次、求值便宜又無副作用 → 變數;否則 → function。
書的這招其實還有另一半常被跳過 → Decompose Conditional 要抽的是三段,不只是條件