
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
1.使用衛語句取代嵌套表達式
函數中的條件邏輯使人難以看清正常的執行途徑。使用衛語句表現所有特殊情況。
動機:條件表達式通常有2種表現形式。第一:所有分支都屬於正常行為。第二:條件表達式提供的答案中只有一種是正常行為,其他都是不常見的情況。
這2類條件表達式有不同的用途。如果2條分支都是正常行為,就應該使用形如if…..else…..的條件表達式;如果某個條件極其罕見,就應該單獨檢查該條件,並在該條件為真時立刻從函數中返回。這樣的單獨檢查常常被稱為“衛語句”。
Replace Nested Conditional with Guard Clauses (以衛語句取代嵌套條件表達式)的精髓是:給某個分支以特別的重視。它告訴閱讀者:這種情況很罕見,如果它真的發生了,請做一些必要的整理工作,然后退出。
“每個函數只能有一個入口和一個出口”的觀念,根深蒂固於某些程序員的腦海里。現今的編程語言都會強制保證每個函數只有一個入口,至於“單一出口”規則,其實不是那么有用。保持代碼清晰才是最關鍵的:如果單一出口能使這個函數更清晰易讀,那么就使用單一出口;否則就不必這么做。
做法:1、對於每個檢查,放進一個衛語句。衛語句要不就從函數返回,要不就拋出一個異常。
2、每次將條件檢查替換成衛語句后,編譯並測試。如果所有衛語句都導致相同的結果,請使用 Consolidate Conditional Expression (合並條件表達式)。
2.衛語句就是把復雜的條件表達式拆分成多個條件表達式,比如一個很復雜的表達式,嵌套了好幾層的if - then-else語句,轉換為多個if語句,實現它的邏輯,這多條的if語句就是衛語句.
3有時候條件式可能出現在嵌套n次才能真正執行,其他分支只是簡單報錯返回的情況,對於這種情況,應該單獨檢查報錯返回的分支,當條件為真時立即返回,這樣的單獨檢查就是衛語句(guard clauses).衛語句可以把我們的視線從異常處理中解放出來,集中精力到正常處理的代碼中。
例如下列代碼:
- void func(void)
- {
- if(IsWorkDay())
- {
- printf("Error,is work day");
- }
- else
- {
- if(IsWorkTime())
- {
- printf("Error ,is work time");
- }
- else
- {
- rest();
- }
- }
- }
使用衛語句替換以后
- void func()
- {
- if(IsWorkDay())
- {
- printf("Error,is work day");
- return;
- }
- if(IsWorkTime())
- {
- printf("Error,is work time");
- return ;
- }
- rest();
- }

版權聲明:本文為博主原創文章,未經博主允許不得轉載。
根據《重構》第9章中可知,1.條件表達式通常有兩種表現形式。第一種是所有分支都屬於正常行為;第二種是條件表達式提供的答案只有一種是正常行為,其他都不是常見的情況。所以這兩種表達式有不同用途,對於第一種代碼可以用if-then-else的條件表達式;對於第二種某個條件極其罕見,就應該單獨檢查該條件,這種單獨檢查就被稱為“衛語句”(guard clauses)。書中舉例說明:
- public double getPayAmount() {
- if (isDead()) return deadPayAmount();
- if (isSeparated()) return separatedPayAmount();
- if (isRetired()) return retiredPayAmount();
- return normalPayAmount();
- }