度量标准面向对象的编程

时间:2008-10-09 20:27:32

标签: oop metrics

我想知道是否有人经常使用指标来验证其代码/设计。 例如,我想我会用:

  • 每种方法的行数(< 20)
  • 每种方法的变量数量(< 7)
  • 每种方法的参数数量(< 8)
  • 每班的方法数量(< 20)
  • 每班的字段数(< 20)
  • 继承树深度(< 6)。
  • 方法缺乏凝聚力

这些指标大多非常简单。

你对这种情况的政策是什么?你是否使用工具来检查它们(例如NDepend)?

7 个答案:

答案 0 :(得分:4)

在我看来,对这些值施加数值限制(因为你似乎暗示数字)是不太好的主意。如果存在重要的switch语句,则方法中的行数可能非常大,但该方法仍然简单且正确。如果字段很简单,则类中的字段数可以适当地非常大。有时,五个级别的继承可能太多了。

我认为分析类内聚(越多越好)和耦合(越少越好)越好,但即使这样,我也怀疑这些指标的效用。经验通常是一个更好的指导(尽管如此,这是昂贵的)。

答案 1 :(得分:4)

我在列表中没有看到的指标是McCabe的Cyclomatic Complexity。它测量给定函数的复杂性,并与bugginess相关。例如。函数的高复杂性分数表明:1)可能是一个有缺陷的函数; 2)可能难以正确修复(例如修复将引入他们的自己的错误。)

最终,指标最好用于总体水平 - 就像控制图一样。您查找控制限制之上和之下的点以识别可能的特殊情况,然后查看详细信息。例如,具有高圈复杂度的函数可能会让您查看它,只是发现它是合适的,因为它是一个包含大量案例的调度程序方法。

答案 2 :(得分:2)

指标管理不适用于人员或代码;没有指标或绝对值将始终有效。请不要让对指标的迷恋分散真正评估代码质量的注意力。度量标准似乎可以告诉您关于代码的重要信息,但他们能做的最好的事情就是暗示需要调查的领域。

这并不是说指标没用。度量标准在更改时最有用,以查找可能以意外方式更改的区域。例如,如果你突然从3个继承级别变为15个,或者每个方法4个parms到12个,请深入挖掘并找出原因。

示例:更新数据库表的存储过程可能包含与表有列一样多的参数;此过程的对象接口可以具有相同的,或者如果存在表示数据实体的对象,则它可以具有一个。但是数据实体的构造函数可能具有所有这些参数。那么这个指标会告诉你什么呢?不多!如果你在代码库中有足够的情况,那么目标平均值就会被吹走。

所以不要依赖指标作为任何事情的绝对指标;阅读/审查代码是无可替代的。

答案 3 :(得分:1)

就我个人而言,我认为很难坚持这些类型的要求(即有时你真的需要一个超过20行的方法),但根据你的问题的精神,我会提到一些指导原则。文章称为 Object Calisthenics Thoughtworks Anthology的一部分,如果你有兴趣的话)。

  • 每种方法的缩进级别(< 2)
  • 每行的'点数'(< 2)
  • 每个班级的行数(< 50)
  • 每个包的类数(< 10)
  • 每个类的实例差异数(< 3)

他还提倡不使用'else'关键字,也不提供任何吸气剂或制定者,但我认为这有点过分。

答案 4 :(得分:0)

对于我来说,OO Metrics对我来说是一个宠物项目(这是我的硕士论文的主题)。所以,是的,我正在使用这些,我使用自己的工具。

多年来,Mark Lorenz撰写的“面向对象的软件度量标准”一书是面向对象指标的最佳资源。但最近我看到了更多的资源。

不幸的是,我还有其他截止日期,因此没有时间处理该工具。但最终我将添加新的指标(和新的语言结构)。

<强>更新 我们现在使用该工具来检测源中可能存在的问题。我们添加了几个指标(并非所有纯OO):

  • 使用assert
  • 使用魔法常数
  • 与方法的强制性相关的评论的使用
  • 语句嵌套级别
  • 类依赖
  • 班级中的公共字段数量
  • 重写方法的相对数量
  • 使用goto语句

还有更多。我们保留那些能够很好地反映代码中疼痛点的图像。如果这些问题得到纠正,我们会有直接反馈。

答案 5 :(得分:0)

硬编号不适用于所有解决方案。有些解决方案比其他方案更复杂。我将从这些作为您的指导方针开始,并查看您的项目最终的位置。

但是,关于这些数字,这些数字似乎相当高。我通常会发现我通常拥有的特定编码风格:

  • 每种方法不超过3个参数
  • 每个方法约5-10行的签名
  • 不超过3级继承

这并不是说我永远不会忽略这些普遍性,但我通常会考虑更多关于代码的事情,因为大部分时间我都可以解决问题。

答案 6 :(得分:0)

正如其他人所说,坚持严格的标准将是艰难的。我认为这些指标最有价值的用途之一就是观察它们随着应用程序的发展而变化的方式。这有助于让您了解在添加功能时如何完成必要的重构工作,并有助于防止造成大混乱:)