知识卡片
运行时能力自省给鸭子类型补回一部分安全性
内容
鸭子类型放弃了编译期的接口检查,但可以用运行时自省能力补回一部分安全性:在真正调用某个方法之前,先问一句这个对象是否具备这个方法,如果没有就提前给出明确的错误提示或转而把请求代理给别的对象处理,而不是等到程序执行到那一句才因为找不到方法而崩溃。这种自省机制不是让鸭子类型变得和强类型一样严格,而是给了程序员一个折中的选项:在需要谨慎的地方主动检查能力,在其余地方保留鸭子类型的灵活性。
参考来源
- 位置:《架构之美》第14章《重读经典》14.2节《类型是隐式定义的》(源文件:程序之美系列套装(6册)团队之美、项目管理之美、架构之美、数据之美、测试之美、安全之美/_epub-src/OEBPS/Text/part0278.xhtml)
- 结论依据:原文明确"元编程对潜在类型是一种补充,我们能够检查特定的接口是否真正提供……Smalltalk提供了respondsTo方法……我们可以用它在运行时判断特定的消息接收者是否具有特定的选择器",以及doesNotUnderstand可用于代理未实现的调用。
- 原始内容:元编程对潜在类型是一种补充,我们能够检查特定的接口是否真正提供,我们有机会在没有提供特定的接口时作出反应。例如,将未实现的调用代理给我们已知实现了该调用的对象,或只是优雅地处理失败,避免程序崩溃……respondsTo:aSymbol……Answer whether the method dictionary of the receiver's class contains aSymbol as a message selector。