筆記:一直很討厭把布林值當參數,因為看不出意圖
主要觀點
-
直接把布林值(Boolean)當作函數參數,容易讓人看不出意圖,例如
deliveryDate(order, true),外部無法直觀判斷true代表什麼。 -
把布林值改成字串參數(如
"rush")在參數多時也會降低可讀性。
改善方法
-
將流程判斷的布林參數,直接拆成兩個語意明確的函數,例如:
-
rushDeliveryDate(order) -
regularDeliveryDate(order)
-
-
如果不是用來判斷流程,傳 string、變數、物件等參數則沒問題。
-
可以用物件參數(具名參數)或加上參數名稱提升可讀性,例如:
deliveryDate({ order, isRush: true })
實際程式碼範例
1. 不推薦:直接傳布林值
function deliveryDate(order, isRush) {
if (isRush) {
// 加急處理
return calculateRushDelivery(order);
} else {
// 一般處理
return calculateRegularDelivery(order);
}
}
// 調用時
const date1 = deliveryDate(order, true); // 這裡的 true 不直觀
const date2 = deliveryDate(order, false); // 這裡的 false 也不直觀
2. 改善:拆成兩個函數
function rushDeliveryDate(order) {
return calculateRushDelivery(order);
}
function regularDeliveryDate(order) {
return calculateRegularDelivery(order);
}
// 調用時
const date1 = rushDeliveryDate(order); // 一看就知道是加急
const date2 = regularDeliveryDate(order); // 一看就知道是一般
3. 進階:用物件參數(可讀性更高)
function deliveryDate({ order, isRush }) {
if (isRush) {
return calculateRushDelivery(order);
} else {
return calculateRegularDelivery(order);
}
}
// 調用時
const date1 = deliveryDate({ order, isRush: true });
const date2 = deliveryDate({ order, isRush: false });
其他觀點
-
造成意圖不明的根本原因是「沒有參數名稱」,不只是布林值,任何字面常數(string、int等)都可能有同樣問題。
-
有人認為,註解或 IDE 的 inlay hint 也能幫助理解,但本質還是要讓程式碼本身語意清楚。
-
拆成多個函數雖然意圖明確,但實際應用還是要視情境決定。
小結
-
目標是讓程式碼意圖清楚、易於維護。
-
避免傳遞不具語意的布林或常數參數,能提升團隊協作與程式品質。
個人心得
感覺這件事情並沒有到那麼嚴重,vs code hover 過去也看得到參數命名,那到底要不要拆成兩個,多數情況大多數人的確不會,說實在話這到底會不會有點 over design 呢?