Ответ Даниэля верен, но подумайте: почему класс библиотеки относится к классу модели? Библиотечный код не должен знать о реальных классах моделей, хотя он может знать об интерфейсе, который они предоставляют.
Еще одно соображение: почему метод #schedule
запрашивает класс модели? Если бы новый класс модели Spaceship
хотел работать с #schedule
, то #schedule
пришлось бы изменить, чтобы работать с ним. Это не обязательно.
Вместо этого, чем отличается способ обработки #schedule
объекта Aircraft
и объектов других классов? Можете ли вы извлечь эту разницу в собственный метод? Затем вы можете переместить эти реализации в каждый из классов модели и решить, какая из них используется полиморфизмом, а не ветвлением.
Например, что было:
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
.