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];