怎麼寫「防呆條件(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
詹姆士的軟體易開罐
33會員
93內容數
這是一系列以軟體開發為主題的輕鬆分享,內容涵蓋了技術選擇、開發經驗、實戰應用等多方面的議題。無論是如何在眾多框架中做出選擇,還是如何應對技術轉移的挑戰,這裡有幽默、有趣的對話風格,將複雜的技術問題轉化為易懂的故事。
2025/01/24
還記得我剛開始負責專案時,幾乎沒有人在意測試,改了程式碼就直接上線,結果小錯不斷、大災難頻傳。那種不知道哪裡會冒出 bug 的焦慮感,讓人每天都忙到焦頭爛額,卻依舊無從掌握系統品質。走過這段混亂的過程後,我才真正體會「為什麼需要測試」,也更明白「測試文化」並非只是技術細節。
Thumbnail
2025/01/24
還記得我剛開始負責專案時,幾乎沒有人在意測試,改了程式碼就直接上線,結果小錯不斷、大災難頻傳。那種不知道哪裡會冒出 bug 的焦慮感,讓人每天都忙到焦頭爛額,卻依舊無從掌握系統品質。走過這段混亂的過程後,我才真正體會「為什麼需要測試」,也更明白「測試文化」並非只是技術細節。
Thumbnail
2025/01/24
我想探討,從「個人測試」到「團隊測試策略」的思維轉換,強調測試不僅是個人的責任,更需要整個團隊的支持與參與。文章還提供了推動測試文化的具體建議,包括設定最小測試門檻、融入開發流程,以及如何克服常見的困境如進度壓力或技術債問題。
Thumbnail
2025/01/24
我想探討,從「個人測試」到「團隊測試策略」的思維轉換,強調測試不僅是個人的責任,更需要整個團隊的支持與參與。文章還提供了推動測試文化的具體建議,包括設定最小測試門檻、融入開發流程,以及如何克服常見的困境如進度壓力或技術債問題。
Thumbnail
2025/01/23
我們在過去的文章中討論了使用 PHPUnit 寫單元測試的基礎,現在要帶你進一步探索 Laravel Test 的魅力。
Thumbnail
2025/01/23
我們在過去的文章中討論了使用 PHPUnit 寫單元測試的基礎,現在要帶你進一步探索 Laravel Test 的魅力。
Thumbnail
看更多
你可能也想看
Thumbnail
債券投資,不只是高資產族群的遊戲 在傳統的投資觀念中,海外債券(Overseas Bonds)常被貼上「高資產族群專屬」的標籤。過去動輒 1 萬甚至 10 萬美元的最低申購門檻,讓許多想尋求穩定配息的小資族望而卻步。 然而,在股市波動劇烈的環境下,尋求穩定的美元現金流與被動收入成為許多投資人
Thumbnail
債券投資,不只是高資產族群的遊戲 在傳統的投資觀念中,海外債券(Overseas Bonds)常被貼上「高資產族群專屬」的標籤。過去動輒 1 萬甚至 10 萬美元的最低申購門檻,讓許多想尋求穩定配息的小資族望而卻步。 然而,在股市波動劇烈的環境下,尋求穩定的美元現金流與被動收入成為許多投資人
Thumbnail
透過川普的近期債券交易揭露,探討債券作為資產配置中「穩定磐石」的重要性。文章分析降息對債券的潛在影響,以及股神巴菲特的操作策略。並介紹玉山證券「小額債」平臺,如何讓小資族也能低門檻參與海外債券市場,實現「低門檻、低波動、固定收益」的務實投資方式。
Thumbnail
透過川普的近期債券交易揭露,探討債券作為資產配置中「穩定磐石」的重要性。文章分析降息對債券的潛在影響,以及股神巴菲特的操作策略。並介紹玉山證券「小額債」平臺,如何讓小資族也能低門檻參與海外債券市場,實現「低門檻、低波動、固定收益」的務實投資方式。
Thumbnail
解析「債券」如何成為資產配置中的穩定錨,提供低風險高回報的投資選項。 藉由玉山證券的低門檻債券服務,投資者可輕鬆入手,平衡風險並穩定財務。
Thumbnail
解析「債券」如何成為資產配置中的穩定錨,提供低風險高回報的投資選項。 藉由玉山證券的低門檻債券服務,投資者可輕鬆入手,平衡風險並穩定財務。
Thumbnail
相較於波動較大的股票,債券能提供固定現金流,而玉山證券推出的小額債,更以1000 美元的低門檻,讓學生與新手也能參與全球優質企業債投資。玉山E-Trader平台即時報價、條件式篩選與清楚的交易流程等特色,大幅降低投資難度,對於希望分散風險、建立穩定現金流的人來說,玉山小額債是一個值得嘗試的理財起點。
Thumbnail
相較於波動較大的股票,債券能提供固定現金流,而玉山證券推出的小額債,更以1000 美元的低門檻,讓學生與新手也能參與全球優質企業債投資。玉山E-Trader平台即時報價、條件式篩選與清楚的交易流程等特色,大幅降低投資難度,對於希望分散風險、建立穩定現金流的人來說,玉山小額債是一個值得嘗試的理財起點。
Thumbnail
這篇內容,將會講解什麼是「if else」,以及與「if else」相關的知識。包括if else的簡介、if、if else、else if、套娃式的if。
Thumbnail
這篇內容,將會講解什麼是「if else」,以及與「if else」相關的知識。包括if else的簡介、if、if else、else if、套娃式的if。
Thumbnail
此章節的目的是介紹Java程式語言中的流程控制結構,包括條件語句(if, else if, else)、三元運算子、switch語句,以及各種迴圈(for, foreach, while)。同時,也解釋了如何在迴圈中使用控制語句來改變程式的執行流程。每種主題都配有示例程式碼以幫助理解。
Thumbnail
此章節的目的是介紹Java程式語言中的流程控制結構,包括條件語句(if, else if, else)、三元運算子、switch語句,以及各種迴圈(for, foreach, while)。同時,也解釋了如何在迴圈中使用控制語句來改變程式的執行流程。每種主題都配有示例程式碼以幫助理解。
Thumbnail
本章節帶領讀者了解 Kotlin 的流程控制語法,包括條件判斷、當做三元運算子使用的 if 表達式、用來替代 switch 語句的 when 語句、用於迴圈運作的 for 和 while 語句,以及控制迴圈執行流程的語句和標籤概念。該章節目的在於讓讀者深入掌握流程控制功能,進一步提升編程技巧。
Thumbnail
本章節帶領讀者了解 Kotlin 的流程控制語法,包括條件判斷、當做三元運算子使用的 if 表達式、用來替代 switch 語句的 when 語句、用於迴圈運作的 for 和 while 語句,以及控制迴圈執行流程的語句和標籤概念。該章節目的在於讓讀者深入掌握流程控制功能,進一步提升編程技巧。
Thumbnail
本章節提供了關於Typescript中流程控制元素的詳細介紹,包括if, else if, else語句,三元運算子,switch語句,各種for迴圈,while迴圈,循環嵌套和控制迴圈語句(break,continue和標籤)的使用。
Thumbnail
本章節提供了關於Typescript中流程控制元素的詳細介紹,包括if, else if, else語句,三元運算子,switch語句,各種for迴圈,while迴圈,循環嵌套和控制迴圈語句(break,continue和標籤)的使用。
Thumbnail
if 條件式
Thumbnail
if 條件式
Thumbnail
當你在開發程式時,難免會遇到各種錯誤和異常情況。這些錯誤可能是因為代碼中的錯誤、外部資源無法訪問或其他不可預期的狀況。為了提高程式的可靠性、穩定性和可維護性,我們使用「例外處理」來處理這些異常情況。
Thumbnail
當你在開發程式時,難免會遇到各種錯誤和異常情況。這些錯誤可能是因為代碼中的錯誤、外部資源無法訪問或其他不可預期的狀況。為了提高程式的可靠性、穩定性和可維護性,我們使用「例外處理」來處理這些異常情況。
Thumbnail
本章節主要介紹了JavaScript中的流程控制,包括條件語句(如if、else if、else和三元運算子)和循環結構(如for迴圈、while迴圈等)。同時,也提供了如何使用break、continue和label來控制迴圈的執行。
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
本文是C#入門教程的一部分,涵蓋了流程控制的各種語句與迴圈。這包括if、else if和else語句,三元運算子,switch語句,以及for、foreach和while迴圈。文中還介紹了如何在迴圈中使用break、continue、return和goto語句。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News