2017-06-20 56 views
0

儘管我的代碼能夠按照我的要求完美工作,但是在我的代碼中有很多if-else語句,所以我想問問是否有可能減少在此代碼if-else語句Java:如何減少無法合併它們的if-else語句的數量

if (nightPost(timePicker1.getValue().toString(), timePicker4.getValue().toString())) { 
    if (!teToTime.isAfter(LocalTime.parse("08:30",format))) { 
     textField4.setStyle(""); 
     if(getDifference(timeKA, timeKB)<121 && getDifference(timeKA, timeKB)>59) { 
      timePicker3.setStyle(""); 
      if (range(timePicker1.getValue().toString(), timePicker2.getValue().toString(), 
       timePicker3.getValue().toString(), timePicker4.getValue().toString())) { 
       timePicker2.setStyle(""); 
       timePicker3.setStyle(""); 
       if(increaseTxt.isBefore(LocalTime.parse("11:01",format))) 
       { 
        textField5.setStyle(""); 
        return true; 
       } else { 
        textField5.setStyle("-fx-border-color: red"); 
        return false; 
       } 
      } else { 
       timePicker2.setStyle("-fx-border-color: orange"); 
       return false; 
      }        
     } 
     else { 
      timePicker3.setStyle("-fx-border-color: red"); 
      return false; 
     } 
    } else { 
     textField4.setStyle("-fx-border-color: red"); 
     return false; 
    } 
} 
return false; 
+2

我想你應該問這對codeReview.stackexchange ... – ItamarG3

+0

我真的不明白你的代碼是幹什麼的,但這裏有一些一般的指針:早期的失敗,也許還可以利用交換機/箱或地圖(例如對於顏色),三元操作符,首先獲取信息,... – domsson

+1

我的建議是不要在整個代碼中混合使用英語和其他語言。這可能是第一步改進。這將有助於理解你的邏輯。 –

回答

3

替換嵌套條件與 Guard Clauses

if (!nightPost(timePicker1.getValue().toString(), timePicker4.getValue().toString())) { 
    return false; 
} 
if (teToTime.isAfter(LocalTime.parse("08:30",format))) { 
    textField4.setStyle("-fx-border-color: red"); 
    return false; 
} 
textField4.setStyle(""); 
if (!(getDifference(timeKA, timeKB) < 121 && getDifference(timeKA, timeKB) > 59)) { 
    timePicker3.setStyle("-fx-border-color: red"); 
    return false; 
} 
timePicker3.setStyle(""); 
if (!range(timePicker1.getValue().toString(), timePicker2.getValue().toString(), 
      timePicker3.getValue().toString(), timePicker4.getValue().toString())) 
{ 
    timePicker2.setStyle("-fx-border-color: orange"); 
    return false; 
} 
timePicker2.setStyle(""); 
timePicker3.setStyle(""); 
if (!increaseTxt.isBefore(LocalTime.parse("11:01",format))) { 
    textField5.setStyle("-fx-border-color: red"); 
    return false; 
} 
textField5.setStyle(""); 
return true; 
+0

感謝您使用「警衛子句」!我從來不知道適當的術語;在我上面的評論中,我把它稱爲「失敗早」。 – domsson

+1

請不要只發布包含說明的鏈接。這些鏈接可能會導致您的答案變爲obsolet。請參閱[答案]關於答案中的鏈接。 – AxelH

-1

我並不完全相信你的代碼做什麼,但之後快速查看(和@matoni已經證明),你實際上可以刪除很多你的'別的因爲你在大多數'真實'的情況下返回。這是否使得它更具可讀性是主觀的。

也@Matoni顯示,你可以反轉很多你的if語句!操作員,這樣可以真正減少嵌套。

編輯:看看我的回答和我現在回家的代碼。道歉@AxelH,似乎我誤解了matoni的答案。這裏有一個更新的答案:

我已經倒過去了,如前所述刪除了Elses,但我也將一些代碼移出到它自己的私有方法中,以獲得更多的可讀性,因爲我假設這就是爲什麼你想要重構。

public bool yourMethod(your params){ 

    if (!nightPost(timePicker1.getValue().toString(), timePicker4.getValue().toString())) return false; 

    if (teToTime.isAfter(LocalTime.parse("08:30",format ||))) return redBorder(); 
    textField4.setStyle(""); 

    if(!(getDifference(timeKA, timeKB)<121 && getDifference(timeKA, timeKB)>59)) return redTimeBorder(); 
    timePicker3.setStyle(""); 

    // assuming range returns a boolean value 
    if (!range(timePicker1.getValue().toString(), timePicker2.getValue().toString(), 
    timePicker3.getValue().toString(), timePicker4.getValue().toString())) return orangeTime2Border(); 

    timePicker2.setStyle(""); 
    timePicker3.setStyle(""); 

    if(!increaseTxt.isBefore(LocalTime.parse("11:01",format))) return redText5Border(); 

    textField5.setStyle(""); 
    return true; 
}        

private boolean redText4Border(){ 
    textField4.setStyle("-fx-border-color: red"); 
    return false; 
} 

private boolean redTime3Border(){ 
    timePicker3.setStyle("-fx-border-color: red"); 
    return false; 
} 

private boolean orangeTime2Border(){ 
    timePicker2.setStyle("-fx-border-color: orange"); 
    return false; 
} 

private boolean redText5Border(){ 
    textField5.setStyle("-fx-border-color: red"); 
    return false; 
} 
+0

答案不是必需的,不會提供比_matoni_更多的答案。您可以評論答案以添加一些內容。 – AxelH

+0

matoni的答案集中在Guard條款,而我的重點是反轉Ifs和刪除Elses。所以是的,我的答案確實有幫助。如有需要,我會再補充一點,以說清楚。 –

+0

如果您恢復條件以在'ifs'中具有'return'並且能夠刪除'else'部分(和嵌套),那麼您將清楚地創建確切的模式,只不過_matoni_給該解決方案一個名稱。所以,請添加更多,以便我可以看到它在哪裏分歧 – AxelH