ダニエルの答えは正しいですが、考えてみてください: ライブラリ クラスがモデル クラスを参照しているのはなぜですか? ライブラリ コードは、提供するインターフェイスについては知っているかもしれませんが、実際のモデル クラスについて知っているべきではありません。
#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
ます。