衛語句,多層迴圈優化
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開發手冊