Tech Racho エンジニアの「?」を「!」に。
  • 開発

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

概要

原著者の許諾を得て翻訳・公開いたします。

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

Rubyの強みのひとつに素敵な組み込みシンタックスシュガーがありますが、unlessキーワードもそのひとつです。否定文で使われるifunlessで置き換えることができます。

しかし、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

そうすべき理由

unlesselseブロックの併用は避けましょう。この構造ではelseブロックが「二重否定」(指定の条件のnotのnot)になってしまうために理解がつらくなります。そういうunlessifに置き換え、必要に応じて条件文もリファクタリングし、メインのコードとelseブランチのブロックを入れ替えましょう。

unlessと論理演算(&&||)が組み合わさると、コードが数段理解しづらくなります。書いた本人でもきっと混乱するでしょう。unless one && twoif !one || !twoと同値です。ロジックはよりいっそうややこしく見えますが、この肯定版の方が理解しやすくなります。

if条件が複雑になったら、よい名前のメソッドを作ってそこに条件を切り出すことでさらにわかりやすくなります。

そうすべきとは限らない理由

unlessを何が何でも使ってはならないとは申しておりません。unlessはあくまでシンタックスシュガーである点が重要なので、unlessにする方がコードがわかりやすくなる場合に限って用いましょう。

関連記事

Rubyにおけるunlessとコードの読みやすさについて

Ruby: 紛らわしい条件文を書かないこと(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。