Почему вы должны избегать ключевого слова then в Ruby?

#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. Использование слова на естественном языке часто делает программиста более удобным. Это зависит от баланса между удобочитаемостью и компактностью кода. Тернарный оператор иногда удобен, но уродлив при неправильном использовании.