條件抽成變數還是 function,判準是求值時機與規模

書上的 Decompose Conditional 要你把條件抽成 function。我多數時候改用變數——但這不是純粹的偏好,它有成立的前提。

// 書上:抽成 function
if (checkCondition()) { /* ... */ } else { /* ... */ }
 
// 我的做法:抽成變數
const isCondition = a !== 10 && 'b' in object
 
if (isCondition) { /* ... */ } else { /* ... */ }

我選變數的兩個理由

  1. naming 的摩擦。function 要叫 getXxx 還是 isXxx/hasXxx?我的慣例是 is/has 留給 boolean、get 留給取得資料,所以 function 版只能用 check 開頭——這是習慣問題,而習慣問題最難推動。變數版沒有這個爭議:它本來就是 boolean,直接套 boolean 的命名慣例。
  2. 閱讀不用跳。變數就宣告在 if-else 的正上方,看得到;抽成 function 則要跳去定義處確認,增加 code review 的成本。

兩個前提(不成立就不要用變數)

  • 條件求值沒有 side effect,而且便宜。變數版在 if 之前無條件先算,function 版只有走到才算。'b' in object 無所謂,換成 await checkRemote() 就不等價。
  • 宣告之後要緊接著 if-else。中間隔了一段,就得回頭讀這個變數怎麼來的——那就失去建立它的意義了。

什麼時候還是抽 function

條件太長、或太複雜(需要多行前置運算才算得出來)時,變數版會在 if 前面堆一坨東西,反而更難讀——這時抽 function 是對的。

判準:一行寫得完、只用一次、求值便宜又無副作用 → 變數;否則 → function。

書的這招其實還有另一半常被跳過 → Decompose Conditional 要抽的是三段,不只是條件