舊有的撰寫風格

在寫objc時我們時常看到這樣的寫法:

這邊很自然的使用if-else來區分成功與失敗兩塊block並各自做處理,不過在使用OClint等程式風格分析工具後,它會建議我們改寫成:

第二種寫法早一步偵測出錯誤,並且在第一時間處理error後,return掉該function不再繼續往下執行,看到這樣的建議撰寫風格讓我不經好奇它有什麼特別之處呢?


程式的快樂路徑 Happy Path

在寫一個function時我們會預設在正常情況下,程式照著programmer的安排一路順遂的執行,即所謂的Happy Path

但是現實總有利外狀況,這時我們若是在function中穿插了各種防錯處理,原本的happy path瞬間多了許多分岔路而凶險難行,在發生錯誤時,function可能已經執行了一大半了,這樣的處理方式是低效率的。

所以我們可以在function的最前面先將可能的例外狀況列出,並在第一時間處理並return掉function,若程式能順利通過前段的考驗,後面執行的就會是順暢通行的Happy path。


這似乎有點守衛的感覺

回到這次的主題,Swift提供了一種guard的方式讓我們達到提前攔截例外的目標,寫一個簡單的範例:

這是一般的optional binding的寫法,將例外狀況寫在else之中,接下來看看guard的寫法:

兩段code基本上輸出了一樣的效果,但是在使用guard優先排除例外狀況後,接下來執行的程式碼將走上happy path(condition必定為true),這將會優化compiler的效能,並且能在第一時間抓出錯誤停止多餘的動作。