Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 量度及;面向对象编程_Oop_Metrics - Fatal编程技术网

Oop 量度及;面向对象编程

Oop 量度及;面向对象编程,oop,metrics,Oop,Metrics,我想知道是否有人经常使用度量来验证其代码/设计。 例如,我想我将使用: 每个方法的行数(

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

  • 每个方法的行数(<20)
  • 每个方法的变量数(<7)
  • 每种方法的参数数量(<8)
  • 每个类的方法数(<20)
  • 每个类的字段数(<20)
  • 继承树深度(<6)
  • 方法缺乏连贯性
其中大多数指标都非常简单


你对这种测量的政策是什么?你是否使用工具来检查他们的(例如独立性)?

OO指标对我来说有点像宠物项目(这是我硕士论文的主题)。所以,是的,我正在使用这些,我使用我自己的工具

多年来,MarkLorenz的《面向对象软件度量》一书一直是OO度量的最佳资源。但最近我看到了更多的资源

不幸的是,我还有其他的截止日期,所以没有时间使用这个工具。但最终我将添加新的度量(和新的语言结构)

更新 我们现在正在使用该工具来检测源代码中可能存在的问题。我们添加了几个指标(不全是纯OO):

  • 断言的使用
  • 魔法常数的使用
  • 使用与方法一致性相关的注释
  • 语句嵌套级别
  • 类依赖
  • 类中的公共字段数
  • 被重写方法的相对数量
  • goto语句的使用

还有更多。我们在代码中保留了那些能给出痛点良好图像的代码。因此,如果这些问题得到纠正,我们会得到直接反馈。

硬数字并不适用于所有解决方案。有些解决方案比另一些更复杂。我会以这些作为你的指导方针,看看你的项目会在哪里结束

但是,具体来说,这些数字似乎相当高。我通常会在我的特定编码风格中发现:

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

这并不是说我从不讨论这些概括性,但我通常在讨论时会更多地考虑代码,因为大多数时候我都可以分解这些内容。

在我看来,对这些值施加数字限制(正如你似乎用数字暗示的那样)不是一个好主意。如果有一个重要的switch语句,那么一个方法中的行数可能会非常大,但该方法仍然简单而正确。如果字段很简单,则类中的字段数可以适当地非常大。有时,五个层次的遗传可能太多了


我认为分析类的内聚性(越多越好)和耦合性(越少越好)更好,但即便如此,我还是怀疑这些度量的实用性。经验通常是一个更好的指南(尽管承认这是昂贵的)。

我个人认为遵守这些类型的要求非常困难(即,有时你真的需要一个超过20行的方法),但本着你问题的精神,我会提到一篇名为“物体健美操”的文章中使用的一些指导原则(如果你感兴趣的话,这篇文章的一部分)


  • 每种方法的压痕等级(正如其他人所说,遵守严格的标准将是困难的。我认为这些指标最有价值的用途之一是观察它们如何随着应用程序的发展而变化。这有助于让您了解随着功能的增加,您在完成必要的重构方面做得有多好,并有助于防止出现大的错误ess:)

    度量管理不适用于人或代码;没有度量或绝对值总是有效的。请不要让对度量的迷恋分散了对代码质量的真正评估。度量可能会告诉您有关代码的重要内容,但它们所能做的最好是暗示需要调查的领域

    这并不是说指标没有用处。指标在变化时最有用,可以寻找可能以意外方式变化的区域。例如,如果您突然从3个继承级别变为15个,或从每个方法4个parms变为12个,请深入研究并找出原因

    示例:用于更新数据库表的存储过程的参数可能与表的列数相同;此过程的对象接口可能具有相同的参数,或者如果存在表示数据实体的对象,则可能具有相同的参数。但数据实体的构造函数可能具有所有这些参数。因此,此过程的度量是什么告诉你?不多!如果在代码库中有足够的类似情况,那么目标平均值将被吹出水面


    因此,不要依赖度量作为任何事情的绝对指标;阅读/审阅代码是无可替代的。

    我在您的列表中没有看到的度量是McCabe的圈复杂度。它度量给定函数的复杂度,并与错误相关。例如,函数的高复杂度分数表示:1)这可能是一个有缺陷的函数,2)可能很难正确修复(例如,修复会引入自己的缺陷)

    归根结底,指标最好在总体层面上使用——比如控制图。您可以查找高于或低于控制限值的点,以确定可能的特殊情况,然后查看详细信息。例如,具有高圈复杂度的函数可能会导致您查看它,但却发现它是合适的,因为它是一个具有许多情况的分派器方法