【Ruby】メソッドを機能別に分解することのメリットとは

今日は本日の朝活で考えたことについて書こうと思います☕️

練習問題

ECサイトのポイント付与サービスを考える問題。

1000円以上でポイント還元率が変化(3%→5%)し、お誕生日の場合はポイントが5倍になるというプログラム。
お誕生日の場合はtrue, そうでない場合はfalseを指定してメソッドを呼び出す。
全てのポイントの計算が終わったら、小数点以下は切り捨てる。

私の考え

ここで私は

① ポイント還元率の条件式メソッド
② ①を利用してお誕生日かどうかで最終的なポイントを計算するメソッド

この2つが必要と考えました。

上記を踏まえて、
商品が10,000円で、お誕生日ではなかった場合の実装をしてみました。

def point_return_rate(amount)
  if amount <= 999
    point = amount * 0.03
  else
    point = amount * 0.05
  end
  return point 
end

def calculate_points(amount, is_birthday)
  if is_birthday
    puts "ポイントは#{(point_return_rate(amount) * 5).floor}点です"
  else
    puts "ポイントは#{(point_return_rate(amount)).floor}点です"
  end
end

# 呼び出し例
calculate_points(10000, false)

まず、「999円以下の場合は、商品のお値段に対して3%、1000円以上は5%のポイントが付与されるよ〜」という「ポイント還元率メソッド(point_return_rate)」を定義しました。
ここでは1,000円以上という部分をelseでまとめてます。
メソッドの命名がちょっと分かりにくいのも気になりますが、一旦このまま書きます。
※一瞬、ここをamount <= 999と1000 < amountと分岐しようとしてしまい、ハッとなりました・・・!

この問題では、「最終的に何ポイント獲得できるか」を出力したいので、
先ほど定義したポイント「ポイント還元率メソッド(point_return_rate)」を、「お誕生日かどうか判定して計算するメソッド(calculate_points)」に埋め込みました。

しかし、この問題の模範回答では
calculate_pointsというメソッド内に、私が思っていた①②の条件式を2つ入れて実装していました。

def calculate_points(amount, is_birthday)
  if amount <= 999
    point = amount * 0.03
  else
    point = amount * 0.05
  end
  if is_birthday
    point = point * 5
  end
  puts "ポイントは#{point.floor}点です"
end

とてもシンプル!
でも私が実装したプログラムもちゃんと動くし、頑張って考えて実装したからメリット1つでも見つけてあげたい...

と思い、メソッドを機能別に分解することのメリットを考えてみることにしました。

メソッドを機能別に分解することのメリット

今回の問題で考えてみた場合、
お誕生日だけではなく、別の条件でもポイントをサービスしたい!みたいなのがどんどん思いついた時に、
「ポイント還元率メソッド(point_return_rate)」をいろんな所で使いまわせるのかなあと思いました。
また、定義しておけば「これなんだ?」って思った際に、定義されたメソッドのところに戻れば中身を確認しやすいのかなとも思いました。

素人が絞り出したメリットなので、考え方として当っているかは分かりません...
色々な人から意見をいただけたら嬉しいです!

おまけ

今週はじめにお子がRS肺炎で入院。
日中は面会(夜間付き添い不可)、仕事で日中の面会が厳しい時は仕事の前後で面会。
朝活と面会後体力があれば夜に学習を進めておりました。
学習できて2時間/日くらい?(お子が心配すぎてあんまり頭が働いてませんでしたが...)

そんな不安たっぷりな1週間でしたが明日退院が決まり安心👏
辛い入院生活と治療を耐えたお子、よく頑張った!
母も学習頑張ろう!と思いました。