#ruby #coding-style
#ruby #coding-style
Вопрос:
В нескольких руководствах по стилю Ruby упоминается, что вам «Никогда не следует использовать then». Лично я думаю, что ключевое слово «then» позволяет вам сделать код более плотным, что, как правило, труднее для чтения. Есть ли какое-либо другое обоснование для этой рекомендации?
Ответ №1:
Я почти никогда не использую then
ключевое слово. Однако, есть один случай, когда я считаю, что это значительно улучшает читаемость. Рассмотрим следующие несколько условных операторов if.
Пример A
if customer.jobs.present? amp;amp; customer.jobs.last.date.present? amp;amp; (Date.today - customer.jobs.last.date) <= 90
puts 'Customer had a job recently'
end
Слишком длинная длина строки. Трудно читать.
Пример B
if customer.jobs.present? amp;amp;
customer.jobs.last.date.present? amp;amp;
(Date.today - customer.jobs.last.date) <= 90
puts 'Customer had a job recently'
end
Где заканчиваются условия и где начинается внутренний код. Согласно руководствам по стилю Ruby, у вас должен быть один дополнительный пробел отступа для многострочных условных обозначений, но я все еще не нахожу, что все это легко читается.
Пример C
if customer.jobs.present? amp;amp;
customer.jobs.last.date.present? amp;amp;
(Date.today - customer.jobs.last.date) <= 90
then
puts 'Customer had a job recently'
end
Для меня пример C, безусловно, самый понятный. И именно использование then
делает свое дело.
Ответ №2:
Если я правильно помню, then
это всего лишь один из разделителей, отделяющих условие от истинной части (точка с запятой и новая строка являются остальными)
если у вас есть однострочный оператор if, вам придется использовать один из разделителей.
if (1==2) then puts "Math doesn't work" else puts "Math works!" end
для многострочных ifs then
необязательно (работает с новой строкой)
if (1==2)
puts "Math doesn't work"
else
puts "Math works!"
end
Не могли бы вы опубликовать ссылку на одно из упомянутых вами руководств по стилю…
Комментарии:
1. Конечно, мы можем часто (всегда?) замените однострочники использованием троичных операторов, например,
puts 'Math ' (1==2 ? "doesn't work" : 'works!')
не обязательно говорить, что мы должны , заметьте, просто что это вариант2. Троичный оператор является заменой оператора if / then / else. Это не замена if / then.
3. @Mike — интересный момент. Моя единственная проблема с троичными операторами заключается в том, что иногда это может ухудшить читаемость (и они немного туповаты для начинающих). Я согласен, что для небольших однострочников это может быть приемлемой альтернативой или подходом if-modifier из
greet_user if someone_is_logged_in
Ответ №3:
Я думаю, что «никогда не использовать then
» неправильно. Использование слишком большого количества не алфавитных символов может сделать код таким же трудным для чтения, как perl или APL. Использование слова на естественном языке часто делает программиста более удобным. Это зависит от баланса между удобочитаемостью и компактностью кода. Тернарный оператор иногда удобен, но уродлив при неправильном использовании.