Ruby: `unless`はここぞというときまで使わないこと(翻訳)

概要 原著者の許諾を得て翻訳・公開いたします。 英語記事: 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にする方がコードがわかりやすくなる場合に限って用いましょう。 関連記事 Rubyにおけるunlessとコードの読みやすさについて Ruby: 紛らわしい条件文を書かないこと(翻訳)