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: 紛らわしい条件文を書かないこと(翻訳)

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ