2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Ruby】ifが式であることを知るともう少しコードが綺麗になるかもしれないという話

Posted at

はじめに

Rubyのifがであることを知ることで、もう少しコードを綺麗に書けることを知った。
もし、下記の例題のようなRubyのコードを書いていれば、もう少しコードを綺麗にできるかもしれない。

それでは、はじめよう。

例題

下記のような点数と難易度を渡すと難易度に応じて調整された点数が返ってくるメソッドがあるとしよう。

example.rb
# 点数を調整する
# @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は文じゃないだ。
つまり値を返すということだ。
これを知っていると先程の例題は以下のように書ける。

example.rb
# 点数を調整する
# @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

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?