はじめに
もともと、工業高校でC言語から始め、
社会人にてJavaで活動していたSEが転職を期に
Rubyを学んだ時の混乱について一部書きます。(条件分岐について => タイトル通りです)
お馴染みの条件分岐(if else)
Rubyを学ぶまで、if(もし)、else(でなければ)
の2つで条件分岐は丸く収まると思っていました。
unlessが登場
基本的には、言葉の文法通りに想像するなら
「もし~なら、でなければ」と基本的にはなると思います。
ところが「でなければ」から始まる構文が
Rubyでは存在しました。
これが「unless」です。
極端な例:偶数かそうでない場合の判別
(どの言語でも分かりやすいようにevenメソッドは使用しません + 括弧も付けます)
# if、elseのパターン
if (num % 2 == 0)
puts "偶数"
else
puts "奇数"
end
# unlessのパターン
unless (num % 2 == 0)
puts "奇数"
else
puts "偶数"
end
通常、頭の中では「2で割り切れれば偶数」
「そうでなければ奇数」と自然に考えていると思います。
それが逆転するわけですから混乱します。
更に「||(または)」が混ざった場合は可読性が最低になります。
(詳しくは省きますが「ド・モルガンの法則」を利用してリファクタリングしましょう)
上記のパターンを見慣れた形にしたい、
と考え、無意識のうちにこう記述してしまうかもしれません。
# unlessの二重否定パターン
unless !(num % 2 == 0)
puts "偶数"
else
puts "奇数"
end
これは「二重否定」と言われるもので
unlessでは避けるべきものです。
「~ではなく、ーではない」と
言葉にすると非常に違和感があると思います。
unlessで避けるべきもの(代表)
- 二重否定
- 「||」を混合すること
では何に使えるのか(一例)
「後置unless」という構文が存在します。
Rubyの場合には「present?(存在するか)」というメソッドがあります。
上記のメソッドは存在すると「True」、しないと「False」を返します。
例:存在しない場合にreturnしたい
# 存在を否定(存在しない)
if !(mariori12.present?)
return
# 存在しない
unless mariori12.present?
return
どうでしょうか、こう見ると
後者の方がより直感的で分かりやすくないでしょうか。
このような場合に分かり易く
するために使うのだと思っています。(言い聞かせ)
さいごに
他にも、避けるべき例、活用できる様々な例があるとは思いますが、
この記事では代表例(恐らく)の記述のみで終わります。
もし、筆者と同じように混乱しそうな方に
役立てていただければ幸いです。