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