分析代码质量的一个重要指标是 bug rate。意思是每千行纯代码中,包含的 bug 平均数量。
下面是 JDK 两个版本的 bug rate:
package | jdk1.4.2 bug count | jdk5.0 bug count | jdk1.4.2 code line count | jdk5.0 code line count | jdk1.4.2 bug/(k lines) | jdk5.0 bug/(k lines) |
java.awt, awt+2D+drag&drop | 37 | 48 | 55908 | 57902 | 1.36 | 2.04 |
javax.swing, com.sun.java.swing | 34 | 142 | 191836 | 187084 | 0.18 | 0.76 |
java.net | 17 | 14 | 8892 | 9590 | 1.91 | 1.46 |
javax.sound | 11 | 21 | 3011 | 3433 | 3.65 | 6.12 |
java.util | 10 | 16 | 24148 | 40109 | 0.41 | 0.40 |
java.nio | 9 | 13 | 11139 | 11300 | 0.81 | 1.15 |
java.lang | 6 | 29 | 11955 | 16778 | 0.50 | 1.73 |
java.io | 2 | 11 | 10088 | 10728 | 0.20 | 1.03 |
java.beans | 1 | 13 | 6489 | 7024 | 0.15 | 1.85 |
java.math | 1 | 2 | 2859 | 3950 | 0.35 | 0.51 |
java.security,javax.security | 1 | 3 | 12480 | 14804 | 0.08 | 0.20 |
java.text | 1 | 3 | 11830 | 9254 | 0.08 | 0.32 |
javax.imageio | 1 | 6 | 7912 | 8271 | 0.13 | 0.73 |
javax.xml | 1 | 7 | 1326 | 3692 | 0.75 | 1.90 |
我们可以看出,总体来说,JDK 5.0 的 bug rate 统计数据比 JDK 1.4.2 难看。 可能是改动太大的缘故。
总体来说,JDK 里面的代码质量比较优秀。一般国内的项目,bug rate 在 10 以下已经是很好的了。这里谈的 bug rate 是指排出 PM 捣浆糊把小 bug 说成不是 bug 的因素,因为在那种情况下,谈什么 bug rate 没有意义。
国内缺乏足够的权威数据,来比较 bug rate。我们拿国外的数据吧。(http://en.lupaworld.com/index.php?option=com_content&task=view&id=194&Itemid=35)
Linux 内核的 bug rate 是 0.17 个 bug 每千行。对应的数据,普通商业应用的 bug 则在 20 个 bug 每千行。
从代码行上看,JDK 中几个大的 package 是 AWT, Swing, net, util, io, nio, lang, text. 在这几个大 package 中,AWT , lang, beans 比较高。
AWT bug 多是一个历史性问题,来源于其设计不够好。 Swing 如果完全抛开 AWT,则值得大家放心去用。目前的 Swing 组建基本上都是建立在 AWT 之上,比如作为 Swing 基础的 JComponent 就是继承自 AWT 的 Container 类。我们期待 Sun 在未来某个版本的 JDK 中将 Swing 与 AWT 彻底分开。
总体来说,如果用 Java 写客户端 GUI 程序,则选择 Swing 代替选择 AWT 成了必然。
lang 包涉及到比较底层的东西了。好在很多东西一般人也不大会去用,有点 bug 没有太大影响。lang 包主要涉及直接调用操作系统 API 的一些函数、Java 语法最基本的一些类信息、反射机制。这一块代码写起来确实有难度。bug 多一点也可以理解。
beans 包涉及到 Java bean。 以前用过 JBuilder 的时候,它可以帮助生成 Java 类和其对应的 BeanInfo。 其他 IDE 对这些支持的并不多。 Java bean 主要用于 IDE 在图形界面下设置属性,自动生成一些代码。Java 本身的语法中,缺乏对“属性”的支持,这也是众多 C# fans 津津乐道的。
根据我的经验,beans 包实用价值不大。以前见过很多 Java 程序员写一些 PropertyEditor , 现在少了,也是一阵风。
io 包和 nio 包都很不错。
综合来看,我觉得 JDK 代码质量还是很不错的。一般来说,我们采用开源的现成代码或者组件的时候,如果其代码质量达到或者超过我们自己的代码质量,则我们可以放心采用。我觉得大多数 JDK 类库都可以放心地使用。大家不用担心。