コードレビュー

年月日を入力するコードを書いた。

def get_int(prompt, min, max)
  i = read_integer(prompt)
    if i >= min && i <= max
    return i
  else
    puts("その数字は入力できません。もう一度入力してください。")
    i = get_int(prompt,min, max)
  end
end

y = get_int("誕生年は?", 1970, 2030)
m = get_int("誕生月は?", 1, 12)
d = get_int("誕生日は?", 1, 31)
if (m == 2 && d > 28)
  unless (y %4 == 0 && (y % 100 != 0 || y % 400 == 0))
    puts("その日付は存在しません")
    exit
  end
elsif(m == 4 || m == 6 || m == 9 || m == 11)
  if (d > 31)
    puts("その日付は存在しません")
    exit
  end
end
birthday = Time.local(y, m, d)

このコード、2月30日と入力するとTimeクラスによって3月2日のオブジェクトができます。これを28日またはうるう年の29日までを入力できるよう書きなおしていきます。

まずは、書き方
y m dを入力してからdが実際に存在する日付かどうか判定します。これは入力者から見たら日付を入力する前に上限値が決まっていてほしいものです。なので、y mが決まってから日付の上限値を決める関数を書くべき。

DAYS30 = [4,6,9,11]
DAYS31 = [1,3,5,7,8,10,12]

def determine_max(y, m)
  if DAYS31.include?(m)
    max = 31
  elsif DAYS30.include?(m)
    max = 30
  elsif m == 2
    if (y %4 == 0 && (y % 100 != 0 || y % 400 == 0))
      max = 29
    else
      max = 28
    end
  end
end

y = get_int("誕生年は?", 1970, 2030)
m = get_int("誕生月は?", 1, 12)
max = determine_max(y,m)
d = get_int("誕生日は?", 1, max)
birthday = Time.local(y, m, d)

↑上記のようにしたほうがコードもすっきりして読みやすい。