Каково принятое форматирование для вложенных тернарных операторов?

Скажем, у нас есть вложенные тернарные операторы:

return foo ? 1 : bar ? 2 : 3;

Каков наилучший способ отформатировать этот код, чтобы в будущем его могли читать другие.


person Shadowfool    schedule 21.02.2016    source источник
comment
Не делай этого. Вложенные тернарные операторы серьезно ухудшают читабельность.   -  person Quentin    schedule 21.02.2016
comment
Прочтите эту запись с обзором кода.   -  person aribeiro    schedule 21.02.2016
comment
Это выглядит как мнение, основанное на правильном ответе, или лучшее решение, принятое в каждом конкретном случае (мое мнение). @ariberiro предоставил ссылку на codereview для дальнейшего обсуждения этой темы.   -  person traktor    schedule 22.02.2016


Ответы (5)


Этот пост — самое популярное мнение, которое я смог найти по этому поводу. Предложение есть

return foo ? 1 :
       bar ? 2 : 
             3 ;
person Zach Posten    schedule 23.06.2017

Чтобы отделить функцию

function getValue(cond1, cond2) {
  if(cond1) return 'a';
  if(cond2) return 'b';
  return 'c';
}

function work() {
  const result = getValue(/* some params */);
}
person Александр Янковский    schedule 24.01.2017

Я не могу сказать, принято это или нет, но я использую его таким образом все время.

Ternary дает вам такую ​​естественную структуру тестирования, что вы можете сделать код очень читаемым, просто сделав его многострочным и правильно расставив отступы. Я твердо верю, что следующее использование тернара является лучшим проявлением вложенного условного оператора.

return foo ? 1 
           : bar ? 2
                 : 3;

В более сложных случаях вы можете заставить тернарный оператор и оператор запятой прекрасно работать вместе. Имейте в виду, что последняя инструкция в группе, разделенной запятыми, возвращается автоматически. Супер удобно для тройки.

return foo ? ( doSometingFoo()
             , variable++
             , collectResult()               // and return foo result
             )
           : bar ? ( doSomethingBar()
                   , variable--
                   , collectAnotherResult()  // and return bar result
                   )
                 : ( doSomethingReject()
                   , variable = 0
                   , rejectSomehow()         // and return error code
                   )
person Redu    schedule 14.05.2021
comment
Этот вид работает примерно для трех уровней, но быстро ломается, когда у вас более трех ног из-за чрезмерного отступа. Выравнивание, подобное этому ответу, лучше подходит для обработки произвольного количества ножек: stackoverflow.com/a/44724098 - person Oskar Berggren; 13.07.2021

Я предпочитаю удобочитаемость этого стиля форматирования тернарного оператора:

return foo
    ? bar
    : baz
      ? qux
      : qiz
        ? 1
        : 2;
person Cornu    schedule 29.06.2021

Для удобочитаемости просто держитесь подальше от этих утверждений, их очень легко неправильно прочитать, если вы хотите что-то более читаемое, просто разверните и используйте обычные состояния.

Нет ничего плохого в том, чтобы просто иметь вложенный список операторов if.

if(foo){
   return 1
}else{
  if(bar){
      return 2;
  }else{
      return 3;
  }
}
person Mostafa Berg    schedule 21.02.2016