动态类型检查

2009年6月2日

最近,我们的一些开发人员遇到了这样的指责:使用像 ruby 这样的动态语言,你使用了太多动态类型检查,最终实际上编写了自己的类型系统。所以他们想,既然我们已经编写了很多真实的 ruby 代码,那么我们到底做了多少动态类型检查?迈克尔·舒伯特收集了数据。

下表包含数据。我们将动态类型检查定义为使用 is_a?kind_of?instance_of? 方法。代码行来自 rails 中的标准 rake stats 命令。

项目 ID代码类型检查代码 LOC测试类型检查测试 LOCLOC / 类型检查测试 LOC / 代码 LOC
A16133180985614480.7
B141913801712325900.9
C02607029811.1
D74265340698331.0
E3229619609768813843.3
F18~9500N/AN/A528N/A
G02455032901.3
H92220664045752.9
I23106332123319191.2
J1964046124885115862.2
K175769698486791.7

这些数据的寓意是,你不应该期望在你的 ruby 代码库中看到很多类型检查调用。当然,对于任何动态语言来说,这都是事实。在我所处的 Smalltalk 圈子里,这通常被认为是一种不好的形式。

在本数据中检查的方法并不是唯一可以被视为动态类型检查的方法。其他情况包括 respond_to?aClass === anInstance。我们的人认为,这些情况并不比他们检查的情况更常见。

大多数使用情况是处理灵活的输入,例如,方法参数可以是字符串、符号或数组。这些情况出现在 DSL 式的场景中,你希望输入灵活,以提高可读性。