Как правильно отформатировать длинные составные операторы if в Coffeescript - PullRequest
68 голосов
/ 08 июля 2011

Если бы у меня было сложное выражение if, которое я не хотел бы переполнять просто для эстетических целей, каков был бы самый кошерный способ разбить его, так как в этом случае coffeescript интерпретирует возвращаемые значения как тело утверждения?*

if (foo is bar.data.stuff and foo isnt bar.data.otherstuff) or (not foo and not bar)
  awesome sauce
else lame sauce

Ответы [ 5 ]

86 голосов
/ 08 июля 2011

CoffeeScript не будет интерпретировать следующую строку как тело оператора, если строка заканчивается оператором, так что все в порядке:

# OK!
if a and
not 
b
  c()

он компилируется в

if (a && !b) {
  c();
}

таким образом, ваш if может быть отформатирован как

# OK!
if (foo is 
bar.data.stuff and 
foo isnt bar.data.otherstuff) or 
(not foo and not bar)
  awesome sauce
else lame sauce

или как любая другая схема разрыва строки, если строки заканчиваются на and или or или is или == или not или некоторый такой оператор

Относительно отступа, вы можете сделать отступ для не первых строк вашего if, если тело имеет еще более отступ:

# OK!
if (foo is 
  bar.data.stuff and 
  foo isnt bar.data.otherstuff) or 
  (not foo and not bar)
    awesome sauce
else lame sauce

Чего вы не можетесделать это:

# BAD
if (foo  #doesn't end on operator!
  is bar.data.stuff and 
  foo isnt bar.data.otherstuff) or 
  (not foo and not bar)
    awesome sauce
else lame sauce
3 голосов
/ 08 июля 2011

Это несколько меняет смысл вашего кода, но может быть полезным:

return lame sauce unless foo and bar
if foo is bar.data.stuff isnt bar.data.otherstuff
  awesome sauce
else
  lame sauce

Обратите внимание на цепочку is...isnt, которая допустима, так же, как a < b < c допустима в CoffeeScript. Конечно, повторение lame sauce вызывает сожаление, и вы можете не захотеть return сразу. Другой подход заключается в использовании soaks для записи

data = bar?.data
if foo and foo is data?.stuff isnt data?.otherstuff
  awesome sauce
else
  lame sauce

if foo and немного не элегантен; Вы можете отказаться от него, если нет шансов, что foo будет undefined.

2 голосов
/ 22 февраля 2016

Выход из разрыва строки выглядит наиболее читабельным для меня:

if (foo is bar.data.stuff and foo isnt bar.data.otherstuff) \
or (not foo and not bar)
  awesome sauce
else lame sauce
2 голосов
/ 01 марта 2012

Как и любой другой язык, не имея их в первую очередь. Дайте названия различным частям, рассматривайте их отдельно. Либо объявив предикаты, либо просто создав пару логических переменных.

bar.isBaz = -> @data.stuff != @data.otherstuff
bar.isAwsome = (foo) -> @isBaz() && @data.stuff == foo
if not bar? or bar.isAwesome foo
  awesome sauce
else lame sauce
0 голосов
/ 01 марта 2016

Когда возникает много низкоуровневых шаблонов, вы должны увеличить уровень абстрактности .

Лучшими решениями являются:

  • для использования переменные и функции с хорошими именами

  • логические правила в if / else заявления

Один изЛогические правила:

(не A и не B) == не (A или B)

Первый путь. Переменные:

isStuff              = foo is bar.data.stuff
isntOtherStuff       = foo isnt bar.data.otherstuff
isStuffNotOtherStuff = isStuff and isntOtherStuff
bothFalse            = not (foo or bar)
if isStuffNotOtherStuff or bothFalse
  awesome sauce
else lame sauce

Основным недостатком этого метода является его медлительность.Мы получим лучшую производительность, если будем использовать функции операторов and и or и заменять переменные функциями:

  • C = A и B

Если Aявляется ложным оператором and не будет вызывать

  • C = A или B

Если A является истинным оператором or не будет вызов

Второй способ. Функции:

isStuff              = -> foo is bar.data.stuff
isntOtherStuff       = -> foo isnt bar.data.otherstuff
isStuffNotOtherStuff = -> do isStuff and do isntOtherStuff
bothFalse            = -> not (foo or bar)
if do isStuffNotOtherStuff or do bothFalse
  awesome sauce
else lame sauce
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...