怎麼寫「防呆條件(Guard condition)」比較適合?

更新於 發佈於 閱讀時間約 5 分鐘

之前我們提過 聊聊 if 條件句的那些小陷阱 ,在程式設計中佔比最大的不是if,就是迴圈的使用,這在任何一位coding的開發者,都一定會碰過的問題。

if寫得好,可以大大提高效率與可讀性。

我們今天就來談談 防呆條件(Guard condition)

先來一段範例:

function sendEmail($user) {
if (!$user || !$user->email) {
return; // <-- Guard condition:防呆條件
}

// 實際邏輯
Mail::to($user->email)->send(...);
}

Guard condition 通常在函式或區塊的一開始就出現,作用是:

  1. 檢查參數是否合法
  2. 判斷某些狀態是否符合執行邏輯
  3. 若不符合,就提早 return / throw / continue / break,避免後面程式碼白跑或報錯

適合的Guard Condition 情境


1. 放在函式最前面

「錯誤輸入提早退出函式,正確輸入才繼續。」

  • 把 guard condition 放在函式開頭,提早 return,減少巢狀、提升可讀性。
function process($data) {
if (empty($data)) {
return; // 提早退場
}

// 主邏輯
}

2. 只保護「不合法」或「不必要」的情況

不要用 guard condition 去包「正常流程」

// 👍 合理的 guard
if (!$user) return;
if (!isset($config['enabled'])) return;

// 👎 錯誤示範:過度包裝正常流程
if ($user) {
// main logic
}

3. 一個條件一個 guard,避免複雜邏輯纏繞

分開判斷比複合 if 來得清楚

// 👍 建議
if (!$user) return;
if (!$user->isActive()) return;
if ($user->isBanned()) return;

// 👎 不建議
if (!$user || !$user->isActive() || $user->isBanned()) return;

4. 使用「正向條件」撰寫主邏輯

用 guard 去排除異常,讓主流程乾淨俐落

function save($data) {
if (!$this->isValid($data)) {
throw new InvalidArgumentException("Invalid data.");
}

// 主邏輯只有正常情況
$this->repo->save($data);
}

5. 在錯誤情況下清楚地中斷流程

使用 return / throw / continue / break 作為 guard 的動作

if (!$user) {
return; // 跳過這次處理
}

if ($data->hasError()) {
throw new RuntimeException("Invalid state."); // 停止整體流程
}

6. 善用 early return,減少巢狀 if

guard condition 讓邏輯扁平化

// 👍 使用 guard 清晰結構
function foo($x) {
if (!$x) return;
if ($x < 0) return;

// 主邏輯
}

// 👎 過度巢狀
function foo($x) {
if ($x) {
if ($x >= 0) {
// 主邏輯
}
}
}

Bonus:什麼時候需要 guard condition?

情境適合使用 guard?

傳入參數可能為null、空、無效 ✅ 是

使用者未登入或權限不足 ✅ 是

檢查狀態是否允許繼續進行流程 ✅ 是

執行某操作之前需要特定前置條件 ✅ 是

為了 code style 而硬塞早退邏輯 ❌ 否


為什麼 guard condition 很重要 ?


  1. 能立刻排除不正常情況
    只要觀察特定實例,就能看出函式若事先檢查輸入並及早結束,可以避免後續一連串的問題。這種做法常常帶來顯而易見的好處。
  2. 讓程式更易讀、更好維護
    寫在最前面,清楚地說明「什麼情況不繼續」,能讓主要邏輯呈現得更直觀。如果想確認是不是所有情況都適合,也可多做幾個不同場景的對比測試。
  3. 專注主要功能,減少預期外干擾
    一開始就處理掉異常情境,主邏輯就能假設「輸入已正確」。真實開發中,如果發現情況更多樣,還是得進一步評估是否每個點都要設置。
  4. 方便擴充與撰寫測試
    單元測試時,能很快檢查到「不符預期的輸入」,而且結果一目了然。多個模組互相整合時,也可以更輕鬆地定位錯誤。
  5. 提升團隊協作效率
    當大家都約定俗成地把異常先篩選掉,整段程式就省去不必要的條件判斷。遇到需求變動或問題排查,也能集中注意力在真正該處理的功能上。



簡單來說,先在程式碼開頭用簡單判斷,能直觀地處理邊界案例,並讓後面的邏輯更加明確。要不要全面推行或選擇在哪些函式使用,仍要視實際情況而定,透過更完整的實測與討論,才能更穩健地落地執行。

avatar-img
詹姆士的軟體易開罐
23會員
74內容數
這是一系列以軟體開發為主題的輕鬆分享,內容涵蓋了技術選擇、開發經驗、實戰應用等多方面的議題。無論是如何在眾多框架中做出選擇,還是如何應對技術轉移的挑戰,這裡有幽默、有趣的對話風格,將複雜的技術問題轉化為易懂的故事。
留言
avatar-img
留言分享你的想法!
還記得我剛開始負責專案時,幾乎沒有人在意測試,改了程式碼就直接上線,結果小錯不斷、大災難頻傳。那種不知道哪裡會冒出 bug 的焦慮感,讓人每天都忙到焦頭爛額,卻依舊無從掌握系統品質。走過這段混亂的過程後,我才真正體會「為什麼需要測試」,也更明白「測試文化」並非只是技術細節。
我想探討,從「個人測試」到「團隊測試策略」的思維轉換,強調測試不僅是個人的責任,更需要整個團隊的支持與參與。文章還提供了推動測試文化的具體建議,包括設定最小測試門檻、融入開發流程,以及如何克服常見的困境如進度壓力或技術債問題。
我們在過去的文章中討論了使用 PHPUnit 寫單元測試的基礎,現在要帶你進一步探索 Laravel Test 的魅力。
為什麼要學 PHPUnit? 在上一篇文章裡,我們聊到了「還沒開始單元測試的你一定很忙」,同時也鼓勵大家「一個人就能開始測試」。那麼接下來就要進入更實際的操作層面,帶你走進 PHP 最常見的測試框架 —— PHPUnit。
你是不是也有過這樣的經歷:剛修好的功能,過幾天又壞了;每次修改程式碼都得手動測試一遍,還常漏掉影響到的其他地方;整天忙到翻,但最後卻不知道忙在哪裡? 如果這些情境聽起來很熟悉,那麼你可能需要開始了解 單元測試!很多人覺得測試很難,或者認為時間不夠用,其實只要從幾個簡單的步驟開始,一個人也能輕鬆上手。
在一個人資(HR)系統中,薪資結算與保費扣除是最核心的功能之一,扣員工的錢不能多算,該給政府的的也不能少算…。 不管是接手舊系統,還是開發新系統,只要隨著時間推移,每年勞健保的投保級距與費率都可能調整,
還記得我剛開始負責專案時,幾乎沒有人在意測試,改了程式碼就直接上線,結果小錯不斷、大災難頻傳。那種不知道哪裡會冒出 bug 的焦慮感,讓人每天都忙到焦頭爛額,卻依舊無從掌握系統品質。走過這段混亂的過程後,我才真正體會「為什麼需要測試」,也更明白「測試文化」並非只是技術細節。
我想探討,從「個人測試」到「團隊測試策略」的思維轉換,強調測試不僅是個人的責任,更需要整個團隊的支持與參與。文章還提供了推動測試文化的具體建議,包括設定最小測試門檻、融入開發流程,以及如何克服常見的困境如進度壓力或技術債問題。
我們在過去的文章中討論了使用 PHPUnit 寫單元測試的基礎,現在要帶你進一步探索 Laravel Test 的魅力。
為什麼要學 PHPUnit? 在上一篇文章裡,我們聊到了「還沒開始單元測試的你一定很忙」,同時也鼓勵大家「一個人就能開始測試」。那麼接下來就要進入更實際的操作層面,帶你走進 PHP 最常見的測試框架 —— PHPUnit。
你是不是也有過這樣的經歷:剛修好的功能,過幾天又壞了;每次修改程式碼都得手動測試一遍,還常漏掉影響到的其他地方;整天忙到翻,但最後卻不知道忙在哪裡? 如果這些情境聽起來很熟悉,那麼你可能需要開始了解 單元測試!很多人覺得測試很難,或者認為時間不夠用,其實只要從幾個簡單的步驟開始,一個人也能輕鬆上手。
在一個人資(HR)系統中,薪資結算與保費扣除是最核心的功能之一,扣員工的錢不能多算,該給政府的的也不能少算…。 不管是接手舊系統,還是開發新系統,只要隨著時間推移,每年勞健保的投保級距與費率都可能調整,
你可能也想看
Google News 追蹤
Thumbnail
【vocus 精選投資理財/金融類沙龍,輸入 "moneyback" 年訂閱 9 折】 市場動盪時,加碼永遠值得的投資標的——「自己」 川普政府再度拋出關稅震撼彈,全球市場應聲重挫,從散戶到專業投資人,都急著找尋買進殺出的訊號,就是現在,輪到知識進場!把握時機讓自己升級,別放過反彈的機會!
Thumbnail
這篇內容,將會講解什麼是「if else」,以及與「if else」相關的知識。包括if else的簡介、if、if else、else if、套娃式的if。
Thumbnail
此章節的目的是介紹Java程式語言中的流程控制結構,包括條件語句(if, else if, else)、三元運算子、switch語句,以及各種迴圈(for, foreach, while)。同時,也解釋了如何在迴圈中使用控制語句來改變程式的執行流程。每種主題都配有示例程式碼以幫助理解。
Thumbnail
本章節帶領讀者了解 Kotlin 的流程控制語法,包括條件判斷、當做三元運算子使用的 if 表達式、用來替代 switch 語句的 when 語句、用於迴圈運作的 for 和 while 語句,以及控制迴圈執行流程的語句和標籤概念。該章節目的在於讓讀者深入掌握流程控制功能,進一步提升編程技巧。
Thumbnail
本章節提供了關於Typescript中流程控制元素的詳細介紹,包括if, else if, else語句,三元運算子,switch語句,各種for迴圈,while迴圈,循環嵌套和控制迴圈語句(break,continue和標籤)的使用。
Thumbnail
當你在開發程式時,難免會遇到各種錯誤和異常情況。這些錯誤可能是因為代碼中的錯誤、外部資源無法訪問或其他不可預期的狀況。為了提高程式的可靠性、穩定性和可維護性,我們使用「例外處理」來處理這些異常情況。
Thumbnail
本章節主要介紹了JavaScript中的流程控制,包括條件語句(如if、else if、else和三元運算子)和循環結構(如for迴圈、while迴圈等)。同時,也提供了如何使用break、continue和label來控制迴圈的執行。
Thumbnail
本文是C#入門教程的一部分,涵蓋了流程控制的各種語句與迴圈。這包括if、else if和else語句,三元運算子,switch語句,以及for、foreach和while迴圈。文中還介紹了如何在迴圈中使用break、continue、return和goto語句。
Thumbnail
在程式世界裡,if 條件句是我們的好朋友,幫我們做各種決策。如果不注意可能會讓我們掉進小陷阱。文中透過幾個例子,在使用 if 時可能會遇到的一些常見問題,像是不必要的 if、過於複雜的條件、忘了用嚴格比較,還有嵌套太深的 if。透過這篇文章,你將學到如何避免這些小錯誤,寫出更乾淨、更有效率的程式碼。
Thumbnail
【vocus 精選投資理財/金融類沙龍,輸入 "moneyback" 年訂閱 9 折】 市場動盪時,加碼永遠值得的投資標的——「自己」 川普政府再度拋出關稅震撼彈,全球市場應聲重挫,從散戶到專業投資人,都急著找尋買進殺出的訊號,就是現在,輪到知識進場!把握時機讓自己升級,別放過反彈的機會!
Thumbnail
這篇內容,將會講解什麼是「if else」,以及與「if else」相關的知識。包括if else的簡介、if、if else、else if、套娃式的if。
Thumbnail
此章節的目的是介紹Java程式語言中的流程控制結構,包括條件語句(if, else if, else)、三元運算子、switch語句,以及各種迴圈(for, foreach, while)。同時,也解釋了如何在迴圈中使用控制語句來改變程式的執行流程。每種主題都配有示例程式碼以幫助理解。
Thumbnail
本章節帶領讀者了解 Kotlin 的流程控制語法,包括條件判斷、當做三元運算子使用的 if 表達式、用來替代 switch 語句的 when 語句、用於迴圈運作的 for 和 while 語句,以及控制迴圈執行流程的語句和標籤概念。該章節目的在於讓讀者深入掌握流程控制功能,進一步提升編程技巧。
Thumbnail
本章節提供了關於Typescript中流程控制元素的詳細介紹,包括if, else if, else語句,三元運算子,switch語句,各種for迴圈,while迴圈,循環嵌套和控制迴圈語句(break,continue和標籤)的使用。
Thumbnail
當你在開發程式時,難免會遇到各種錯誤和異常情況。這些錯誤可能是因為代碼中的錯誤、外部資源無法訪問或其他不可預期的狀況。為了提高程式的可靠性、穩定性和可維護性,我們使用「例外處理」來處理這些異常情況。
Thumbnail
本章節主要介紹了JavaScript中的流程控制,包括條件語句(如if、else if、else和三元運算子)和循環結構(如for迴圈、while迴圈等)。同時,也提供了如何使用break、continue和label來控制迴圈的執行。
Thumbnail
本文是C#入門教程的一部分,涵蓋了流程控制的各種語句與迴圈。這包括if、else if和else語句,三元運算子,switch語句,以及for、foreach和while迴圈。文中還介紹了如何在迴圈中使用break、continue、return和goto語句。
Thumbnail
在程式世界裡,if 條件句是我們的好朋友,幫我們做各種決策。如果不注意可能會讓我們掉進小陷阱。文中透過幾個例子,在使用 if 時可能會遇到的一些常見問題,像是不必要的 if、過於複雜的條件、忘了用嚴格比較,還有嵌套太深的 if。透過這篇文章,你將學到如何避免這些小錯誤,寫出更乾淨、更有效率的程式碼。