2013-06-19 96 views
4

我正在編寫一些代碼,它最終變得太醜了,我不喜歡。無論如何,我可以重構它,以便我不使用嵌套if語句?Ruby:嵌套if語句

def hours_occupied(date) 
    #assuming date is a valid date object  
    availability = get_work_hours(date) 
    focus = "work" 

    if availability.nil 
    availability = get_family_hours(date) 
    focus = "family" 

    if availability.nil 
     availability = get_friend_hours(date) 
     focus = "friends" 
    end 
    end 
end 

我知道我能夠爲可用性

availability = get_work_hours(date) || get_family_hours(date) || get_friend_hours(date) 

做這樣的事情,但我怎麼設置相應的重點變量?

+3

我們可以假設您沒有顯示完整的方法嗎?否則分配那些未使用的變量是沒有意義的。如果是這種情況,請在方法底部添加「...」作爲佔位符。 – tokland

+1

@tokland:我發現自己完全無法理解他的代碼的主題和目的,這使我無法迴應。 –

回答

1

還有一個辦法就是,如果有必要重新分配值:

def hours_occupied(date) 
    availability, focus = get_work_hours(date), "work" 
    availability, focus = get_family_hours(date), "family" unless availability 
    availability, focus = get_friend_hours(date), "friend" unless availability 
end 

或使用迭代器:

def hours_occupied(date) 
    availability = focus = nil 
    %w(work family friend).each {|type| availability, focus = self.send(:"get_#{type}_hours", date), type unless availability} 
end 
5

,因爲它清楚地表明,每一種情況下是相互排斥的,我會做類似如下:

def hours_occupied(date) 
    if availability = get_work_hours(date) 
    focus = "work" 
    elsif availability = get_family_hours(date) 
    focus = "family" 
    elsif availability = get_friend_hours(date) 
    focus = "friends" 
    end 
end 
+2

Ruby條件是表達式,所以不需要重複'focus' 3次 – tokland

3

我會寫:

def hours_occupied(date) 
    focus = if (availability = get_work_hours(date)) 
    "work" 
    elsif (availability = get_family_hours(date)) 
    "family" 
    elsif (availability = get_friend_hours(date)) 
    "friends" 
    end 
    # I guess there is more code here that uses availability and focus. 
end 

但是,我不知道有不同不同類型的方法是一個好主意,它使代碼更難寫。一種不同的方法使用Enumerable#map_detect

focus, availability = [:work, :family, :friends].map_detect do |type| 
    availability = get_hours(date, type) 
    availability ? [type, availability] : nil 
end 
+0

我不喜歡在條件測試中看到任務。它太像C或Perl,給我做惡夢。非常感謝。 :-) –

+0

@theTinMan:不客氣:-)有些人會說,如果語言允許它(例如Python不),爲什麼要避免它?你不能告訴== = a =?但我不會:-)我喜歡這種構造,因爲它簡化了嵌套表達式較少的代碼。請注意,parens使其更加醒目。 – tokland

1

一個情況下也是一種選擇:

focus = case availability 
when get_work_hours(date) 
    "work" 
when get_family_hours(date) 
    "family" 
when get_friend_hours(date) 
    "friends" 
end 
+0

要麼這是錯誤的或'case'工作不同於我想:-) – tokland

+0

@Tokland虛擬數據示例[此處](http://ideone.com/70t9oY) – steenslag

+1

但「可用性」必須保持第一個非零方法調用的* result *,事先不知道。 – tokland