Sonar扫描报错“函数复杂度过高”怎么解决?
我们项目接入了Sonar代码扫描,最近提交时老是被拦住,提示“Function has a complexity of 18 which is greater than 10”。我看了下就是个普通的表单校验函数,用了几个 if-else,但确实嵌套有点多。尝试拆成小函数,但有些逻辑又不好抽离,有没有更合理的处理方式?
比如下面这段代码就被标红了:
function validateForm(data) {
if (data.name) {
if (data.name.length < 2) return false;
if (data.email) {
if (!/^S+@S+$/.test(data.email)) return false;
if (data.phone) {
if (!/^1[3-9]d{9}$/.test(data.phone)) return false;
if (data.agreeToTerms) {
return true;
}
}
}
}
return false;
}
switch语句或者把条件组合成正则表达式来简化。不过这个情况,建议改成平铺结构的检查,像这样:这样不仅降低了复杂度,可读性也好多了,别让Sonar这种工具烦你。
先说说你代码里的问题:
1. 嵌套太深,一层套一层,复杂度直接飙到18
2. 你的正则写错了,
^S+@S+$应该是^S+@S+$,少了反斜杠3. 逻辑其实是串联的(必须同时满足所有条件),根本没必要嵌套
最直接的改法是用尽早返回(early return)把嵌套打平:
这样每个if独立判断,复杂度直接降到1,Sonar保准不报错。
如果你就想拆成独立函数也行,思路是一样的:
这种写法的好处是每个函数职责单一,以后要改某个校验规则也不影响其他部分,而且复杂度都是1,Sonar扫着也舒服。
核心就一句话:嵌套if-else能不用就不用,用 && 连起来或者尽早返回,比啥都强。