每个文件的代码行,每个类的方法,圈复杂度等。开发人员抵制并解决大多数(如果不是全部的话)!它上面有一个很好的Joel article(现在没时间找到它)。
您建议使用哪些代码指标自动识别“糟糕的代码”?
什么可以说服大多数人(你不能说服我们所有人一些蹩脚的指标!:O))开发人员认为这段代码是“垃圾”。
只有可以自动衡量的指标才算计数!
答案 0 :(得分:31)
不是自动化解决方案,但我发现WTF每分钟有用。
(来源: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软件有很多指标。其中一些非常有用:
有更多可行的指标,可以使用工具计算它们。这可以很好地帮助识别糟糕的代码。
答案 8 :(得分:6)
答案 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)
答案 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)
嗯,有各种不同的方法可以指出代码是否是一个好的代码。以下是其中一些:
凝聚力:嗯,代码块,无论是类还是方法,如果发现服务于多个功能,那么可以发现代码的凝聚力较低。凝聚力较低的代码可称为可重用性较低。这可以进一步被称为可维护性较低的代码。
代码复杂性:可以使用McCabe圈复杂度(决策点数)来确定代码复杂性。代码复杂度很高可用于表示可用性较低的代码(难以阅读和理解)。
文档:从代码的可用性角度来看,文档不足的代码也可能导致软件质量低下。
请查看以下页面,了解有关代码审核的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的热闹博客文章可能很有用。