深入理解鸭子类型:从代码实践到类型恐惧克服
1. 多态与鸭子类型概述
多态意味着一个消息可以有多种形式,接收者会提供其特定版本的行为。实现多态有多种方式,鸭子类型便是其中之一。多态方法遵循一种隐式约定,从消息发送者的角度来看,实现多态方法的对象可以相互替换,发送者无需知晓或关心这种替换。不过,这种可替换性并非自然实现,使用多态时,需确保所有对象行为良好。
2. 编写依赖鸭子类型的代码
使用鸭子类型依赖于识别应用中跨类接口能带来益处的地方。实现鸭子类型相对容易,但关键在于发现需求并抽象其接口。
2.1 识别隐藏的鸭子类型
许多时候,未被认可的鸭子类型已隐藏在现有代码中。以下几种常见编码模式表明可能存在隐藏的鸭子类型:
- 按类进行的 case 语句 :最常见且明显的模式是根据应用领域对象的类名进行切换的 case 语句。例如:
class Trip
def prepare(preparers)
preparers.each {|preparer|
case preparer
when Mechanic
preparer.prepare_bicycles(bicycles)
when TripCoordinator
preparer.buy_food(customers)
when Driver
preparer.gas_up(vehicle)
preparer.fill_water_tan