動態類型檢查
2009 年 6 月 2 日
最近,我們的一些開發人員遇到指控,指稱使用像 ruby 這樣的動態語言,你會使用如此多的動態類型檢查,以至於你最終會有效地撰寫自己的類型系統。因此他們想,既然我們已經撰寫了許多真正的 ruby 程式碼,我們有多常進行動態類型檢查?Michael Schubert 蒐集了資料。
下表包含資料。我們將動態類型檢查定義為使用下列方法:is_a?
、kind_of?
和 instance_of?
。程式碼行來自 rails 中的標準 rake 統計指令。
專案 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 程式碼庫中看到許多類型檢查呼叫。當然,這適用於任何動態語言。在我待過的小型談話圈中,這通常被認為是不良的形式。
此資料中檢查的方法並非唯一可被視為動態類型檢查的方法。其他情況包括 respond_to?
和 aClass === anInstance
。我們的團隊認為,這些情況並不少見於他們檢查的情況。
大多數使用情況都是處理自由輸入,例如方法參數可以是字串、符號或陣列。這些情況出現在 DSL 類似的情況中,你希望自由輸入以提高可讀性。