Ответ Даниэля правильный, но подумайте: почему библиотечный класс относится к классу модели? Код библиотеки не должен знать о реальных классах модели, хотя он может знать об интерфейсе, который они предоставляют.
Еще одно соображение: почему метод #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
.
person
Peeja
schedule
23.02.2011