2014-01-27 69 views
0

我解決了TestFirst.org問題09_timer的Ruby Rspec測試。我的代碼有效,但我不喜歡它。這是非常長的。任何意見和/或建議,以改善它將不勝感激。請包括解釋以澄清任何建議。目標是創建帶有@seconds實例變量並初始化爲0的Timer,然後以小時,分鐘,秒格式返回所有值作爲字符串:00:00:00。所以12秒=> 00:00:12; 66秒=> 00:01:06;和4000秒=> 01:06:40。 謝謝。下面的代碼。紅寶石Rspec定時器 - 重構解決方案

class Timer 

    attr_accessor :seconds 

    def initialize 
     @seconds = 0 
    end 

    def padded(n) 
     "0#{n}" 
    end 

    def time_string 
     hours = @seconds/3600 
     h_minutes = ((@seconds%3600)/60) 
     minutes = @seconds/60 
     m_seconds = @seconds%60 
     second = @seconds 
     seconds = "" 

     if @seconds < 60 
     if second < 10 
      second = padded(second) 
     end 
     seconds << "00:00:#{second}" 
     elsif @seconds > 3600 
     if hours < 10 
      hours = padded(hours) 
     end 
     if h_minutes < 10 
      h_minutes = padded(h_minutes) 
     end 
     if m_seconds < 10 
      m_seconds = padded(m_seconds) 
     end 
     seconds << "#{hours}:#{h_minutes}:#{m_seconds}" 
     else 
     if minutes < 10 
      minutes = padded(minutes) 
     end 
     if m_seconds < 10 
      m_seconds = padded(m_seconds) 
     end 
     seconds << "00:#{minutes}:#{m_seconds}" 
     end 
     @seconds = seconds  
    end 

end 

回答

4

有幾件小事可以做,以簡化您的班級和幾個大型組織變更。

1)使用String#rjust墊的數字:

def padded(n) 
    "#{n}".rjust(2, '0') 
end 

這使您可以把它應用到每一個數字,不管或者它是否已經有兩個數字。因此,您可以擺脫所有的單位數檢查(if h_minutes < 10等)。

2)擺脫從第一條if語句開始的所有事情,因爲沒有必要。前幾行,您有hours = @seconds/3600,h_minutes = ((@seconds%3600)/60)m_seconds = @seconds%60,這是您需要的唯一三個值。應用一個簡單的地圖(填充),並加入":"以獲得最終的字符串。

3)如果你想要一個面向對象的方法,每個小時/分/秒的變量可能是一個方法,所以你最終的東西更像是這樣的:

class Timer 
    attr_accessor :seconds 
    def initialize 
    @seconds = 0 
    end 

    def time_string 
    [hours, minutes, m_seconds].map(&method(:padded)).join(":") 
    end 

    def hours 
    seconds/3600 
    end 

    def minutes 
    (seconds % 3600)/60 
    end 

    def m_seconds 
    (seconds % 60) 
    end 

    def padded(n) 
    "#{n}".rjust(2, '0') 
    end 
end 
+0

非常感謝扎克。你可能在一個簡單的解決方案中提前幾個星期我的理解。我最大的擔憂之一是經常重複使用簡單的#rjust方法進行單一檢查。我從來沒有考慮過這個。而且我從來沒有以這種方式使用#map,但感謝你,我現在知道了Symbol#to_proc方法。大拇指向上。 – CoderZen

+0

好聽,jere.mac。 'rjust'是標準庫中很少出現的那些事情之一,但很好知道什麼時候需要它。當你越來越熟悉這門語言時,你會發現很多類似的東西。 –