之前我們提過 聊聊 if 條件句的那些小陷阱 ,在程式設計中佔比最大的不是if,就是迴圈的使用,這在任何一位coding的開發者,都一定會碰過的問題。
if寫得好,可以大大提高效率與可讀性。我們今天就來談談 防呆條件(Guard condition)先來一段範例:
function sendEmail($user) {
if (!$user || !$user->email) {
return; // <-- Guard condition:防呆條件
}
// 實際邏輯
Mail::to($user->email)->send(...);
}
Guard condition 通常在函式或區塊的一開始就出現,作用是:
「錯誤輸入提早退出函式,正確輸入才繼續。」
function process($data) {
if (empty($data)) {
return; // 提早退場
}
// 主邏輯
}
不要用 guard condition 去包「正常流程」
// 👍 合理的 guard
if (!$user) return;
if (!isset($config['enabled'])) return;
// 👎 錯誤示範:過度包裝正常流程
if ($user) {
// main logic
}
分開判斷比複合 if 來得清楚
// 👍 建議
if (!$user) return;
if (!$user->isActive()) return;
if ($user->isBanned()) return;
// 👎 不建議
if (!$user || !$user->isActive() || $user->isBanned()) return;
用 guard 去排除異常,讓主流程乾淨俐落
function save($data) {
if (!$this->isValid($data)) {
throw new InvalidArgumentException("Invalid data.");
}
// 主邏輯只有正常情況
$this->repo->save($data);
}
使用 return / throw / continue / break 作為 guard 的動作
if (!$user) {
return; // 跳過這次處理
}
if ($data->hasError()) {
throw new RuntimeException("Invalid state."); // 停止整體流程
}
guard condition 讓邏輯扁平化
// 👍 使用 guard 清晰結構
function foo($x) {
if (!$x) return;
if ($x < 0) return;
// 主邏輯
}
// 👎 過度巢狀
function foo($x) {
if ($x) {
if ($x >= 0) {
// 主邏輯
}
}
}
情境適合使用 guard?
傳入參數可能為null、空、無效 ✅ 是
使用者未登入或權限不足 ✅ 是
檢查狀態是否允許繼續進行流程 ✅ 是
執行某操作之前需要特定前置條件 ✅ 是
為了 code style 而硬塞早退邏輯 ❌ 否
簡單來說,先在程式碼開頭用簡單判斷,能直觀地處理邊界案例,並讓後面的邏輯更加明確。要不要全面推行或選擇在哪些函式使用,仍要視實際情況而定,透過更完整的實測與討論,才能更穩健地落地執行。