3

我在代碼審查中發現了由我的團隊成員編寫的代碼。它包含嵌套的三元運算符。爲了可讀性目的,如果存在多於一個嵌套,我告訴他使用if if。我們曾經爭論過。嵌套三元運算符vs嵌套if else,這在可讀性方面更好

以下是代碼

ColorEnum color = opacity == Opacity.FIVE? ColorEnum.BLACK : 
       opacity == Opacity.TEN? ColorEnum.WHITE : 
        opacity == Opacity.FIFTY? ColorEnum.RED : 
         opacity == Opacity.TWENTY? ColorEnum.BLUE : 
          opacity == Opacity.FIFTEEN? ColorEnum.PURPLE : null; 

而這個代碼正在改變,因爲新的配置來了。

所以這裏有什麼更好的?三元運算符還是其他?

+0

問題,這只是要求我們的意見是不適合StackOverflow的,因爲這不是一個討論的論壇。請重新說明你的問題; [幫助頁](http://stackoverflow.com/help/dont-ask)上的「主觀問題」部分應該給你一些想法。 –

回答

5

只是重新格式化您的代碼,使得它相當清楚:

ColorEnum color = 
      opacity == Opacity.FIVE ? ColorEnum.BLACK 
     : opacity == Opacity.TEN  ? ColorEnum.WHITE 
     : opacity == Opacity.FIFTY ? ColorEnum.RED 
     : opacity == Opacity.TWENTY ? ColorEnum.BLUE 
     : opacity == Opacity.FIFTEEN ? ColorEnum.PURPLE 
     : null; 

LISP採用cond結構,它同時具有相同的結構和相同的語義,並且被認爲是很好的做法。順便說一下,Clojure還支持一種表單,它將單個謂詞的值應用於不同的值(每個子句一個),並將其稱爲condp —,這將與您的用例完美匹配。

與三元運算符的成語有優勢的if-else級聯曾是一個表達所以你只需要一個單獨的語句把它分配給變量。 if-else將強制您將任務分配到每個then子句中,引入更多樣板並有更多機會在正確性上失敗。

switch語句也可以被視爲一種替代,但它會具有以下的缺陷:

  • if-else,它不是一個表達式;

  • 您僅限於不同的常量單個表達式的值(表達式的類型也相當受限制)。

  • 由於樣板break缺少某處,所以很容易出現錯誤。

+0

我第一次在編寫Java代碼時聽說過LISP的參考。 ;-) – Andreas

+0

@Andreas最初的Java 1.0架構團隊包含幾個着名的LISPers :) –

+0

所以我不能使用開關,如果有表達式而不是常量(枚舉) – nilesh

5

我建議使用switch聲明。它比三元和if-else更可讀。

switch(opticity) 
{ 
    case Opticity.FIVE: color = ColorEnum.BLACK; 
    break; 

    case Opticity.TEN: color = ColorEnum.WHITE; 
    break; 

    case Opticity.FIFTY: color = ColorEnum.RED; 
    break; 

    .... 

    default: printf("Error message\n"); 
} 
2

爲了達到這個目的,在可讀性方面可能是最好的switch-case語句。

1

與開關一起去。

我有我一貫遵循(雖然不是hardset)拇指規則

1)只有一個條件評估,去與三元操作

2)兩個條件檢查,以if(){} else if(){ } else{}去構建

3)三個或更多的去與switch階梯

「程序必須寫入供人閱讀,而只是附帶的機器EXECUT e。「 - Harold Abelson,計算機程序的結構和解釋

1

正如其他人所說的,一個開關將是一個很好的選擇。爲了減少樣板代碼(休息,分配),我會進一步建議把開關到一個專門的方法:

(所有的例子是在C#)

public ColorEnum OpacityToColor(Opacity opacity) 
{ 
    switch (opacity) 
    { 
    case Opacity.FIVE: 
     return ColorEnum.BLACK; 
    case Opacity.TEN: 
     return ColorEnum.WHITE; 
    case Opacity.FIFTY: 
     return ColorEnum.RED; 
    case Opacity.TWENTY: 
     return ColorEnum.BLUE; 
    case Opacity.FIFTEEN: 
     return ColorEnum.PURPLE; 
    default: 
     throw new System.ArgumentOutOfRangeException("opacity"); 
    } 
} 

// Elsewhere 
ColorEnum color = OpacityToColor(opacity); 

如果你的語言有一個整潔的詞典/地圖初始化語法(如Python和C#),你也可以使用一個非常簡潔明瞭的符號:

public static readonly Dictionary<Opacity, ColorEnum> ColorByOpacity = 
    new Dictionary<Opacity, ColorEnum> 
{ 
    {Opacity.FIVE, ColorEnum.BLACK}, 
    {Opacity.TEN, ColorEnum.WHITE}, 
    {Opacity.FIFTY, ColorEnum.RED}, 
    {Opacity.TWENTY, ColorEnum.BLUE}, 
    {Opacity.FIFTEEN, ColorEnum.PURPLE} 
}; 

// Elsewhere 
ColorEnum color = ColorByOpacity[opacity];