丹尼尔的回答是正确的,但考虑一下:为什么库类指的是模型类?库代码不应该知道实际的模型类,尽管它可能知道它们提供的接口。
另一个考虑:为什么该#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
.