如何解决多个 "if return" 语句被 sonarqube 报告为重复代码的问题
How to solve multiple "if return" statements being reported as duplicated code by sonarqube
Sonarqube 在有多个 if return 语句时报告重复代码。例如我有以下代码:
private static double computeGain(int rangeMax) {
if (rangeMax <= 35) {
return 6.0;
} else if (rangeMax <= 85) {
return 5.0;
} else if (rangeMax <= 170) {
return 4.0;
} else if (rangeMax <= 340) {
return 3.0;
} else if (rangeMax <= 850) {
return 2.0;
} else if (rangeMax <= 1700) {
return 1.0;
} else if (rangeMax <= 3400) {
return 0.5;
} else if (rangeMax <= 8000) {
return 0.25;
}
return 0.0D;
}
我试过用这样的变量赋值来替换 return,以减少 return 的数量,但无济于事。
删除所有其他内容,因为它们是多余的,也没有用。
我使用两个数组清除了 sonarqube 中的代码味道:
private static double computeGain(int rangeMax) {
int[] thresholds = new int[] { 35, 85, 170, 340, 850, 1700, 3400, 8000 };
double[] gainValues = new double[] { 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.5, 0.25 };
for (int i = 0; i < thresholds.length; i++) {
if (rangeMax <= thresholds[i]) {
return gainValues[i];
}
}
return 0.0D;
}
关于 jfpatenaude 的回答,这是一个很好的解决方案,但最好将范围和增益保持在一起(合并到一个对象)而不是将其保持在两个 tables
static private class RangeGainPair {
int range;
double gain;
public RangeGainPair(int range, double gain) {
this.range = range;
this.gain = gain;
}
public int getRange() {
return range;
}
public double getGain() {
return gain;
}
}
private static List<RangeGainPair> rangeGainList = Stream.of(new RangeGainPair(35, 6d),
new RangeGainPair(85, 5d),
new RangeGainPair(170, 4d),
new RangeGainPair(340, 3d),
new RangeGainPair(850, 2d),
new RangeGainPair(1700, 1d),
new RangeGainPair(3400, 0.5d),
new RangeGainPair(8000, 0.25d))
.collect(Collectors.toList());
private static double computeGain(int rangeMax) {
return rangeGainList.stream().filter(rangeGainPair -> rangeMax <= rangeGainPair.range).findFirst()
.map(RangeGainPair::getGain).orElse(0d);
}
在这种情况下,如果您向范围添加新值,则添加适当的增益值会更容易(例如,如果您想要添加范围 500 和 2.5 增益,则不需要计算逗号)和您拥有的条目越多,在 jfpatenaude 答案中执行此操作就越困难。
您也可以像 jfpatenaude 那样使用 table(例如,因为您不喜欢流或不了解它们,或者使用较低的 java 版本),但是一个,而不是两个。
因为它是常数值,出于性能原因,它只构建列表(或 table)一次,所以在函数之外。
Sonarqube 在有多个 if return 语句时报告重复代码。例如我有以下代码:
private static double computeGain(int rangeMax) {
if (rangeMax <= 35) {
return 6.0;
} else if (rangeMax <= 85) {
return 5.0;
} else if (rangeMax <= 170) {
return 4.0;
} else if (rangeMax <= 340) {
return 3.0;
} else if (rangeMax <= 850) {
return 2.0;
} else if (rangeMax <= 1700) {
return 1.0;
} else if (rangeMax <= 3400) {
return 0.5;
} else if (rangeMax <= 8000) {
return 0.25;
}
return 0.0D;
}
我试过用这样的变量赋值来替换 return,以减少 return 的数量,但无济于事。
删除所有其他内容,因为它们是多余的,也没有用。
我使用两个数组清除了 sonarqube 中的代码味道:
private static double computeGain(int rangeMax) {
int[] thresholds = new int[] { 35, 85, 170, 340, 850, 1700, 3400, 8000 };
double[] gainValues = new double[] { 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.5, 0.25 };
for (int i = 0; i < thresholds.length; i++) {
if (rangeMax <= thresholds[i]) {
return gainValues[i];
}
}
return 0.0D;
}
关于 jfpatenaude 的回答,这是一个很好的解决方案,但最好将范围和增益保持在一起(合并到一个对象)而不是将其保持在两个 tables
static private class RangeGainPair {
int range;
double gain;
public RangeGainPair(int range, double gain) {
this.range = range;
this.gain = gain;
}
public int getRange() {
return range;
}
public double getGain() {
return gain;
}
}
private static List<RangeGainPair> rangeGainList = Stream.of(new RangeGainPair(35, 6d),
new RangeGainPair(85, 5d),
new RangeGainPair(170, 4d),
new RangeGainPair(340, 3d),
new RangeGainPair(850, 2d),
new RangeGainPair(1700, 1d),
new RangeGainPair(3400, 0.5d),
new RangeGainPair(8000, 0.25d))
.collect(Collectors.toList());
private static double computeGain(int rangeMax) {
return rangeGainList.stream().filter(rangeGainPair -> rangeMax <= rangeGainPair.range).findFirst()
.map(RangeGainPair::getGain).orElse(0d);
}
在这种情况下,如果您向范围添加新值,则添加适当的增益值会更容易(例如,如果您想要添加范围 500 和 2.5 增益,则不需要计算逗号)和您拥有的条目越多,在 jfpatenaude 答案中执行此操作就越困难。
您也可以像 jfpatenaude 那样使用 table(例如,因为您不喜欢流或不了解它们,或者使用较低的 java 版本),但是一个,而不是两个。
因为它是常数值,出于性能原因,它只构建列表(或 table)一次,所以在函数之外。