概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Be sparing when using unless - Andy Croll
- 原文公開日: 2018/01/07
- 著者: Andy Croll
Ruby: unless
はここぞというときまで使わないこと(翻訳)
Rubyの強みのひとつに素敵な組み込みシンタックスシュガーがありますが、unless
キーワードもそのひとつです。否定文で使われるif
をunless
で置き換えることができます。
しかし、Rubyのシンタックスが自由なために、あっという間にコードが必要以上に理解しづらくなってしまいます。
次のように書いてはいけない
心が折れるunless
。
# 例1
unless something?
# 何かする
else
# 他のことをする
end
# 例2
unless something? || another_thing?
# 何かする
end
次のように書くこと
if
の方がコードがきれいになる場合はif
を使う。
# 例1
if !something?
# 他のことをする
else
# 何かする
end
# 例2
if !something? && !another_thing?
# 何かする
end
そうすべき理由
unless
とelse
ブロックの併用は避けましょう。この構造ではelse
ブロックが「二重否定」(指定の条件のnotのnot)になってしまうために理解がつらくなります。そういうunless
はif
に置き換え、必要に応じて条件文もリファクタリングし、メインのコードとelse
ブランチのブロックを入れ替えましょう。
unless
と論理演算(&&
や||
)が組み合わさると、コードが数段理解しづらくなります。書いた本人でもきっと混乱するでしょう。unless one && two
はif !one || !two
と同値です。ロジックはよりいっそうややこしく見えますが、この肯定版の方が理解しやすくなります。
if
条件が複雑になったら、よい名前のメソッドを作ってそこに条件を切り出すことでさらにわかりやすくなります。
そうすべきとは限らない理由
unless
を何が何でも使ってはならないとは申しておりません。unless
はあくまでシンタックスシュガーである点が重要なので、unless
にする方がコードがわかりやすくなる場合に限って用いましょう。