衛語句


 

衛語句

標簽: 衛語句c語言重構
 分類:
 

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).衛語句可以把我們的視線從異常處理中解放出來,集中精力到正常處理的代碼中。

例如下列代碼:

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. void func(void)  
  2. {  
  3.     if(IsWorkDay())  
  4.    {  
  5.        printf("Error,is work day");  
  6.    }  
  7.     else  
  8.    {  
  9.        if(IsWorkTime())  
  10.       {  
  11.         printf("Error ,is work time");  
  12.        }  
  13.        else  
  14.       {  
  15.           rest();  
  16.        }  
  17.     }  
  18. }  

使用衛語句替換以后

 

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. void func()  
  2. {   
  3.    if(IsWorkDay())  
  4.    {  
  5.       printf("Error,is work day");  
  6.       return;  
  7.    }  
  8.    if(IsWorkTime())  
  9.   {  
  10.       printf("Error,is work time");  
  11.       return ;  
  12.   }  
  13.   
  14.   rest();  
  15.   
  16. }  
 
 

衛語句取代嵌套條件表達式

標簽: 重構條件表達式衛語句
 分類:

根據《重構》第9章中可知,1.條件表達式通常有兩種表現形式。第一種是所有分支都屬於正常行為;第二種是條件表達式提供的答案只有一種是正常行為,其他都不是常見的情況。所以這兩種表達式有不同用途,對於第一種代碼可以用if-then-else的條件表達式;對於第二種某個條件極其罕見,就應該單獨檢查該條件,這種單獨檢查就被稱為“衛語句”(guard clauses)。書中舉例說明:

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. public double getPayAmount() {  
  2.        if (isDead()) return deadPayAmount();  
  3.        if (isSeparated()) return separatedPayAmount();  
  4.        if (isRetired()) return retiredPayAmount();  
  5.        return normalPayAmount();  
  6.          
  7.    }  
任何人都看的懂以上代碼(只要理解英文單詞即可),因為條件判斷與結果產生一種映射關系,大腦里不用堆砌任何代碼棧,傻瓜式看代碼就行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM