Когда не использовать "unless"
Данная статья является вольным переводом статьи Making sense with Ruby's "unless", которая показалась мне очень полезной.
Среди вещей, которые новички (и джедаи!) в Руби считают восхитительными есть такие незначительные приятные мелочи, которые делают язык достаточно интуитивным. Показательный пример: unless
Ключевое слово unless
есть ни что иное как обратный if
. Код, стоящий после условия выполнится только тогда, когда условие ложно. Это позволяет писать вам следующее:
i += 1 unless i > 10
unless person.present?
puts "There's no such person"
end
Однако, инструмент, который дает хотя бы немного возможностей, может использоваться в извращенном виде. Приведенный ниже код - яркий тому пример:
unless !person.present? && !company.present?
puts "do you even know what you're doing?"
else
puts "and now we're really confused"
end
Без сомнения найдутся люди, которые смогут понять логику, написанную выше, не приходя в истерику. Но все-таки для большинства людей сочетание отрицаний, нескольких условий, да еще и в комбинации с unless
создает большие трудности в понимании написанного. Также это приводит к возникающим ошибкам в логике.
Вот несколько правил при использовании unless
:
1) Не следует использовать более одного логического условия. unless foo?
это нормально, unless foo? && bar?
значительно сложнее разобрать.
2) Избегайте отрицаний. unless
- это уже отрицание. Исользование дополнительных отрицаний сделает условие только хуже.
3) Запомните! Никогда, никогда НЕ используйте else
в одном условии с unless
Мало того, что другие будут вам благодарны, когда будут читать ваш код, вы сами будете благодарить себя, когда вам придется вернуться к вашему коду спустя какое то время.