1. 程式人生 > >衛語句,多層迴圈優化

衛語句,多層迴圈優化

if(!CollectionUtils.isEmpty(list)){
            for(Map<String,Object>map :list){
               String endTime =  map.get("endTime").toString();
                if(StringUtils.isNotEmpty(endTime)){
                    if(DateUtils.compareTimeSize(DateUtils.curTime(),endTime)){
                        map.put("applyStatus", SpreaderApplyStatusEnum.OVER.getResult().toString());
                    }else{
                        map.put("applyStatus", SpreaderApplyStatusEnum.PROCESS.getResult().toString());
                    }
                }
            }
        }

多層迴圈優化

多采用短路做法

if(CollectionUtils.isEmpty(list)) {
            return "admin/spreaderConfig/spreaderList";
        }
        for(Map<String,Object>map :list){
           String endTime =  map.get("endTime").toString();
                if(StringUtils.isEmpty(endTime)) {
                    break;
                }
                if(DateUtils.compareTimeSize(DateUtils.curTime(),endTime)){
                    map.put("applyStatus", SpreaderApplyStatusEnum.OVER.getResult().toString());
                }else{
                    map.put("applyStatus", SpreaderApplyStatusEnum.PROCESS.getResult().toString());
                }
        }

【推薦】推薦儘量少用else, if-else的方式可以改寫成:
if(condition){
...
return obj;
}
// 接著寫else的業務邏輯程式碼;
說明:如果非得使用if()...else if()...else...方式表達邏輯,【強制】請勿超過3層,超過請使用狀態設計模式。
正例:邏輯上超過3層的if-else程式碼可以使用衛語句,或者狀態模式來實現。

1.使用衛語句取代巢狀表示式

函式中的條件邏輯使人難以看清正常的執行途徑。使用衛語句表現所有特殊情況。

動機:條件表示式通常有2種表現形式。第一:所有分支都屬於正常行為。第二:條件表示式提供的答案中只有一種是正常行為,其他都是不常見的情況。

這2類條件表示式有不同的用途。如果2條分支都是正常行為,就應該使用形如if…..else…..的條件表示式;如果某個條件極其罕見,就應該單獨檢查該條件,並在該條件為真時立刻從函式中返回。這樣的單獨檢查常常被稱為“衛語句”

       Replace Nested Conditional with Guard Clauses (以衛語句取代巢狀條件表示式)的精髓是:給某個分支以特別的重視。它告訴閱讀者:這種情況很罕見,如果它真的發生了,請做一些必要的整理工作,然後退出。

“每個函式只能有一個入口和一個出口”的觀念,根深蒂固於某些程式設計師的腦海裡。現今的程式語言都會強制保證每個函式只有一個入口,至於“單一出口”規則,其實不是那麼有用。保持程式碼清晰才是最關鍵的:如果單一出口能使這個函式更清晰易讀,那麼就使用單一出口;否則就不必這麼做。

做法:1、對於每個檢查,放進一個衛語句。衛語句要不就從函式返回,要不就丟擲一個異常。

       2、每次將條件檢查替換成衛語句後,編譯並測試。如果所有衛語句都導致相同的結果,請使用 Consolidate Conditional Expression (合併條件表示式)。


衛語句就是把複雜的條件表示式拆分成多個條件表示式,比如一個很複雜的表示式,嵌套了好幾層的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();  
  
}  

參看阿里巴巴JAVA開發手冊