2009年2月5日星期四

对DRY原则的补充






为了证明代码重复对软件质量的影响,我对一些真实软件中的代码进行了分析。

分析的工具为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的质量让人有点小小的担心啊。





没有评论:

发表评论