Давно программируете на Ruby? Тогда наверняка сталкивались с мини-драмой двух ключевых слов потока управления: if и unless. Это как две стороны одной медали: if  —  вечный оптимист, а unless  —  немного скептик. Разберем отличия этих двух звезд Ruby, приправим щепоткой юмора и избавимся от путаницы условных конструкций.

Знакомьтесь: оптимист if

Это классический поток управления. if применяется, когда условие истинно. Очень просто. Это как друг, который всегда говорит: «Конечно, если будет солнечно, пойдем гулять!»

if sunny
puts "Let's go out and enjoy the sun!"
end

В этом коде, если sunny истинно, идем насладиться прекрасной погодой. А если нет? Скоротаем день за просмотром Netflix на диване.

Появляется скептик unless

А этот друг всегда думает, что стакан наполовину пуст. Применяется, только когда условие ложно. unless говорит: «Выйду, только если не будет дождя».

unless raining
puts "Let's go out and enjoy the sun!"
end

Поэтому, если raining ложно, пойдем загорать. Если raining истинно, останемся дома. С unless логика обратная: этот друг идеален для случаев, где акцентируется то, чему происходить нежелательно.

Незаметные отличия: потому что не все так просто

1. Удобство восприятия

Здесь начинается самое интересное. if обычно интуитивно понятнее, потому что людям привычнее мыслить утвердительно. Но с unless код удобнее для восприятия с отрицательными условиями. Например, сравните эти:

if !sunny
puts "Better grab an umbrella!"
end

# и

unless sunny
puts "Better grab an umbrella!"
end

Какое удобнее для восприятия? Версия unless обычно понятнее, когда речь идет об отрицательных условиях. Это как быстрый способ сказать: «Не хочу этого делать; сделаю, только если…». Надеюсь, понятно.

2. Нюансы: вложенная логика не годится

Жизнь не всегда проста, условные конструкции тоже. Если вложить unless в if или наоборот, вопросов будет больше, чем ответов.

if user_signed_in
unless admin
puts "Welcome, user!"
end
end

Это совершенно допустимо, но пощадите читателей вашего кода  —  упростите его. Когда что-то начинает походить на логическую головоломку, обычно предпочтительнее использовать if.

3. Модификаторы: маленький помощник

В Ruby имеется все для чистого, элегантного кода. Как модификаторы используются и if, и unless:

puts "Welcome, guest!" if user.nil?
puts "Welcome, guest!" unless user

Здесь ими выполняется одно и то же, но выбор между if и unless сводится к тому, как задается условие. В позитивном ключе? Применяйте if. Немного негативном? Тогда unless.

Когда использовать if, а когда  —  unless: шпаргалка

  • Применяйте if, когда проверяете истинность.
  • Применяйте unless, когда проверяете ложность, особенно если код от этого становится удобнее для восприятия.
  • Избегайте unless при многих условиях. Это все равно что пытаться играть в шахматы в уме  —  быстро запутаетесь.
# Хорошо:
puts "Welcome!" unless user_signed_in

# Плохо:
unless user_signed_in && account_active
puts "You can't access this page."
end

Видите? С unless здесь слишком сложно. Когда условий много, используйте if.

Заключение:
В Ruby if и unless  —  две стороны одной медали. if применяется в большинстве сценариев, unless  —  отличный помощник, когда акцентируется нежелательность происходящего. Выбирайте то, с чем код станет понятнее, удобнее для вас самих и ваших коллег. Практикуйтесь в написании кода, и пусть условные конструкции всегда будут четкими.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Melihciray: Ruby Showdown: unless vs. if – The Ultimate Face-Off!

Предыдущая статьяПоддержка нескольких модальных окон в React Native: новый подход
Следующая статьяПишем и сравниваем приложения Todo на JavaScript и Gleam