在 Sandi Metz的实用的面向对象设计 中,她解释了 - 完美 - 上例中的问题:
class Trip
attr_reader :bicycles, :customers, :vehicle
def prepare(preparers)
preparers.each { |preparer|
case preparer
when Mechanic
# ...
when TripCoordinator
# ...
when Driver
# ...
end
}
end
end
class Mechanic
# ...
end
class TripCoordinator
# ...
end
class Driver
# ...
end
然而; preparers
参数是动态的,它是否被视为缺点,在这种情况下,是从静态类型检查语言的角度来看?
答案 0 :(得分:1)
什么是优势,什么是劣势取决于每个程序员和手头的任务。
动态类型带来的灵活性在某些情况下非常强大,而在其他情况下则非常糟糕。例如,C#允许一切(参见动态类型)本身没有任何优势或劣势。
您在示例中描述的内容称为委托模式,并已成功覆盖并集成到ruby中(我的观点)。您有关于该主题的bunch文档。
您的示例的主要缺点是,在添加/删除Preparer类型时,您需要编辑一个开关。它没有您对动态代码所期望的灵活性。看一下委托模式,注入和界面,你可以很好地编写维持自身的动态代码。
答案 1 :(得分:0)
检查此代码
class Trip
attr_reader :bicycles, :customers, :vehicle
def prepare(preparers)
preparers.each { |preparer|
case preparer.class.name
when Mechanic
# ...
when TripCoordinator
# ...
when Driver
# ...
end
}
end
end
class Mechanic
# ...
end
class TripCoordinator
# ...
end
class Driver
# ...
end
此处案例preparer.class.name
返回类名