動的型チェック
2009年6月2日
最近、私たちの開発者の一部は、rubyのような動的言語を使用すると、非常に多くの動的型チェックを使用するため、最終的には独自に型システムを記述することになるという非難を受けました。そこで、私たちは多くの実際のrubyコードを執筆してきたので、どれくらいの頻度で動的型チェックを行っているのかと考えました。Michael Schubertがデータを収集しました。
下の表にデータを示します。動的型チェックとは、メソッド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的な状況で発生します。