Rubyで閏年判定のアルゴリズムを書きました。
命名やクラス化、アルゴリズムの観点から良いコードか悪いコードか採点して欲しいです。
ruby
1class Leap 2 def checkYear?(n) 3 if n%400 == 0 4 return true 5 end 6 7 if n%4 == 0 && n%100 == 0 8 return false 9 end 10 11 if n%4 == 0 12 return true 13 end 14 15 return false 16 end 17end 18 19leap = Leap.new 20p "閏年" if leap.checkYear?(gets.to_i)
また、自分だったらこういう風に書くというのを教えていただきたいです。できればアドバイス等も頂きたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
私が書く場合を示します。
(でも、そもそも うるう年判定なら、ruby にすでにメソッドがあるので、自分では書くことは無いとおもいますが)
leap.rb
ruby
1require 'date' 2 3class Leap 4 def self.check?(year) 5 (year % 400 == 0) || (year % 100 != 0 && year % 4 == 0) 6 end 7end 8 9TESTS = { 10 1998 => false, 11 1999 => false, 12 2000 => true, 13 2001 => false, 14 2004 => true, 15 2008 => true, 16 2100 => false 17}.freeze 18 19TESTS.each do |year, result| 20 actual = Leap.check?(year) 21 puts "ERROR: #{year} -> #{actual}" if actual != result 22end 23 24 # ruby の Date クラスのうるう年判定メソッドと比較する 25(1900..2400).each do |year| 26 result = Leap.check?(year) 27 result2 = Date.leap?(year) 28 puts "ERROR: #{year} Date.leap?() != Leap.check?()" if result != result2 29end
変更したのは次の点です。
- メソッド名を変更しました。
--> まずは checkYear? でなく check_year? に変更しましたが、さらに check? にしました。
(本当は、クラス名も変えて、それに合わせてメソッドもさらに別のものに変えたいところですが ...)
2. インスタンスに依存した処理ではないので、クラス・メソッドにしました。
3. 判定を 条件文1つにまとめました。
4. キー入力して試すのでなく、プログラム内部で主な年について試すようにしました。
(ここではさらに、ruby の Data.leap? との動作チェックもしてみました)
参考情報:
- Rubyで『ある年のある月の日数を求めるメソッド』を作成したのですが... https://teratail.com/questions/20280
- Rubyで閏年問題プログラムを作ってみようと思い書いてみました https://teratail.com/questions/3646
- http://codereview.stackexchange.com/questions/23902/
投稿2016/03/12 11:29
総合スコア22324
0
アルゴリズムの観点からと言うことなので、その観点だけでコメントします。
約3/4のケースは閏年で無いので、そのケースを最初に判定すべき。
まあ、このケースだと微々たる差ですが、一般論としては、少数ケースの中の場合分けにコストが掛かる場合は効いてきます。
Ruby
1def checkYear?(n) 2 if n%4 != 0 3 return false 4 end 5 6 if n%400 == 0 7 return true 8 end 9 10 if n%100 == 0 11 return false 12 end 13 14 return true 15end
投稿2016/03/12 11:11
総合スコア84551
0
Q1. クラスに入れてある理由を説明してください。
(単純な関数ではダメですか?)
Q2. 400で割り切れる数は、100でも4でも割り切れますよね?
(無駄な判定がある)
Q3. 2001年を引数にした場合の結果は何ですか?
(漏れがある)
Ruby
1def isLeapYear(year) 2 if year%400 == 0 3 return true 4 end 5 6 if year%100 == 0 7 return false 8 end 9 10 if year%4 == 0 11 return true 12 end 13 14 return false 15end
投稿2016/03/12 09:35
編集2016/03/12 09:50総合スコア1720
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/03/12 09:41
2016/03/12 09:48
退会済みユーザー
2016/03/12 10:08
2016/03/12 12:23
退会済みユーザー
2016/03/12 13:27
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/12 11:33