Decompose Conditional 要抽的是三段,不只是條件

這招常被記成「把條件抽成 function」,但書要抽的是三段:條件、then 區塊、else 區塊。只抽條件等於只做了一半。

// before
if (!aDate.isBefore(plan.summerStart) && !aDate.isAfter(plan.summerEnd)) {
  charge = quantity * plan.summerRate
} else {
  charge = quantity * plan.regularRate + plan.regularServiceCharge
}
 
// after
if (isSummer()) {
  charge = summerCharge()
} else {
  charge = regularCharge()
}

目的不是消滅條件,是讓整段 if-else 讀起來像三句話:「如果是夏天,用夏季費率,否則用一般費率」。細節各自退到有名字的 function 後面。

所以判斷「要不要用這招」時,問的不該只是「這個條件好不好讀」,而是這三段裡有幾段需要讀者停下來解讀。

條件那一段要抽成 function 還是變數,另有取捨 → 條件抽成變數還是 function,判準是求值時機與規模