[no_toc]

case文の書き方

case文とは、条件分岐の記述方法の1つで、変数の状態を確かめる際に使用します。
Rubyでのcase文の書き方は以下のようになります。

case 比較対象
when 条件1 then
	条件1に一致した際の処理
when 条件2 then
	条件2に一致した際の処理
when 条件3 then
	条件3に一致した際の処理
else
	どれにも一致しない際の処理
end

おそらく初心者の方がこれだけ見ても、何のことかさっぱりかと思います。また、同じ条件式として使用するif文との違いもわかりにくいかもしれません。下部に理解を深めるために、例を通しながら、情報を掘り下げていくので、もう少しお付き合いください。

if文とcase文との違い

if文とcase文とでは条件分岐するという意味では同じものの、それぞれ使用する際に比較対象の個数が大きな違いです。
[case文の場合]
1つの比較対象に対して複数の条件分岐を可読性の高いシンプルな書き方を実現可能。
[if文の場合]
複数の比較対象を組み合わせて条件分岐でき、複雑なロジックを実現可能。
下記はif文を使用した簡単な例です。

puts "性別を教えて下さい。(man:1 woman:2)"
sex = gets.to_i
puts "年齢を教えて下さい。"
age = gets.to_i
if age > 20 && sex == 1 then
	puts "あなたは成人男性です。"
elsif age < 20 && sex == 1 then
	puts "あなたは成人していない、男性です。"
elsif age > 20 && sex == 2 then
	puts "あなたは成人女性です。"
elsif age < 20 && sex == 2 then
	puts "あなたは成人していない、女性です。"
else
	puts "入力情報が不正です。"
end

このように、複数の比較対象(ageとsex)を比べることが可能です。ただし、複雑なロジックが可能というメリットを実現する代わりに、可読性も落ちやすくなります。(ageとsexを比べ、条件式が混在しているので)
また、実際の開発現場では、もっと複雑な条件が重なることも多いです。そのような場合は、不具合が出た際には原因特定に至るのに時間を要する可能性もあるので、あまり条件が多くなりすぎても保守性が低くなるのです。

case文を実際に使ってみる

では、保守性の高いシンプルなコードを実現できるcase文です。下記はcase文を使用した簡単な例です。

puts "Please enter any of 1 to 12"
month = gets.to_i
case month
when 3,4,5 then
	puts "Spring"
when 6,7,8 then
	puts "Summer"
when 9,10,11 then
	puts "Autumn"
when 12,1,2 then
	puts "Winter"
else
	puts "Error"
end

どうでしょうか?このように、一つの比較対象(month)の状態を比べるのに使用できます。1つに絞ることにより、シンプルさを追求することができ、比較対象の状態を確認することができるので、数千行等のソースコードになったとしても、バグがでにくい、または出ても原因特定しやすいというメリットも得られます。

まとめ

if文でも同じロジックを実現することは可能なものの、case文を書くことによって保守性の高いソースファイルを書くことができ、非常に開発現場で重宝する書き方でもあります。少しロジックを考えることに慣れてきて、問題なく書けるようになってきたなら、是非ともcase文の書き方をマスターされてはいかがでしょうか?