什么代码指标说服您提供代码是“糟糕”?

时间:2008-10-09 13:42:14

标签: language-agnostic automation metrics software-quality

每个文件的代码行,每个类的方法,圈复杂度等。开发人员抵制并解决大多数(如果不是全部的话)!它上面有一个很好的Joel article(现在没时间找到它)。

您建议使用哪些代码指标自动识别“糟糕的代码”?

什么可以说服大多数人(你不能说服我们所有人一些蹩脚的指标!:O))开发人员认为这段代码是“垃圾”。

只有可以自动衡量的指标才算计数!

27 个答案:

答案 0 :(得分:31)

不是自动化解决方案,但我发现WTF每分钟有用。

WTF's Per Minute
(来源:osnews.com

答案 1 :(得分:29)

没有关于编码风格的指标是这种警告的一部分。

对我而言,它是关于静态分析代码,它可以一直“开启”:

我会在第二步中进行覆盖测试,因为这样的测试需要时间。


不要忘记指标未检测到“蹩脚”代码,而是通过组合 evolution (如“趋势”)指标:请参阅What is the fascination with code metrics?问题。

这意味着您不必仅推荐代码指标来“自动识别”糟糕的代码“”,但您还必须建议正确的组合和趋势分析来遵循这些指标。


在旁注中,我确实分享了你的frustration;),我不同意tloach的观点(在另一个答案的评论中)“问一个模糊的问题,得到一个含糊的答案”他说...你的问题值得一个特定的答案。

答案 2 :(得分:12)

编译时编译器吐出的警告数。

答案 3 :(得分:12)

每行生产代码注释掉的行数。通常它表示一个不懂版本控制的邋program程序员。

答案 4 :(得分:9)

开发人员总是关注针对他们使用的指标,并且调用“糟糕”的代码并不是一个好的开始。这很重要,因为如果您担心开发人员围绕他们进行游戏,那么请不要将指标用于任何对他们有利/不利的事情。

这种方式最有效的方法是不要让指标告诉您代码蹩脚的位置,而是使用指标来确定您需要查看的位置。您可以通过代码审查来查看,并且在开发人员和审阅者之间决定如何解决问题。我也会因开发人员违反指标而出错。如果代码仍然在指标上弹出,但审稿人认为它是好的,请不要管它。

但是,当您的指标开始改善时,请务必牢记这种游戏效果。太好了,我现在有100%的覆盖率,但单位测试有什么好处?该指标告诉我我没事,但我仍然需要检查一下,看看是什么让我们在那里。

最重要的是,人类胜过机器。

答案 5 :(得分:8)

全局变量的数量。

答案 6 :(得分:8)

  • 不存在的测试(由代码覆盖率显示)。它不是必然指示代码是坏的,但它是一个很大的警示标志。

  • 评论中的亵渎。

答案 7 :(得分:7)

单独使用度量标准并不能识别糟糕的代码。但是,他们可以识别可疑代码。

OO软件有很多指标。其中一些非常有用:

  • 平均方法大小(LOC /语句或复杂度)。大型方法可能是糟糕设计的标志。
  • 子类重写的方法数。大量的数字表示糟糕的课程设计。
  • 专业化指数(被覆盖的方法数*嵌套级别/方法总数)。高数字表示类图中可能存在的问题。

有更多可行的指标,可以使用工具计算它们。这可以很好地帮助识别糟糕的代码。

答案 8 :(得分:6)

  • 全局变量
  • 魔术数字
  • 代码/评论比率
  • 重耦合(例如,在C ++中,您可以通过查看类关系或相互交叉包含的cpp /头文件数来衡量这一点
  • const_cast或同一代码库中的其他类型的转换(不是外部库)
  • 大部分代码已注释掉并留在那里

答案 9 :(得分:4)

我个人最喜欢的警告标志:免费注释代码。通常意味着编码人员没有停下来思考它;加上它会让你很难理解,所以提高了比率。

答案 10 :(得分:3)

我敢打赌:自组织复杂度(CC)与自动化测试(TC)的代码覆盖率相结合。

CC | TC

 2 | 0%  - good anyway, cyclomatic complexity too small

10 | 70% - good

10 | 50% - could be better

10 | 20% - bad

20 | 85% - good

20 | 70% - could be better

20 | 50% - bad

...

crap4j - possible tool (for java) and concept explanation ...寻找C#友好工具:(

答案 11 :(得分:3)

乍一看:代码习语的货物崇拜应用。

我一看一眼:程序员明显的错误和误解。

答案 12 :(得分:2)

我很惊讶没有人提到crap4j

答案 13 :(得分:2)

  • 注意Pattern类与标准类的比例。高比率将表明Patternitis
  • 检查未定义为常量的幻数
  • 使用模式匹配实用程序检测可能重复的代码

答案 14 :(得分:2)

许多与字符串之间的转换。一般来说,这表明开发人员并不清楚发生了什么,只是尝试随机的东西,直到有效。例如,我经常看到这样的代码:

   object num = GetABoxedInt();
//   long myLong = (long) num;   // throws exception
   long myLong = Int64.Parse(num.ToString());

当他们真正想要的是:

   long myLong = (long)(int)num;

答案 15 :(得分:2)

不幸的是,没有我知道的指标。要记住的是,无论你选择什么,程序员都会对系统进行游戏以使代码看起来很好。我已经看到,任何地方都会出现任何类型的“自动”指标。

答案 16 :(得分:2)

我不相信有这样的指标。除了代码实际上没有做到它应该做的事情(这是一个额外的疯狂程度)'糟糕'代码意味着难以维护的代码。这通常意味着维护者很难理解,这在某种程度上总是一个主观的东西,就像糟糕的写作一样。当然,有些情况下,每个人都认为写作(或代码)很糟糕,但很难为它编写指标。

另外一切都是相对的。代码执行高度复杂的功能,在最小的内存中,针对每个最后的速度周期进行了优化,与没有限制的简单功能相比,看起来非常糟糕。但它并不蹩脚 - 它只是在做它必须做的事情。

答案 17 :(得分:2)

对有意义的评论毫无价值的评论:

'Set i to 1'
Dim i as Integer = 1

答案 18 :(得分:1)

有时候,当你看到它时,你就会知道它。例如,今天早上我看到了:

void mdLicense::SetWindows(bool Option) {
  _windows = (Option ? true: false);
}

我只是问自己'为什么有人会这样做?'。

答案 19 :(得分:0)

生产代码中的

TODO: 条评论。只是表明开发人员没有完成任务。

答案 20 :(得分:0)

包含30个参数的方法。在Web服务上。就是这样。

答案 21 :(得分:0)

嗯,有各种不同的方法可以指出代码是否是一个好的代码。以下是其中一些:

  1. 凝聚力:嗯,代码块,无论是类还是方法,如果发现服务于多个功能,那么可以发现代码的凝聚力较低。凝聚力较低的代码可称为可重用性较低。这可以进一步被称为可维护性较低的代码。

    1. 代码复杂性:可以使用McCabe圈复杂度(决策点数)来确定代码复杂性。代码复杂度很高可用于表示可用性较低的代码(难以阅读和理解)。

    2. 文档:从代码的可用性角度来看,文档不足的代码也可能导致软件质量低下。

  2. 请查看以下页面,了解有关代码审核的checklist

答案 22 :(得分:0)

我采用多层方法,第一层是合理的可读性,只能通过所解决问题的复杂性来抵消。如果它无法通过可读性测试,我通常会认为代码不够好。

答案 23 :(得分:0)

评论行/代码行

value > 1 -> bad (too many comments)

value < 0.1 -> bad (not enough comments)

根据您自己的经验调整数值; - )

答案 24 :(得分:0)

包含亵渎的评论与不支持亵渎的评论的比率。

更高=更好的代码。

答案 25 :(得分:0)

代码覆盖率有一些价值,但除此之外,我倾向于更多地依赖代码分析来判断代码是否很糟糕。

答案 26 :(得分:-1)

这篇关于The Code C.R.A.P Metric的热闹博客文章可能很有用。