3

Я нашел код в обзоре кода, который был написан моим членом команды. Он содержит вложенный тернарный оператор. Я сказал ему использовать if else, если для целей удобочитаемости более одного гнездования. Мы спорили об этом.Вложенный тернарный оператор vs вложен, если 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

Впервые я услышал ссылку на LISP при написании кода Java. ;-) – Andreas

+0

@Andreas Оригинальная команда разработчиков Java 1.0 содержала несколько знаменитых LISPers :) –

+0

, поэтому я не могу использовать переключатель, если есть выражение вместо константы (enum) – 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 д. « - Гарольд Абельсон, Структура и интерпретация компьютерных программ

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