每当我听到尝试将某种基于代码的度量标准与软件缺陷相关联时,我想到的第一件事就是McCabe的圈复杂度。各种研究发现,高圈复杂度与缺陷数量之间存在相关性。但是,其他研究以相似的大小(在代码行方面)查看模块的研究发现,可能没有相关性。
对我来说,模块中的线数和圈复杂性都可以作为可能存在缺陷的良好指示,或者如果对模块进行了修改,则注入缺陷的可能性更大。具有较高的循环复杂性的模块(尤其是在类或方法级别的模块)更难理解,因为代码中存在大量独立的路径。包含大量行的模块(同样,尤其是在类或方法级别)也很难理解,因为行的增加意味着发生了更多的事情。有许多静态分析工具支持针对指定规则和循环复杂性来计算代码的源代码行,似乎捕获它们将是一件容易的事。
在霍尔斯特德复杂性的措施也可能是有趣的。不幸的是,它们的有效性似乎有些争议,因此我不必依赖它们。Halstead的一种测量方法是根据工作量或工作量(程序长度(以总操作符和操作数计)与程序词汇量(以不同的操作符和运算符计)之间的关系)进行估计。
还有一组称为CK度量的度量。该度量标准套件的第一个定义似乎出现在Chidamber和Kemerer撰写的题为面向对象设计的度量套件中。他们定义了每个类的加权方法,继承树的深度,子代数,对象类之间的耦合,类的响应以及方法中缺乏内聚性。他们的论文提供了计算方法以及如何分析每种方法的描述。
就分析这些指标的学术文献而言,您可能对由Ramanath Subramanyam和MS Krishna撰写的CK指标的经验分析对面向对象的设计复杂性:对软件缺陷的影响感兴趣。他们分析了六个CK指标中的三个(每个类的加权方法,对象分类之间的耦合以及继承树的深度)。仔细阅读本文,似乎他们发现这些是潜在有效的度量标准,但必须谨慎解释,因为“改进”一个度量标准可能会导致其他变化,从而也增加了出现缺陷的可能性。
周玉明和梁海峰合着的用于预测高低故障的面向对象设计指标的实证分析也检验了CK指标。他们的方法是确定是否可以根据这些指标预测缺陷。他们发现,除了继承树的深度和子代数之外,许多CK指标在预测可能存在缺陷的区域中具有一定的统计意义。
如果您拥有IEEE会员资格,我建议您在IEEE Transactions on Software Engineering上搜索更多的学术出版物,并在IEEE Software中搜索更多的真实世界和应用报告。ACM的数字图书馆中也可能有相关出版物。