每个文件的代码行、每个类的方法、圈复杂度等等。开发人员抵制并解决大多数(如果不是全部)!有一篇很好的Joel 文章(现在没时间找到)。
您推荐使用哪些代码指标来自动识别“糟糕的代码”?
什么可以说服大多数开发人员(你不能说服我们所有人接受一些糟糕的指标!:O))这段代码是“垃圾”。
只有可以自动测量的指标才有意义!
每个文件的代码行、每个类的方法、圈复杂度等等。开发人员抵制并解决大多数(如果不是全部)!有一篇很好的Joel 文章(现在没时间找到)。
您推荐使用哪些代码指标来自动识别“糟糕的代码”?
什么可以说服大多数开发人员(你不能说服我们所有人接受一些糟糕的指标!:O))这段代码是“垃圾”。
只有可以自动测量的指标才有意义!
不是自动化解决方案,但我发现 WTF 每分钟有用。
(来源:osnews.com)
没有关于编码风格的指标是此类警告的一部分。
对我来说,它是关于代码的静态分析,它可以一直“开启”:
我会将覆盖测试放在第二步,因为这样的测试可能需要时间。
不要忘记,“糟糕”的代码不是通过度量来检测的,而是通过度量的组合和演变(如“趋势”中的)来检测的:请参阅代码度量的魅力是什么?问题。
这意味着您不仅要推荐代码指标来“自动识别“糟糕的代码””,还必须推荐正确的组合和趋势分析来遵循这些指标。
在旁注中,我确实分享了您的挫败感;),并且我不同意 tloach 的观点(在另一个答案的评论中)“问一个模糊的问题,得到一个模糊的答案”他说......你的问题值得一个具体的答案。
我进行构建时编译器发出的警告数。
每行生产代码的注释行数。通常它表示一个不了解版本控制的草率程序员。
开发人员总是关心对他们使用的指标,并且调用“蹩脚”代码并不是一个好的开始。这很重要,因为如果您担心您的开发人员在他们周围玩游戏,那么不要将这些指标用于任何对他们有利/不利的事情。
最好的方法是不要让指标告诉您代码在哪里糟糕,而是使用指标来确定您需要查看的位置。您通过代码审查来查看,如何解决问题的决定是在开发人员和审查人员之间。我也会在开发人员方面对指标出错。如果代码仍然在指标上弹出,但审阅者认为它很好,那就别管它了。
但是,当您的指标开始改善时,请务必牢记这种博弈效应。太好了,我现在有 100% 的覆盖率,但是单元测试有什么好处吗?指标告诉我我没问题,但我仍然需要检查一下,看看是什么让我们到达那里。
归根结底,人类胜过机器。
全局变量的数量。
不存在的测试(由代码覆盖率显示)。这不一定表明代码不好,但它是一个很大的警告信号。
评论中的脏话。
单独的指标并不能识别糟糕的代码。但是,他们可以识别可疑代码。
OO 软件有很多指标。其中一些可能非常有用:
还有更多可行的指标,可以使用工具进行计算。这可以很好地帮助识别糟糕的代码。
我个人最喜欢的警告标志:评论免费代码。通常意味着编码人员没有停下来思考它;再加上它会自动让人难以理解,所以会增加糟糕的比例。
我的赌注:圈复杂度 (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 - 可能的工具(用于 java)和概念解释......寻找 C# 友好工具:(
第一眼:货真价实的成语应用。
仔细一看:程序员的明显错误和误解。
有意义评论的无价值评论数量:
'Set i to 1'
Dim i as Integer = 1
我不相信有任何这样的指标。除了实际上没有做它应该做的代码(这是一个额外的糟糕程度)之外,“糟糕”的代码意味着难以维护的代码。这通常意味着维护者很难理解,这在某种程度上总是一个主观的东西,就像糟糕的写作一样。当然,在某些情况下,每个人都同意写作(或代码)很糟糕,但很难为它写一个度量标准。
再加上一切都是相对的。与没有限制的简单函数相比,代码在最小内存中执行高度复杂的函数并针对每个最后一个速度周期进行优化,看起来会非常糟糕。但这并不糟糕——它只是在做它必须做的事情。
不幸的是,没有我知道的指标。需要记住的是,无论您选择什么,程序员都会对系统进行游戏以使他们的代码看起来不错。我已经看到到处都有任何类型的“自动”指标。
大量与字符串之间的转换。通常,这表明开发人员不清楚正在发生的事情,只是在尝试随机的事情,直到某些事情起作用。例如,我经常看到这样的代码:
object num = GetABoxedInt();
// long myLong = (long) num; // throws exception
long myLong = Int64.Parse(num.ToString());
当他们真正想要的是:
long myLong = (long)(int)num;
我很惊讶没有人提到crap4j。
有时,您只是在看到它时就知道它。例如,今天早上我看到:
void mdLicense::SetWindows(bool Option) {
_windows = (Option ? true: false);
}
我只需要问自己“为什么有人会这样做?”。
代码覆盖率有一定的价值,但除此之外,我倾向于更多地依赖代码分析来判断代码是否糟糕。
包含亵渎的评论与不包含亵渎的评论的比率。
更高 = 更好的代码。
注释行/代码行
value > 1 -> bad (too many comments)
value < 0.1 -> bad (not enough comments)
根据您自己的经验调整数值;-)
我采用多层方法,第一层是合理的可读性,仅由正在解决的问题的复杂性抵消。如果它不能通过可读性测试,我通常认为代码不太好。
TODO:
生产代码中的注释。简单地表明开发人员没有执行任务以完成。
具有 30 个参数的方法。在网络服务上。就这些。
好吧,您可以使用多种不同的方法来指出代码是否是好的代码。以下是其中一些:
内聚性:嗯,代码块,无论是类还是方法,如果被发现提供多种功能,那么可以发现代码的内聚性较低。内聚性较低的代码可以称为可重用性较低。这可以进一步称为可维护性较低的代码。
代码复杂度:可以使用 McCabe 圈复杂度(决策点数)来确定代码复杂度。代码复杂度高可用于表示可用性较低(难以阅读和理解)的代码。
文档:从代码可用性的角度来看,没有足够文档的代码也可以归因于软件质量低下。
查看以下页面以了解代码审查清单。
这篇关于The Code CRAP Metric 的搞笑博文可能很有用。