为了证明代码重复对软件质量的影响,我对一些真实软件中的代码进行了分析。
分析的工具为PMD。PMD是开源软件,主要功能是对Java进行静态分析以找出bug。它的一个功能是CPD(Copy/Paste Detector),也就是找出重复代码,也部分支持C语言。以下是我对一些C语言程序进行分析的结果。由于CPD工具本身的限制,不能很完美的找出C语言中的全部重复,例如对于常量的改动无法识别。因此代码中实际的重复应该比下表中的值要大一些。不过相信做为相对值还是有意义的。
Source Code | NLOC | LOCdup60 | LOCduP30 | RATE60 | RATE30 |
SW1(Too many bugs found) | 44325 | 9314 | 26504 | 21% | 60% |
SW2(Too many bugs found) | 39164 | 7264 | 19010 | 19% | 49% |
SW3(Too many bugs found) | 109807 | 18903 | 49264 | 17% | 45% |
SW4(Many bugs found) | 20050 | 2881 | 6910 | 14% | 34% |
SW5(A few bugs found) | 12471 | 270 | 2141 | 2% | 17% |
Python1.5(Core) | 19418 | 1072 | 3023 | 6% | 16% |
Python2.5(Core) | 35797 | 1656 | 6441 | 5% | 18% |
Python3.0(Core) | 40737 | 3460 | 9076 | 8% | 22% |
Apache(server) | 18693 | 1114 | 2553 | 6% | 14% |
NLOC:净代码行数。
LOCdup60/30:超过60/30个token重复的代码行数。
RATE60/30:重复代码占总代码的比例。
其中的SW1~SW5是来源于同一个产品的5个不同模块(其中SW5的bugs found数目还有待收集)。通过比较可以看出,无论是RATE60还是RATE30都和代码中BUG的数量有一定的相关性。代码重复得越多就越容易产生BUG。当然,BUG的产生可能有很多原因,代码重复只是众多的原因之一,但它显然是很重要的原因。代码的过度重复往往意味着缺少谨慎的设计和及时的重构,这种代码往往是在匆忙之中或压力之下产生的,也可能是写代码的人不够投入。维护过度重复的代码难度很高,而且再次引入新BUG的风险会高到超出100%(这是真的,平均每改一个错误,引入两个错误)。
我同时也对一些流行的开源软件进行了同样的统计。Python和Apache都是相当流行的开源软件,它们的成功必然依赖于其较高的可维护性。这里我只分析了他们的一部分核心代码,一方面是为了方便,另一方面也是为了和前面的软件模块的大小有可比性。可以很容易的看出,Python和Apache的代码重复是相对很低的。
其中Python1.5、Python2.5和我取的Apache源码都是久经考验的成熟版本,他们的RATE60都在6%左右,RATE30也只有16%左右。Python3.0最近才刚刚发布,代码是原来的114%,重复代码却是原来的209%!(这里忽略了Python的另一个主要版本2.6,因为2.6也是刚发布不久,而且主要目的是为了向3.0过渡)可见,Python3.0的质量让人有点小小的担心啊。
没有评论:
发表评论