はじめに
Rubyのifが式であることを知ることで、もう少しコードを綺麗に書けることを知った。
もし、下記の例題のようなRubyのコードを書いていれば、もう少しコードを綺麗にできるかもしれない。
それでは、はじめよう。
例題
下記のような点数と難易度を渡すと難易度に応じて調整された点数が返ってくるメソッドがあるとしよう。
# 点数を調整する
# @param score [Integer] 点数
# @param mode [Integer] 難易度
# @return [Integer] 調整した点数
def adjust_score(score, mode)
if mode == 'easy'
collection_score = 10
elsif mode == 'hard'
collection_score = -10
else
collection_score = 0
end
score + collection_score
end
adjust_score(100, 'easy') #=> 110
adjust_score(100, 'normal') #=> 100
adjust_score(100, 'hard') #=> 90
特に挙動としては何も問題はない。
このままでも動くため、このままでもいいと言われればそれまでだが、このコードにはもう少し改善の余地がある。
ifが式だと知っていればこう書ける
Rubyのifは文じゃない式だ。
つまり値を返すということだ。
これを知っていると先程の例題は以下のように書ける。
# 点数を調整する
# @param score [Integer] 点数
# @param mode [Integer] 難易度
# @return [Integer] 調整した点数
def adjust_score(score, mode)
collection_score =
if mode == 'easy'
10
elsif mode == 'hard'
-10
else
0
end
score + collection_score
end
adjust_score(100, 'easy') #=> 110
adjust_score(100, 'normal') #=> 100
adjust_score(100, 'hard') #=> 90
ifの中にあった3つのcollection_score
という記述を一つに集約できた。
この書き方にすることで、何が嬉しいのか考えてみると、
1. 変数名を変更するときに変更する箇所が少なくなる
2. ifの中で代入されているかどうかを意識する必要がなくなる
この2つが考えられると思う。
2に関しては今回の例題のようにifの中が多くなければ、それほど問題ではない。
しかし、ifの中が膨大な場合、代入されているのか、されていないのかを探し出すのは手間になるだろう。
まとめ
Rubyのifが式であることを知ることで、少しコードが綺麗になる例を紹介した。
Rubyを使っている人に少しでも参考になれば幸いだ。
それではまた。
TomoProg