Есть мнение о else
что мы не должны использовать его, unless
?
Может ли кто-нибудь объяснить, почему это так, или мы можем идти куда угодно?
Есть мнение о else
что мы не должны использовать его, unless
?
Может ли кто-нибудь объяснить, почему это так, или мы можем идти куда угодно?
Вы определенно можете использовать else
unless
. Например:
x=1
unless x>2
puts "x is 2 or less"
else
puts "x is greater than 2"
end
Будет напечатан "x 2 или меньше".
Но только потому, что вы можете что-то сделать, это не значит, что вам нужно. Чаще всего эти конструкции свернуты, чтобы читать, и вам лучше было бы выразить свое состояние положительным образом, используя простой, if
:
x=1
if x<=2
puts "x is 2 or less"
else
puts "x is greater than 2"
end
Да, мы можем использовать, unless
с else
. Мы свободны идти куда угодно, но у некоторых людей есть мнение, что это не хорошая привычка использовать else
unless
. Нам нужно избегать этого.
К сожалению, если оператор не поддерживает только конструкцию else, то в нем не будет elsif или elseunless.
unless true
puts "one"
elsif true
puts "two"
else
puts "three"
end
SyntaxError: compile error
syntax error, unexpected kELSIF, expecting kEND
Это также может быть причиной того, что это ограничивает нас.
Ничто не мешает кому-либо использовать, unless - else
. Это совершенно верно. Но остальная часть, если-не-это двойной отрицательный.
В некоторых случаях, unless
это легко понять. Но в сочетании с оператором else
, if - else
всегда легче понять, чем без unless - else
. Представьте себе, что вы пытаетесь понять остальную часть условия " unless - else
. Это двойной негатив, и двойной негатив просто очень не ошибается.
Также, если есть много условий с комбинациями &&
и ||
операторы, unless
становится сложнее понять
Да, мы можем использовать, unless
с else
. но не лучше всего писать
unless foo
# Foo
else
#Bar
end
Это не более читаемый код. Вот некоторые руководства по стилю кодировки Ruby, которые придерживаются большинство разработчиков.
Ruby позволяет это, но на английском языке "if... else" (или "if... other") является общей конструкцией, тогда как "если... else" в значительной степени неслыханно, до такой степени, что многие носители языка отклоните его как неправильное.
Это приводит к некоторой путанице с unless/else
в Ruby. Люди, чей родной язык не позволяет это просто не привыкли следовать за ним. Вот почему есть много мнений против этого. Поскольку Ruby поддерживает это, вы, конечно, можете это сделать.
Технически это прекрасно использовать, unless
с else
:
unless user.staff?
# do foo
else
# do bar
end
Единственная проблема в том, что ее иногда трудно читать и понимать. Поскольку код чаще читается, чем написан, имеет смысл сосредоточиться на удобочитаемости и написать код, который будет понятен другим разработчикам в будущем.
Поэтому вы можете изменить его на:
if !user.staff?
# do bar
else
# do foo
end
Или даже лучше полностью удалить отрицание из условия:
if user.customer?
# do bar
else
# do foo
end
if true
просто понятна и проще разбираться в голове, чем if !true
или unless true
. Работа с отрицаниями (или иногда даже двойными отрицаниями) заставляет вас думать дважды. Поэтому сообщество пытается избежать этого.
Но технически это прекрасно...
Выполняет код, если условие false. Если условие истинно, выполняется код, указанный в предложении else.
x=1
unless x>2
puts "x is less than 2"
else
puts "x is greater than 2"
end
Мы можем использовать другое, если только его плохой подход.
Было бы целесообразно (более читаемым, чем любой другой альтернативы) использовать, unless... else...
когда код в else
блоке очень долго, и код в, unless
блок не является очень коротким.
unless user.staff?
raise SecurityError, 'not authorized'
else
# ...
# ...
# ... lots of code
# ...
# ...
end
Если вы написали это наоборот,
if user.staff?
# ...
# ...
# ... lots of code
# ...
# ...
else
raise SecurityError, 'not authorized'
end
предложение else может быть настолько далеким от его состояния, что вы заставите людей прокручивать вверх и вниз, чтобы держать вещи прямо в их головах.
Этот конкретный пример лучше написан без какого- else
...
unless user.staff?
raise SecurityError, 'not authorized'
end
# ...
# ...
# ... lots of code
# ...
# ...
... но это преобразование не всегда возможно.