Daniel的答案是正確的,但請考慮:爲什麼庫類引用模型類?庫代碼不應該知道實際的模型類,儘管它可能知道它們提供的接口。
另一個考慮:爲什麼#schedule
方法要求模型的類?如果一個新的模型類Spaceship
想與#schedule
一起工作,那麼#schedule
將不得不改變以與它一起工作。這沒有必要。
相反,Aircraft
對象與其他類的對象被#schedule
對待的方式有什麼不同?你能否將這種差異提取到它自己的方法中?然後你可以將這些實現移到每個模型類中,並決定多態使用哪一個,而不是分支。
例如,曾經被認爲是:
def schedule(action, vehicle)
if vehicle.is_an?(Aircraft)
possible_days = case action
when "travel"
["Mon", "Wed", "Fri"]
when "repair"
["Sat", "Sun"]
end
possible_days.rand
elsif vehicle.is_a?(Spaceship)
possible_days = case action
when "travel"
["Sat", "Tue", "Thu"]
when "repair"
["Sun", "Mon"]
end
possible_days.rand
end
end
將成爲:
def schedule(action, vehicle)
vehicle.days_action_can_be_performed(action).rand
end
class Aircraft
def days_action_can_be_performed(action)
possible_days = case action
when "travel"
["Mon", "Wed", "Fri"]
when "repair"
["Sat", "Sun"]
end
possible_days
end
end
class Spaceship
def days_action_can_be_performed(action)
possible_days = case action
when "travel"
["Sat", "Tue", "Thu"]
when "repair"
["Sun", "Mon"]
end
possible_days
end
end
當添加一個新的類,它只是需要實現#days_action_can_be_performed
,它會與#schedule
工作。
啊,非常感謝!你指出了正確的方向:它在瀏覽器中運行得非常好。我沒有嘗試它,因爲我在做TDD:它在RSpec中斷。我會修改這個問題。 – 2008-11-29 13:37:50