コードレビュー
年月日を入力するコードを書いた。
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)
↑上記のようにしたほうがコードもすっきりして読みやすい。