动态类型检查
2009年6月2日
最近,我们的一些开发人员遇到了这样的指责:使用像 ruby 这样的动态语言,你使用了太多动态类型检查,最终实际上编写了自己的类型系统。所以他们想,既然我们已经编写了很多真实的 ruby 代码,那么我们到底做了多少动态类型检查?迈克尔·舒伯特收集了数据。
下表包含数据。我们将动态类型检查定义为使用 is_a?
、kind_of?
和 instance_of?
方法。代码行来自 rails 中的标准 rake stats 命令。
项目 ID | 代码类型检查 | 代码 LOC | 测试类型检查 | 测试 LOC | LOC / 类型检查 | 测试 LOC / 代码 LOC |
---|---|---|---|---|---|---|
A | 16 | 13318 | 0 | 9856 | 1448 | 0.7 |
B | 14 | 19138 | 0 | 17123 | 2590 | 0.9 |
C | 0 | 2607 | 0 | 2981 | ∞ | 1.1 |
D | 7 | 4265 | 3 | 4069 | 833 | 1.0 |
E | 32 | 29619 | 60 | 97688 | 1384 | 3.3 |
F | 18 | ~9500 | N/A | N/A | 528 | N/A |
G | 0 | 2455 | 0 | 3290 | ∞ | 1.3 |
H | 9 | 2220 | 6 | 6404 | 575 | 2.9 |
I | 23 | 10633 | 2 | 12331 | 919 | 1.2 |
J | 196 | 40461 | 24 | 88511 | 586 | 2.2 |
K | 17 | 5769 | 6 | 9848 | 679 | 1.7 |
这些数据的寓意是,你不应该期望在你的 ruby 代码库中看到很多类型检查调用。当然,对于任何动态语言来说,这都是事实。在我所处的 Smalltalk 圈子里,这通常被认为是一种不好的形式。
在本数据中检查的方法并不是唯一可以被视为动态类型检查的方法。其他情况包括 respond_to?
和 aClass === anInstance
。我们的人认为,这些情况并不比他们检查的情况更常见。
大多数使用情况是处理灵活的输入,例如,方法参数可以是字符串、符号或数组。这些情况出现在 DSL 式的场景中,你希望输入灵活,以提高可读性。