Ruby の unless は使わないほうが良い
はじめに
こんにちは、ラブグラフエンジニアの熊谷です。
プログラミング言語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
で置き換えて実装を進めて、解決に至りました。
また Ruby
は Perl
の影響を大きく受けて生まれた言語であると言われていますが、調べてみると unless文があるメジャーな言語はこの2つしかありませんでした。
他の言語をメインに利用していた人にとっても、 unless
は馴染みのないキーワードですので、そういった意味でも読みづらさが出ているのだと思います。
おわりに
ということで、いっそのこと unless
を使わないことにしてみましょう!!
「使わない」と決めることで、「ここは unless
を使うべきか」、「ここは if
を使ったほうが良さそう」などと迷うこともなくなるので、ほんの少しですがコーディングも速くなると思います。
なるほどなと思ったら、ぜひ試してみてください。
Discussion