⚖️

Ruby の unless は使わないほうが良い

2024/06/10に公開

はじめに

こんにちは、ラブグラフエンジニアの熊谷です。
プログラミング言語Rubyには、条件分岐を表現するためのキーワードとして if だけでなく、 unless も存在します。 unless は「〜でない場合」という条件を簡潔に表現するのに便利ですが、個人的には使わないほうがいいと思っているので、その理由をまとめていきたいと思います。

unless の利点

unless は「〜でない場合」という条件を簡潔に表現できます。特に単純な条件の時に利用するのであれば便利です。

unless user.nil?
  puts "User exists."
end

単純な条件文を利用するだけであれば、コードが自然な言葉の流れになり、読みやすさがあるでしょう。

unless の欠点

複雑な条件文やネストされた条件文のとき

こちらの例を見ながら考えてみましょう。

# 悪い例
unless user.nil? || user.admin?
  puts "User is not admin and not nil."
end

複数の条件がある場合にどういう条件になるのか、少し分かりづらさが出てきています。
コードリーディングに時間をかければきっと理解はできると思いますが、以下にあるように if で置き換えるとより時間短縮することができるでしょう。

if user.present? && !user.admin?
  puts "User exists and is not an admin."
end

こちらのほうが理解しやすいコードになっていると思いませんか?

否定の否定(二重否定)が含まれる条件文のとき

unless !user.nil?
  puts "User is nil."
end

2重否定になってしまうのであれば、わざわざ遠回りをせずに if を使いましょう。

if user.nil?
  puts "User is nil."
end

直感的でわかりやすいと思います。

unless が読みづらい考察

unless が含まれることで「次の条件が否定の場合」、「否定の否定だから肯定」と脳内メモリ上に変数が増え、コーディングやコードリーディングに時間がかかるのだと思います。

自分の経験では unless が使われている箇所に条件を追加する必要があったときに、なかなか混乱しながらコーディングした記憶があります。
最終的には if で置き換えて実装を進めて、解決に至りました。

また RubyPerl の影響を大きく受けて生まれた言語であると言われていますが、調べてみると unless文があるメジャーな言語はこの2つしかありませんでした。
他の言語をメインに利用していた人にとっても、 unless は馴染みのないキーワードですので、そういった意味でも読みづらさが出ているのだと思います。

おわりに

ということで、いっそのこと unless を使わないことにしてみましょう!!
「使わない」と決めることで、「ここは unless を使うべきか」、「ここは if を使ったほうが良さそう」などと迷うこともなくなるので、ほんの少しですがコーディングも速くなると思います。

なるほどなと思ったら、ぜひ試してみてください。

ラブグラフのエンジニアブログ

Discussion